【问题标题】:Caffe: Balancing classes inside batch with ImageData layerCaffe:使用 ImageData 层平衡批处理内的类
【发布时间】:2016-09-06 18:48:30
【问题描述】:

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

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

对此,我有两个疑问:

1.如何从 .t​​xt 文件中采样/选择批次?

它是通过获取文件的前 N 个示例(假设 N 是批量大小)、将它们改组并将它们馈送到网络来构建的吗?从这个意义上说,批次本身可能不平衡。这会影响训练/微调吗?

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

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

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

感谢您的帮助!

【问题讨论】:

    标签: machine-learning caffe pycaffe


    【解决方案1】:

    (1) 是的,shuffle 将随机化输入示例的顺序,假设示例被适当地描绘——例如使用换行符将句子分成单独的例子。 Caffe 不会费心按类平衡每个批次。

    这对训练的影响很小,但从长远来看应该会平衡。重要的是每个示例在每个 epoch 中准确呈现一次。

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

    【讨论】:

    • 很高兴知道,@Prune!非常感谢您的回答!
    • 很高兴为您提供帮助。感谢您接受答案——这有助于正确存档问题。
    【解决方案2】:

    你有两个选择:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-12-06
      • 1970-01-01
      • 1970-01-01
      • 2018-07-21
      • 2018-03-27
      • 2020-06-27
      • 2023-03-17
      相关资源
      最近更新 更多