1. 程式人生 > >有關Caffe訓練好的模型在Python介面下使用分類不準確的問題解決

有關Caffe訓練好的模型在Python介面下使用分類不準確的問題解決

之前使用caffe訓練了1k個自己的資料,有3個分類,在consol下面訓練加驗證的結果是85%左右的準確率,還是可以的.

但是問題是,當使用了Python介面,匯入caffemodel檔案和npy均值檔案後,分類結果完全慘不忍睹,全部都偏向第一分類.

經過不懈的google,終於發現了問題所在.

最初定義caffe的網路結構時,用的是如下語句

net = caffe.Classifier(MODEL_FILE, PRETRAINED,mean=np.load(npy_mean_file))
執行的時候沒報錯,但是結果十分不正常.於是改到下面
net = caffe.Classifier(MODEL_FILE, PRETRAINED)
就是去掉了均值檔案的選項,只保留訓練引數和部署網路結構.

這時分類結構少許正常,但是還是又很大偏差.最後在一片google users小組的帖子裡,找到了部分原因.就是經過 系統自帶功能 形成image_mean binaryproto的時候,會把彩圖的RGB通道換成BGR通道,所以在 構建網路的時候,要加入 channel_swap(2,1,0)的選項.

於是加入

net = caffe.Classifier(MODEL_FILE, PRETRAINED,mean=np.load(npy_mean_file), channel_swap=(2,1,0))
結果還是不咋地,沒啥變化,這個時候有點桑心.這個時候看了官方的一個例子.於是借鑑裡面的語句,沒怎麼改,如下:

net = caffe.Classifier(MODEL_FILE, PRETRAINED,mean=np.load(npy_mean_file).mean(1).mean(1), channel_swap=(2,1,0),raw_scale=255,

image_dims=(100,100))

分類結果正確了.

~~~~~~~~~~~~~~~~

分析原因:一開始沒有跟著官方的例子來是因為原文是根據ImageNet 的結構來的,資料集也是,我怕不一致導致有問題.最後的不準確原因在於:

1.通道沒有置換過來,

2.raw_scale = 255 是畫素值範圍,不是(0,1),因為我們使用了均值檔案,雖然減去了均值,但是還是255的範圍.不然肯定出錯

3.image_dims = (100,100)這個是你打包圖片進行訓練的時候使用的尺寸,也要一致,不然就會報錯.

4.mean = (****).mean(1).mean(1)這個後面加mean(1)..應該是numpy的一個功能,可以使分類結果更加突出,這時測試過得,也會使錯誤結果更加錯~~- - !

=====================================

官方的Python程式碼例項為:(連結)點我(點)。

用生成的caffemodel檔案去做分類,solverstate是用來中斷訓練後重新開始的狀態檔案。