2016-08-31 8 views
1

python内で画像+ラベルのバッチを読み込み、ネットワークを鍛えるために使用しようとするといくつか問題があります。 私は画像のペアを使って作業しています。たとえば、両方の画像から等価なピクセルを平均化して1つに変換し、それをネットワークに送ります。ペアの数が大きすぎる(個々のイメージを2つずつ組み合わせて)、すべてをメモリに格納するため、各繰り返しで各バッチを作成しています。ネットワークに渡したいと思います。入力ネットワーク層がで定義されているCaffe:微調整のためにpython内に画像とラベルをロード

solver = caffe.get_solver(path_to_solver_file) 

:私の以前の実験では

layer { 
    name: "data" 
    type: "ImageData" 
    top: "data" 
    top: "label" 
    include { 
    phase: TRAIN 
    } 
    image_data_param { 
    batch_size: 1 
    new_height: 227 
    new_width: 227 
    } 
} 
layer { 
    name: "data" 
    type: "ImageData" 
    top: "data" 
    top: "label" 
    include { 
    phase: TEST 
    } 
    image_data_param { 
    batch_size: 1 
    new_height: 227 
    new_width: 227 
    } 
} 

が、私はimage_data_param内ソースパラメータを持っていた

私はこの方法でネットワークをインスタンス化しています、私は画像とラベルのファイルをトレーニングとテストの両方に渡します。私のpython内でそれらをロードするよう はしかし、私はソースパラメータを削除しますが、次のエラーを得た:

0830 17:01:49.014819 1967923200 layer_factory.hpp:77] Creating layer data 

I0830 17:01:49.014858 1967923200 net.cpp:91] Creating Layer data 

I0830 17:01:49.014868 1967923200 net.cpp:399] data -> data 

I0830 17:01:49.014890 1967923200 net.cpp:399] data -> label 

I0830 17:01:49.014910 1967923200 image_data_layer.cpp:38] Opening file 

I0830 17:01:49.014935 1967923200 image_data_layer.cpp:53] A total of 0 images. 

Segmentation fault: 11 

私はまだこの時点になっていないが、私はインスタンス化することができるよ後ネットワーク、私はバッチをロードして使用してSGDの最適化の一歩を実行するつもりだった。

net.blobs["data"].data[...] = images 
net.blobs["label"].data[...] = labels 
net.step(1) 

私のpythonを使用して微調整とテストを行う例やチュートリアル(例えば、herehere)で検索しましたしかし、大多数は試験段階の間に往路についてのみ論じるが、ネットワークを微調整すると、ソースパラメータを使ってトレーニングデータ(ラベルや画像)を定義し、Pythonインタフェースから直接ロードすることはできません。

+0

この回答を確認してください: http://stackoverflow.com/a/39097123/5465000 – AHA

答えて

1

レイヤーImageDataは、各行の画像のアドレスを保持するテキストファイルからのみ画像を読み取ることができます。 ImageDataレイヤーを使用して、その場で画像をフィードすることはできません。

オンザフライで画像を読み込むには、linkをチェックアウトしてください。より柔軟で柔軟な展開バージョン(その記事で説明されている3番目のオプション)を使用することをお勧めします。

配備バージョンを使用している場合、あなたはこのようなネットワークの入力データを設定することができます。

x = data; 
y = labels; 
solver.net.blobs['data'].data[...] = x 
net.blobs['label'].data[...] = y 

その後、あなたはどちらかだけの出力を参照してくださいにsolver.net.forward()を呼び出すことができます。 またはsolver.net.step(1)に電話して、前方と後方を実行することができます(1回の反復のための列車)。

+0

こんにちは、@AHA、あなたの答えをありがとう。しかし、私は2つの質問があります: (1)展開版を使用しても、ネットワークを微調整するために使用できますか? (2)そうなら、どのようにデータをこれらのレイヤーに渡すのですか?私はポストでやったことに似ていますか? – rafaspadilha

+0

はい、あなたの投稿で行ったことに似ています。私はそれを明確にするために私の答えを編集し、延長しました。 – AHA

+0

その良いニュース!コードを変更する必要はありません。私はそれを試してみると、私は戻って報告します!もう一度@AHAありがとう! – rafaspadilha

関連する問題