HDF5 中的 Caffe 分类标签

Posted

技术标签:

【中文标题】HDF5 中的 Caffe 分类标签【英文标题】:Caffe classification labels in HDF5 【发布时间】:2017-04-22 13:34:10 【问题描述】:

我正在微调网络。在特定情况下,我想将其用于回归,这很有效。在另一种情况下,我想将其用于分类。

对于这两种情况,我都有一个带有标签的 HDF5 文件。使用回归,这只是一个包含浮点数的 1×1 numpy 数组。在将 EuclideanLoss 层更改为 SoftmaxLoss 后,我认为可以使用相同的标签进行分类。但是,我得到了一个负损失:

    Iteration 19200, loss = -118232
    Train net output #0: loss = 39.3188 (* 1 = 39.3188 loss)

你能解释一下,如果出了什么问题?我确实看到训练损失大约是 40(这仍然很糟糕),但是网络仍然训练吗?负损失只会越来越负。

更新 看完Shai's comment和answer后,我做了以下改动: - 我制作了最后一个全连接层 6 的 num_output,因为我有 6 个标签(以前是 1 个)。 - 我现在创建一个 one-hot 向量并将其作为标签传递到我的 HDF5 数据集中,如下所示

    f['label'] = numpy.array([1, 0, 0, 0, 0, 0])        

现在尝试运行我的网络返回

   Check failed: hdf_blobs_[i]->shape(0) == num (6 vs. 1)       

经过网上的一些研究,我将向量重新整形为 1x6 向量。这会导致以下错误:

  Check failed: outer_num_ * inner_num_ == bottom[1]->count() (40 vs. 240) 
   Number of labels must match number of predictions; e.g., if softmax axis == 1 
   and prediction shape is (N, C, H, W), label count (number of labels) 
   must be N*H*W, with integer values in 0, 1, ..., C-1.

我的想法是为每个数据集(图像)添加 1 个标签,并在我的 train.prototxt 中创建批次。这不应该创建正确的批量大小吗?

【问题讨论】:

SoftmaxWithLoss 层之前的层的num_output 是什么? @Shai num_output 在我提出这个问题时为 1 【参考方案1】:

由于您从回归转向分类,因此您需要输出的不是标量来与 "label" 进行比较,而是输出长度为 num-labels 的概率向量来与离散类 "label" 进行比较.您需要将"SoftmaxWithLoss"之前层的num_output参数从1更改为num-labels。

我相信您目前正在访问未初始化的内存,我预计 caffe 在这种情况下迟早会崩溃。

更新: 您进行了两项更改:num_output 1-->6,并且您还将输入 label 从标量更改为向量。 第一个更改是您使用 "SoftmaxWithLossLayer" 时唯一需要的更改。 不要将 label 从标量更改为“热向量”。

为什么? 因为"SoftmaxWithLoss" 基本上查看的是您输出的 6 向量预测,所以将基本事实 label 解释为 index 并查看 -log(p[label])p[label] 越接近 1(即,您预测预期类别的高概率)损失越低。使预测p[label] 接近于零(即,您错误地预测了预期类别的低概率),那么损失会快速增长。


使用“热向量”作为真实输入label,可能会导致多类别分类(这似乎不是您要在这里解决的任务)。您可能会发现 this SO thread 与该特定案例相关。

【讨论】:

感谢您的建议!奇怪的是,caffe 并没有崩溃。我根据我如何理解您的建议和结果更新了我的问题! @user4039874 使用"SoftmaxWithLoss" 永远不会产生负值。一些可疑的事情正在发生。 (1) 你确定你的模型中没有其他损失层吗? (2) 你确定 HDF5 中的所有 label 值都是 整数 且只有 0,1,2,3,4,5 的值吗?你有没有label==6的例子? 我真傻。我的标签不是从 0 开始的。我改变了它,现在模型正在训练。再次感谢! @user4039874 在这种情况下,您可能无法从 caffe 获得最佳性能(在运行时间和内存使用方面)...... 对于这种情况,这不是问题。但我一定会在未来跟踪它!

以上是关于HDF5 中的 Caffe 分类标签的主要内容,如果未能解决你的问题,请参考以下文章

计算用于咖啡分类的HDF5数据集的平均值

Caffe:具有不同数量标签的多标签图像

使用 hdf5 作为 caffe 输入,错误:HDF5Data 不转换数据

Caffe:将 CSV 文件转换为 HDF5

Caffe 编译时没有看到 hdf5.h

HDF5-DIAG:在 HDF5 (1.8.11) 中检测到错误