求解器参数'test_iter'在测试阶段更改标签值

时间:2015-05-28 15:20:55

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

我正在使用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参数获得了以下结果。根据{{​​3}}教程,测试数据的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错误,或者我错过了其他内容?

1 个答案:

答案 0 :(得分:1)

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

因此,如果批量大小为1024,则显示1024个输出,一切正常。批量大小为512时,您只显示512个输出,每个是平均两个标签i - 和i+512 - 标签,标签的大多数可能性不合作。

要验证这一点,您可以安排测试数据,使标签1放置在偶数位置,因此在更改batch_size时,标签1仍然重合,输出应该正好为1。