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

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

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

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

更新
阅读 Shai's commentanswer 后,我进行了以下更改:
- 我制作了最后一个全连接层 6 的 num_output,因为我有 6 个标签(曾经是 1 个)。
- 我现在创建一个单热向量并将其作为标签传递到我的 HDF5 数据集中,如下所示
    f['label'] = numpy.array([1, 0, 0, 0, 0, 0])

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



在网上进行了一些研究后,我将向量重塑为 1x6 向量。这导致以下错误:



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

最佳答案

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

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

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

为什么?
因为 "SoftmaxWithLoss" 基本上是查看你输出的 6-vector 预测,将真实情况 label 解释为 索引 并查看 -log(p[label]) :p[label] 越接近 1(即你预测的预期类的概率高)越低.使预测 p[label] 接近于零(即,您错误地预测了预期类别的低概率),则损失会快速增长。

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

关于neural-network - HDF5 中的 Caffe 分类标签,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41020322/

10-12 17:08