【问题标题】:solver parameter 'test_iter' changes label values during test phase求解器参数“test_iter”在测试阶段更改标签值
【发布时间】:2015-08-11 04:58:10
【问题描述】:

我正在使用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_sizetest_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_sizetest_iter 的使用错误,还是我遗漏了其他东西?

【问题讨论】:

    标签: machine-learning neural-network deep-learning caffe


    【解决方案1】:

    输出日志中显示的结果是迭代的平均值,因此如果您有 2 个迭代标签,其中一个的平均值为 0.5。

    因此,如果批量大小为 1024,则显示 1024 个输出,一切正常。当批量大小为 512 时,您只显示 512 个输出,每个输出是 i-th 和 i+512-th 标签这两个标签的平均值,大多数情况下标签不在内部.

    为了验证这一点,您可以安排您的测试数据,使标签 1 放置在均匀的位置,因此在更改 batch_size 时,标签 1 仍然一致,您应该得到准确的 1 用于输出。

    【讨论】:

    • 我是否可以安全地假设在每次迭代期间一切都很好并且没有改变?
    • @MaartenBamelis 你可以信任 Caffe。您可能还想考虑 Nvidia 的 DIGITS 接口:
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-22
    • 2017-11-06
    • 2014-03-09
    相关资源
    最近更新 更多