据我所知,有两种方法可以获得验证损失。
(1) 在训练过程中通过设置求解器在线获取,如下所示:train_net: 'train.prototxt'
test_net: "test.prototxt"test_iter: 200test_interval: 100
(2) 基于.caffemodel文件中的权重离线计算。由于GPU资源有限,本问题采用第二种方法。首先,我通过snapshot: 100
在每100次迭代后保存网络权重到.caffemodel文件。基于这些.caffemodel文件,我希望计算验证损失
../build/tools/caffe test -model ./test.prototxt -weights $snapshot -iterations 10 -gpu 0
其中snapshot
是.caffemodel文件的文件名。例如snap_network_100.caffemodel
我的测试prototxt文件中的数据层如下
layer { name: "data" type: "HDF5Data" top: "data" top: "label" include { phase: TEST } hdf5_data_param { source: "./list.txt" batch_size: 8 shuffle: true }}
第一种和第二种方法给出的验证损失不同。我发现第一种方法的验证损失与批次大小无关。这意味着在不同的批次大小下验证损失是相同的。而第二种方法,验证损失随批次大小变化,但不同迭代下的损失非常接近。
我的问题是,哪种方法计算验证损失是正确的?
回答:
您在计算验证损失时使用了不同的迭代次数:
test_iter: 200
在您的'solver.prototxt'
中,与命令行运行时的-iterations 10
相比。这意味着您是在不同数量的验证样本上平均计算损失。
由于在命令行验证时使用了远少的样本,您对批次大小更加敏感。
请确保使用完全相同的设置,并验证验证损失确实相同。