2016-05-03 46 views
3

我試圖讓我的分類過程更快一點。我想增加我的deploy.prototxt中的第一個input_dim,但這似乎不起作用。它甚至比逐一分類每個圖像慢一點。批量大小不適用於caffe with deploy.prototxt

deploy.prototxt

input: "data" 
input_dim: 128 
input_dim: 1 
input_dim: 120 
input_dim: 160 
... net description ... 

蟒蛇淨初始化

net=caffe.Net('deploy.prototxt', 'model.caffemodel', caffe.TEST) 
net.blobs['data'].reshape(128, 1, 120, 160) 
transformer = caffe.io.Transformer({'data':net.blobs['data'].data.shape}) 
#transformer settings 

蟒蛇分類

images=[None]*128 
for i in range(len(images)): 
    images[i]=caffe.io.load_image('image_path', False) 
for j in range(len(images)): 
    net.blobs['data'].data[j,:,:,:] = transformer.preprocess('data',images[j]) 
out = net.forward()['prob'] 

我跳過一些細節,但更重要的事情應該放在首位。我嘗試了不同的批量大小,例如32,64,...,1024但都幾乎相同。所以我的問題是,如果有人知道我做錯了什麼或需要改變什麼? 感謝您的幫助!

編輯:
一些計時結果,平均時間只是處理圖像(1044)分配的總時間。

批量大小:1

2016年5月4日10:51:20721 - 檢測器 - INFO - 數據形狀:(1,1,120,160)
2016年5月4日10: 51:35149 - - INFO - GPU定時:
2016年5月4日10:51:35149 - - INFO - 處理的圖像:1044
2016年5月4日10:51:35149 - 主要 - 信息 - 總時間:14.43s
2016-05-04 10 :51:35149 - - INFO - 平均時間:13.82ms
2016年5月4日10:51:35149 - - INFO - 負載時間:8.31s
2016年5月4日10 :51:35149 - - INFO - 平均的負載時間:7.96ms
2016年5月4日10:51:35149 - - INFO - 分類 - 時間:5.99s
2016-05- 04 10:51:35,149 - main - INFO - avg-classify-time:5.74ms

批量大小:32

2016年5月4日10:52:30773 - 檢測器 - INFO - 數據形狀:(32,1,120,160)
2016年5月4日10:52:45135 - - INFO - GPU定時:
2016年5月4日10:52:45135 - - INFO - 處理的圖像:1044
2016年5月4日10:52:45135 - - INFO - 總時間:14.36s
2016-05-04 10:52:45,136 - 主要 - 信息 - 平均時間:13.76米s
2016-05-04 10:52:45,136 - main - INFO - 加載時間:7。13S
2016年5月4日10:52:45136 - - INFO - 平均的負載時間:6.83ms
2016年5月4日10:52:45136 - - INFO - 分類 - 時間:7.13s
2016年5月4日10:52:45136 - - INFO - 平均-分類時間:6.83ms

批量大小:128

2016-05- 04 10:53:17,478 - 檢測器 - 信息 - 數據形狀:(128,1,12 0,160)
2016年5月4日10:53:31299 - - INFO - GPU定時:
2016年5月4日10:53:31299 - - INFO - 處理的圖像:1044
2016年5月4日10:53:31299 - - INFO - 總時間:13.82s
2016年5月4日10:53:31299 - - INFO - 平均時間:13.24ms
2016-05-04 10:53:31,299 - main - INFO - 加載時間:7.06s
2016-05-04 10:53:31,299 - 主 - INFO - 平均的負載時間:6.77ms
2016年5月4日10:53:31299 - - INFO - 分類 - 時間:6.66s
2016年5月4日10時53分: 31299 - - INFO - 平均-分類時間:6.38ms

批量大小:1024

2016年5月4日10:54:11546 - 檢測器 - INFO - 數據形狀: (1024,1,120,160)
2016-05-04 10:54:25,316 - - INFO - GPU定時:
2016年5月4日10:54:25316 - - INFO - 處理的圖像:1044
2016年5月4日10:54:25316 - - INFO - 總時間:13.77s
2016年5月4日10:54:25316 - - INFO - 平均時間:13.19ms
2016年5月4日10:54:25316 - - INFO - 加載時間:7.04s
2016-05-04 10:54:25,316 - 主要 - 信息 - 平均加載時間:6.75ms
2016年5月4日10:54:25316 - - INFO - 分類 - 時間:6.63s
2016年5月4日10:54:25316 - - INFO - 平均-分類時間: 6.35ms

+0

您使用的GPU或CPU? – Shai

+0

我正在使用GPU:nvidia GTX980 Ti – Feuerteufel

+2

你是什麼意思「幾乎相同」?無論'batch_size'如何,'net.forward()'的運行時間是相同的,或者'batch_size'的運行時間*劃分是「幾乎相同」?你可以在這裏輸入一些數字嗎? – Shai

回答

0

我敢肯定,問題是出在線路

for j in range(len(images)): 
net.blobs['data'].data[j,:,:,:] = transformer.preprocess('data',images[j]) 
out = net.forward()['prob'] 

這樣做會簡單地從for循環作爲網絡的唯一輸入最後一次迭代設置單個圖像數據。先試堆疊N圖像(比如stackedimages)並調用線只有一次e.g

for j in range(len(images)): 
stackedimages <- transformer.preprocess('data',images[j]) 

然後調用,

net.blobs['data'].data[...] = stackedimages 
+0

我不認爲這是一個問題。在每次迭代時,設置一個不同的'['data']。data'片段,並且僅在所有片段被分配後調用forward()。 – Shai

+2

我與@Shai。在'['data']。data'中,每個索引j應該在for循環的末尾有適當的變換圖像。儘管如此,我仍然有一個問題:'stackedimages'需要什麼數據結構? Atm所有的圖像都在列表中,但是可能會發生變化。或者'net.blobs ['data']。data [...] = images'是可能的? – Feuerteufel

+0

啊,是的,我明白了。你是對的。 'net.blobs ['data']。data [...] = images'如果'images'全部已經被轉換就可以正常工作。只要確保它們被適當堆疊以形成相同尺寸的4d斑點 – Prophecies