Caffe:使用ImageData层

时间:2016-09-06 18:48:31

标签: machine-learning caffe pycaffe

我正在Caffe中训练CNN,其输出是两个类别之一(二元问题)。

我使用ImageData图层作为输入图层,传递两个带有训练和验证图像集的 .txt 。这些文件是平衡的,,两个类的示例数相同。在这一层中,我也使用了“shuffle”参数。

对此,我有两个疑问:

1。如何从.txt文件中采样/选择批次?

是通过获取文件的第一个 N 示例(假设N是批量大小)构建它,将它们混洗并将它们提供给网络吗?从这个意义上说,批次本身可能不平衡。这会影响培训/微调吗?

另一种方法是从一个类中随机采样 N / 2 示例,从另一个类中随机采样 N / 2 ,但我不认为Caffe会这样做。< / p>

2。 .txt文件中示例的顺序与批处理的构建方式有关?

以批量平衡的方式构建.txt文件是否是一个好主意(例如,每个奇数行是一个类,每个偶数是另一个类)?

感谢您的帮助!

2 个答案:

答案 0 :(得分:2)

(1)是的, shuffle 将随机化输入示例的顺序,提供示例被恰当地描绘 - 例如使用换行符将单独的句子分开例子。 Caffe并不打算按班级平衡每一批。

这对训练有轻微影响,但从长远来看应该是均匀的。重要的是让每个例子每个时期准确呈现一次。

(2)预平衡无关紧要: shuffle 按其认为合适的方式更改订单(随机数生成)。

答案 1 :(得分:2)

您有两种选择:

1-预先平衡数据,并禁用随机播放。

2-动态创建自己的批次:在python中,您可以创建自己的批次作为numpy阵列并将其提供给网络。检查this post以查看如何使用python接口输入数据。在这种情况下,您可以创建满足您需求的任何批次,也可以平衡它。使用部署解决方案(给定帖子中的第3个解决方案)时,您可以按如下方式提供数据: 使用部署版本时,您可以设置网络的输入数据,如下所示:

x = data;
y = labels;
solver.net.blobs['data'].data[...] = x
net.blobs['label'].data[...] = y

然后,您可以调用solver.net.step(1)运行网络一次迭代(转发+反向传播)。