2

我在微调网络。在特定的情况下,我想用它进行回归,这很有效。在另一种情况下,我想用它来进行分类。HDF5中的咖啡分类标签

对于这两种情况我都有一个带有标签的HDF5文件。通过回归,这只是一个1乘1的numpy数组,其中包含一个浮点数。在将我的EuclideanLoss图层更改为SoftmaxLoss后,我想我可以使用相同的标签进行分类。然而,然后我得到一个负面的损失,因为如此:

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

你能解释是否等等出了什么问题?我确实看到训练损失约为40(这仍然很糟糕),但网络仍然训练?负面的损失只是越来越负面。

UPDATE
读取Shai's commentanswer和后,我已经进行了如下修改:
- 我在我的最后完全连接层6的num_output,因为我有6个标签(以前是1)。
- 我现在创建一个热载体,传递,作为一个标签到我的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创建批次。不应该创建正确的批量大小吗?

+0

什么是SoftmaxWithLoss图层之前的图层的num_output? – Shai

+0

@Shai num_output当我提出这个问题时是1 – Cassie

回答

2

自您回归分类移动,你需要输出不是标有"label"比较,而是一个概率矢量长度NUM-标签与离散类"label"比较。您需要在"SoftmaxWithLoss"之前将num_output层的参数从1更改为num-labels。

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

更新
您做出如下修改:num_output 1 - > 6,你也从一个标量到向量改变了你的输入label
第一次更改是您使用"SoftmaxWithLossLayer"时唯一需要的更改。
不要将label从标量更改为“热矢量”。

为什么?
由于"SoftmaxWithLoss"基本上看起来在6-矢量预测你输出,解释地面实况label索引和着眼于-log(p[label]):越接近p[label]是1(即,你预测的预期类高概率)的下亏损。使预测p[label]接近于零(即,您错误地预测了预期类别的低概率),那么损失快速增长。


使用“热载体”为地面实况输入label,可能会引起多类别分类(不好像你正试图在这里解决的任务)。您可能会发现this SO thread与该特定情况相关。

+0

感谢您的建议!奇怪的是,咖啡没有崩溃。我更新了我的问题,了解了您的建议和结果! – Cassie

+0

@ user4039874请参阅我的更新。 – Shai

+0

谢谢!我的程序表现得更像我的预期!但是,我的迭代损失仍然是负值。任何想法是什么导致这个? – Cassie