1

私はCaffeフレームワークを使用して、畳み込みニューラル ネットワークの構築と研究を行っています。

私は (私がそう信じている) バグを偶然発見しました。(すでにGithubで報告済みです。)

これが問題です。test_iterテスト フェーズ中に、パラメーターの値 (ソルバー.prototxtファイルで定義)に応じてラベルの値が変更されます。


ネットワークのトレーニングとテストに 10240 枚の画像を使用しています。各画像には 38 個のラベルがあり、各ラベルには 2 つ (0 または 1) の値を設定できます。HDF5 ファイル形式を使用して、画像データとラベルを Caffe に取り込みます。各ファイルには、1024 個の画像とそれぞれのラベルが保存されます。(HDF5 ファイルを確認しましたが、すべて正しいです。)

トレーニングには 9216 (= 9 ファイル) の画像を使用し、テストには 1024 (= 1 ファイル) の画像を使用しています。私の Nvidia 540M グラフィック カードには 1 GB のメモリしかないため、バッチで処理する必要があります (通常、バッチごとに 32 または 64 の画像)。

問題を再現するために、次のネットワークを使用しています。

# in file "BugTest.prototxt"
name: "BugTest"
layer {
    name: "data"
    type: "HDF5Data"
    top: "data"
    top: "label"
    hdf5_data_param {
        source: "./convset_hdf5_train.txt"
        batch_size: 32
    }
    include {
        phase: TRAIN
    }
}
layer {
    name: "data"
    type: "HDF5Data"
    top: "data"
    top: "label"
    hdf5_data_param {
        source: "./convset_hdf5_test.txt"
        batch_size: 32
    }
    include {
        phase: TEST
    }
}
layer {
    name: "silence"
    type: "Silence"
    bottom: "data"
}

このネットワークは、すべてのラベル値を単純に出力します。このネットワークには次のソルバーを使用しています: (ほとんどは実際のネットワークからコピーしたものです)。

# In file "BugTest_solver.prototxt"
net: "BugTest.prototxt"
test_iter: 32
test_interval: 200
base_lr: 0.0001
momentum: 0.90
weight_decay: 0.0005
lr_policy: "inv"
gamma: 0.0001
power: 0.75
display: 100
max_iter: 10000
snapshot: 5000
snapshot_prefix: "./bt"
solver_mode: GPU

batch_sizeおよびtest_iterパラメータを変更することにより、次の結果が得られました。このチュートリアルによるとbatch_size、テスト データとtest_iterソルバーのバランスをとって、テスト中にすべてのテスト サンプルが使用されるようにする必要があります。私の場合、それを確認しbatch_size * test_iter = 1024ます。

これらは、値を変更したときの私の結果です:
batch_size = 1024, test_iter = 1 : すべて問題ありません。
batch_size = 512, test_iter = 2: 「1」だったラベルが「0.50」に変更されました。
batch_size = 256, test_iter = 4: '1' だったラベルが '0.50' または '0.25' に
batch_size = 128, test_iter = 8変更されました : '1' だったラベルが '0.50' または '0.25' または '0.125' に変更されました
[...]:


テスト中にラベルの値に影響を与える何が起こっていますか? batch_sizeの使用と間違った解釈をしているだけtest_iterですか、それとも何か他のものを見逃していますか?

4

1 に答える 1

1

出力ログに表示される結果は反復の平均であるため、1 つの反復ラベルが 2 つある場合、平均は 0.5 になります。

したがって、バッチ サイズが 1024 の場合、1024 個の出力が表示され、すべて問題ありません。バッチ サイズが 512 の場合、512 個の出力しか表示されず、それぞれが- 番目と - 番目のラベルの 2 つのラベルの平均であり、ほとんどの場合、ラベルが一緒に含まれていません。ii+512

これを確認するには、ラベル 1 が偶数の場所に配置されるようにテスト データを配置できます。そのため、batch_size を変更してもラベル 1 は一致し、正確に 1 が出力されるはずです。

于 2015-05-29T09:03:45.257 に答える