Caffe:使用 ImageData 层在批内平衡 类

Caffe: Balancing classes inside batch with ImageData layer

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

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

对此,我有两个疑惑:

1。 .txt 文件中的批次 sampled/selected 是怎样的?

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

另一种方法是从 class 和 N/2[=36= 中随机抽样 N/2 个示例] 来自另一个,但我不认为 Caffe 会这样做。

2。 .txt 文件中示例的顺序对批处理的构建方式有影响吗?

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

感谢您的帮助!

(1) 是的,shuffle 将随机化输入示例的顺序,提供 示例被适当地描述——例如用换行符将句子分成单独的例子。 Caffe 不会通过 class.

来平衡每个批次

这对训练的影响很小,但在长期 运行 中应该是平衡的。重要的是让每个例子在每个时期只出现一次。

(2) 预平衡无关紧要:shuffle 根据需要更改顺序(随机数生成)。

您有两个选择:

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

2- 即时创建您自己的批次:在 python 中,您可以创建自己的批次作为 numpy 数组并将其馈送到网络中。检查 以了解如何使用 python 界面输入数据。在这种情况下,您可以创建满足您需要的任何批次,也可以对其进行平衡。使用部署解决方案(给定 post 中的第三个解决方案)时,您可以按如下方式输入数据: 使用部署版本时,您可以像这样为您的网络设置输入数据:

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

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