2016-05-03 13 views
3

私の分類プロセスを少し速くしようとしています。私はdeploy.prototxtの最初のinput_dimを増やすことを考えましたが、それはうまくいかないようです。各画像を1つずつ分類するよりも少し遅いです。deploy.prototxtでcaffeのバッチサイズが機能しない

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 

Pythonの分類

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.43秒
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 - メイン - INFO - 平均分類時間: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 - - 情報 - 合計時間:14.36秒
2016-05-04 10:52:45,136 - メイン - 情報量 - 平均:13.76m s
2016-05-04 10:52:45,136 - メイン - 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 - メイン - 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:25316-メイン - 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は - 平均時間は: - メイン - INFO 25316:54:
2016年5月4日10 13.19ms - 読み込み時間:7.04秒
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

を呼びますか? – Shai

+0

私はGPUを使用しています:nvidia GTX980 Ti – Feuerteufel

+2

"すべてほぼ同じ"とはどういう意味ですか? 'net.forward()'の実行時間は 'batch_size'に関係なく同じか、' batch_size'でランタイム*を*分割したものは "ほぼ同じ"ですか?ここに数字を入れてもいいですか? – Shai

答えて

0

私はこの問題は、単にネットワークの唯一の入力として、forループの最後の繰り返しから単一の画像データを設定しますこれを行うライン

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

であるかなり確信しています。事前にN画像(たとえばstackedimages)を積み重ね、例えば、一度だけ

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

を行を呼び出してみてくださいそして、あなたはGPUやCPUを使用している、

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

私はこれが問題ではないと思います。各反復で、 '['data'] .data'の異なるスライスが設定され、すべてのスライスが割り当てられた後でのみ' forward() 'が呼び出されます。 – Shai

+2

私は@Shaiと一緒です。 '['data']。data'では、各インデックスjは、forループの最後に適切に変換されたイメージを持つ必要があります。 しかし、私は疑問を持っています。「積み重ねられた画像」に必要なデータ構造は何ですか?すべての画像はリストにありますが、変更が可能です。あるいは 'net.blobs ['data']。data [...] = images'は可能でしょうか? – Feuerteufel

+0

ああ、そうだよ。あなたが正しいです。 'net.blobs ['data']。データ[...] = images'は' images'が既に変換されていれば正常に動作します。それらが適切に積み重なって、同じ次元の4つのブロブを形成するようにしてください – Prophecies

関連する問題