【问题标题】:Caffe only trains for one labelCaffe 只训练一个标签
【发布时间】:2016-02-21 01:40:47
【问题描述】:

这真的很奇怪。我正在实现这个模型:

除了我使用 ImageData blob 从文本文件中读取数据之外,batch_size: 1. 只有两个标签,并且文本文件像往常一样组织

/home/.../pathToFile 0
...
/home/.../pathToFile 1

不过,Caffe 只训练和测试标签 0!

我使用常规工具运行 caffe。

./build/tools/caffe train --solver=solver.prototxt

当我在 pycaffe 中打开网络时,我第一次收到这条消息:

WARNING: Logging before InitGoogleLogging() is written to STDERR

和大小 net.blobs['label'].data 现在是 1,什么时候应该是 2!

不仅如此,该标签似乎是浮点数而不是整数。

In: net.blobs['label'].data
Out: array([ 0.], dtype=float32)

我知道这曾经有效,但我无法理解我做错了什么或从哪里开始排除故障。

【问题讨论】:

  • 如果您的batch_size 为1,您希望label 的形状是什么??
  • 在我更改了 batch_size 之后,标签获得了正确数量的元素。谢谢你,夏!但是,net.forward 仍然输出一个长度为 1 的向量。
  • 它输出损失,这是一个标量,与输入大小无关。
  • 你可以用一个简单的 Softmax 层替换 SoftmaxWithLoss 层来获得每个输入的类概率
  • 好的!谢谢你,Shai!

标签: machine-learning neural-network computer-vision deep-learning caffe


【解决方案1】:

你的网络的输出形状取决于输入batch_size:如果你定义batch_size: 1,那么你的网络每次处理一个单个示例,因此它只读取一个label。如果将batch_size 更改为 2,caffe 将读取两个样本,因此label 的形状将变为 2。
这个“形状规则”的一个例外是损失输出:损失定义了一个 标量 函数,用于计算梯度。因此,无论输入形状如何,损失输出始终是标量。

关于label的数据类型:Caffe将所有变量存储在float32类型的“Blobs”中。

【讨论】: