HDF5 中的 Caffe 分类标签
Caffe classification labels in HDF5
我正在微调网络。在特定情况下,我想将它用于回归,这很有效。还有一种情况,我想用它来做分类。
对于这两种情况,我都有一个带有标签的 HDF5 文件。通过回归,这只是一个包含浮点数的 1×1 numpy 数组。在将 EuclideanLoss 层更改为 SoftmaxLoss 之后,我认为我可以使用相同的标签进行分类。但是,然后我得到负损失:
Iteration 19200, loss = -118232
Train net output #0: loss = 39.3188 (* 1 = 39.3188 loss)
你能解释一下如果出了问题怎么办吗?我确实看到训练损失约为 40(这仍然很糟糕),但网络是否仍在训练?负损失只会越来越负。
更新
看完 and ,我做了以下修改:
- 我将最后一个完全连接的第 6 层设为 num_output
,因为我有 6 个标签(以前是 1 个)。
- 我现在创建一个单热向量并将其作为标签传递到我的 HDF5 数据集中,如下所示
f['label'] = numpy.array([1, 0, 0, 0, 0, 0])
正在尝试 运行 我的网络 returns
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 中创建批次。这不应该创建正确的批量大小吗?
由于您从回归转向 class化,您需要输出的不是标量来与 "label"
进行比较,而是输出长度的概率 向量 num-labels 与离散 class "label"
进行比较。您需要将 "SoftmaxWithLoss"
之前图层的 num_output
参数从 1
更改为 num-labels.
我认为目前您正在访问未初始化的内存,我预计在这种情况下,caffe 迟早会崩溃。
更新:
您进行了两项更改:num_output
1-->6,并且您还将输入 label
从标量更改为矢量。
第一个更改是使用 "SoftmaxWithLossLayer"
.
所需的唯一更改
不要将 label
从标量更改为 "hot-vector".
为什么?
因为 "SoftmaxWithLoss"
基本上是看你输出的 6 向量预测,将 ground-truth label
解释为 index 并查看 -log(p[label])
:越接近p[label]
比 1(即,您预测的预期 class 的概率高)损失越低。使预测 p[label]
接近于零(即,您错误地预测了预期 class 的低概率)然后损失会快速增长。
使用 "hot-vector" 作为真实输入 label
,可能会导致多类别 class化(这似乎不是您要在此处解决的任务) .您可能会发现 与该特定案例相关。
我正在微调网络。在特定情况下,我想将它用于回归,这很有效。还有一种情况,我想用它来做分类。
对于这两种情况,我都有一个带有标签的 HDF5 文件。通过回归,这只是一个包含浮点数的 1×1 numpy 数组。在将 EuclideanLoss 层更改为 SoftmaxLoss 之后,我认为我可以使用相同的标签进行分类。但是,然后我得到负损失:
Iteration 19200, loss = -118232
Train net output #0: loss = 39.3188 (* 1 = 39.3188 loss)
你能解释一下如果出了问题怎么办吗?我确实看到训练损失约为 40(这仍然很糟糕),但网络是否仍在训练?负损失只会越来越负。
更新
看完
- 我将最后一个完全连接的第 6 层设为 num_output
,因为我有 6 个标签(以前是 1 个)。
- 我现在创建一个单热向量并将其作为标签传递到我的 HDF5 数据集中,如下所示
f['label'] = numpy.array([1, 0, 0, 0, 0, 0])
正在尝试 运行 我的网络 returns
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 中创建批次。这不应该创建正确的批量大小吗?
由于您从回归转向 class化,您需要输出的不是标量来与 "label"
进行比较,而是输出长度的概率 向量 num-labels 与离散 class "label"
进行比较。您需要将 "SoftmaxWithLoss"
之前图层的 num_output
参数从 1
更改为 num-labels.
我认为目前您正在访问未初始化的内存,我预计在这种情况下,caffe 迟早会崩溃。
更新:
您进行了两项更改:num_output
1-->6,并且您还将输入 label
从标量更改为矢量。
第一个更改是使用 "SoftmaxWithLossLayer"
.
所需的唯一更改
不要将 label
从标量更改为 "hot-vector".
为什么?
因为 "SoftmaxWithLoss"
基本上是看你输出的 6 向量预测,将 ground-truth label
解释为 index 并查看 -log(p[label])
:越接近p[label]
比 1(即,您预测的预期 class 的概率高)损失越低。使预测 p[label]
接近于零(即,您错误地预测了预期 class 的低概率)然后损失会快速增长。
使用 "hot-vector" 作为真实输入 label
,可能会导致多类别 class化(这似乎不是您要在此处解决的任务) .您可能会发现