Caffe:使用ImageData层在批处理中 balancer 类

我正在Caffe中训练CNN,其输出是两个类中的一个(二进制问题) .

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

对此,我有两个疑问:

1. How the batch is sampled/selected from the .txt files?

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

另一种方法是从一个类中随机抽取N / 2个例子,从另一个类中随机抽取N / 2,但我不认为Caffe会这样做 .

2. The order of the examples in the .txt files matter to how the batch is constructed?

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

谢谢你的帮助!

回答(2)

3 years ago

(1)是的, shuffle 将随机化输入示例的顺序,前提是示例被适当地描绘 - 例如使用换行符将句子分成单独的示例 . Caffe并不打算按 class balancer 每批次 .

这对培训影响很小,但从长远来看应该是均匀的 . 重要的是让每个例子每个时期准确呈现一次 .

(2)预 balancer 无关紧要: shuffle 按其认为合适的方式更改顺序(随机数生成) .

3 years ago

你有两个选择:

1-预先 balancer 数据,并禁用随机播放 .

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

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

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