求解器参数 'test_iter' 在测试阶段更改标签值
solver parameter 'test_iter' changes label values during test phase
我正在使用 Caffe 框架构建和研究卷积神经网络。
我偶然发现了(我认为是)一个错误。 (我已经在 Github 上报告过了。)
问题所在: 在测试阶段,标签值会根据 test_iter
参数的值(在求解器 .prototxt
中定义)而改变文件)。
我正在使用 10240 张图像来训练和测试网络。每个图像有 38 个标签,每个标签可以有两个(0 或 1)值。我正在使用 HDF5 文件格式将我的图像数据和标签导入 Caffe;每个文件存储 1024 张图像及其各自的标签。 (我检查了 HDF5 文件,那里的一切都是正确的。)
我使用 9216(= 9 个文件)图像进行训练,使用 1024(= 1 个文件)图像进行测试。我的 Nvidia 540M 显卡只有 1GB 内存,这意味着我必须批量处理(通常每批处理 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
参数得到以下结果。根据 this 教程,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
的使用是错误的,还是我还漏掉了什么吗?
输出日志中显示的结果是迭代的平均值,因此如果您有 2 次迭代标签,其中一个标签的平均值为 0.5。
因此,如果批量大小为 1024,则显示 1024 个输出,一切正常。当批量大小为 512 时,您只显示 512 个输出,每个输出是两个标签的 平均值 ,第 i
个和第 i+512
个标签,大多数机会标签不在里面。
为了验证这一点,您可以安排您的测试数据,使标签 1 放置在偶数位置,因此当更改 batch_size 时,标签 1 仍然重合,您应该准确地得到输出 1。
我正在使用 Caffe 框架构建和研究卷积神经网络。
我偶然发现了(我认为是)一个错误。 (我已经在 Github 上报告过了。)
问题所在: 在测试阶段,标签值会根据 test_iter
参数的值(在求解器 .prototxt
中定义)而改变文件)。
我正在使用 10240 张图像来训练和测试网络。每个图像有 38 个标签,每个标签可以有两个(0 或 1)值。我正在使用 HDF5 文件格式将我的图像数据和标签导入 Caffe;每个文件存储 1024 张图像及其各自的标签。 (我检查了 HDF5 文件,那里的一切都是正确的。)
我使用 9216(= 9 个文件)图像进行训练,使用 1024(= 1 个文件)图像进行测试。我的 Nvidia 540M 显卡只有 1GB 内存,这意味着我必须批量处理(通常每批处理 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
参数得到以下结果。根据 this 教程,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
的使用是错误的,还是我还漏掉了什么吗?
输出日志中显示的结果是迭代的平均值,因此如果您有 2 次迭代标签,其中一个标签的平均值为 0.5。
因此,如果批量大小为 1024,则显示 1024 个输出,一切正常。当批量大小为 512 时,您只显示 512 个输出,每个输出是两个标签的 平均值 ,第 i
个和第 i+512
个标签,大多数机会标签不在里面。
为了验证这一点,您可以安排您的测试数据,使标签 1 放置在偶数位置,因此当更改 batch_size 时,标签 1 仍然重合,您应该准确地得到输出 1。