neural-network - HDF5 中的 Caffe 分类标签

标签 neural-network classification deep-learning caffe conv-neural-network

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

对于这两种情况,我都有一个带有标签的 HDF5 文件。对于回归,这只是一个包含 float 的 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 个)。
- 我现在创建一个 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 中创建批处理。这不应该创建正确的批量大小吗?

最佳答案

由于您从回归转向分类,因此您需要输出的不是一个标量来与“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] 接近于零(即,您错误地预测了预期类别的低概率),则损失会快速增长。


使用“热向量”作为真实输入标签,可能会引起多类别分类(看起来不像您在这里试图解决的任务)。您可能会发现this SO thread与该特定案例相关。

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

相关文章:

python - 如何使用 Keras 在密集层中使用 dropout 创建自动编码器

python - Keras LSTM 的多维输入 -(用于分类)

matlab - 如何使用 MATLAB 训练能够计算 XOR 的神经网络?

python - 如何使用 MLPClassifier Sklearn 在神经网络中使用自定义损失函数?

machine-learning - 结合回归和分类的多输出神经网络

python - 基于FFT的音频分类

tensorflow - Keras错误: expected dense_input_1 to have 3 dimensions

utf-8 - 保存Keras模型: UTF - 8 Error

tensorflow - 神经网络权重太大?

scikit-learn - 使用分类特征和文本进行分类