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