私は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
ですか、それとも何か他のものを見逃していますか?