test正確率很高classification.bin分類出錯_20180104

題目:

1 test 正確率很高classification.bin 分類出錯

1. 問題描述 用caffe 訓練了一個自己的圖像集,訓練和測試的正確率都很高。

但在使用classification 或python 編的分類預測代碼對單張圖片測試時,發現分類結果是錯誤的。 爲了驗證,我特地在test 里輸出softmax 的結果驗證,發現這裡的結果,是正確的類別概率最高。 但在使用classification 時,就不對了。

我看了一些網上的帖子,說是classification 的代碼讀圖函數設置的問題,但我設置了好幾次不同的,再用classification 分類,結果還是錯誤的,而且不同的設置產生的結果是一樣的。

2. 分析及解決方案:

(1). 解決方案0 在訓練用的prototxt 文件中不包含均值文件,然後採用classification 調用模型和deploy 文件進行預測分類時,生成一個全零值的mean.binaryproto 文件,然後其他方面都相同。使用classification.bin 或classification.exe 文件的例子如下:

/home/caffe/build/examples/cpp_classification/classification.bin \

/home/caffe/workspace/resnet_0102/deploy.prototxt \

/home/caffe/workspace/resnet_0102/models/res18_iter_2000.caffemodel \

/home/caffe/workspace/resnet_0102/zeros_mean.binaryproto \

/home/caffe/workspace/resnet_0102/kind_name.txt \

/home/caffe/workspace/resnet_0102/new_samples/deft_790.jpg

其中,mean.binaryproto 爲全零像素值的均值文件。其生成過程爲:先生成全零像素值的制定尺寸的圖像n 張,分別對應n 個類別的編號,然後生成lmdb 文件。接著採用生成均值文件的命令生成mean.binaryproto 文件。這樣相當於圖像文件中的像素全減去零值,和沒有減零值效果相同。生成均值文件的命令如下: build/tools/compute_image_meanexample_train_lmdb examples/mnist/mean.binaryproto Kind_name.txt爲種類文件,每行描述一個種類的名稱,兩個種類描述的例子如下:

n000 good elements

2

n001 deft elements

其它方面和caffe 中classification.bin 文件的使用標準相同。

這樣在預測和訓練中都不對圖像像素減均值,從而保持訓練和預測的一致性。

(2). 解決方案1

binaryproto 文件本身是一個和圖像大小一樣的矩陣,每個位置是圖像集在該點的均值,在

train 和test 的時候,是將binaryproto 文件轉換成一個矩陣,並用圖像減去該矩陣。

但是用C 方法的classification.bin 或者Python 方法的時候,是先對binaryproto 文件的矩陣計算均值,一個三通道矩陣,最後就三個均值,然後用每個通道的均值,減去圖像上的每個像素點。

所以以下方法是在網絡結構文件里,把均值的binaryproto 文件,換成三個通道均值

改成

3 上述的圖像的三個均值也可以用matlab 語言來求,對一個文件夾中所有圖片求均值的matlab 代碼如下: clear all

clc

close all

% d=dir(fullfile('img_samples'))

d=dir(fullfile('zxy_good'))

r_sum=0;

g_sum=0;

b_sum=0;

for i=3:numel(d)

v_d=d(i).name

% img=imread(['img_samples/',v_d]);

img=imread(['zxy_good/',v_d]);

img_size=size(img);

pixel_num_channel=img_size(1)*img_size(2);

img_r=sum(sum(img(:,:,1)))/pixel_num_channel;

img_g=sum(sum(img(:,:,2)))/pixel_num_channel;

img_b=sum(sum(img(:,:,3)))/pixel_num_channel;

r_sum=r_sum+img_r;

g_sum=g_sum+img_g;

b_sum=b_sum+img_b;

% imwrite(img,['diag_imgs/','diag_',num2str(i-2),'.jpg']);

end

mean_r=r_sum/(numel(d)-2);

mean_g=g_sum/(numel(d)-2);

mean_b=b_sum/(numel(d)-2); 採用python 計算三個通道的均值的方法

將訓練樣本減去採用上述方法所求出的均值後進行訓練,在預測時,如果採用不包含均值或減零均值的的預測方法,那麼可以在預測前,分別求出圖像的RGB 三個通道的均值,然後將圖像減去這三個通道的均值,就可採用不包含均值的deploy 文件模型進行預測。

(3). 解決方案2

@c408550969:但是我之前用caffe 自帶的caffenet ,一開始把最後的num_output改成5,也出現了分類錯誤,我把每一層的num_output都改小,然後就分類正確了。我也是用的自帶的mean.binaryproto

chuanpupo ? 2017-11-06 20:15

你好,我是做二分類,爲什麼我按照您的解釋改進了之後,準確率一直保持50%不變呢

chuanpupo ? 2017-11-06 20:18

而且是在train_val.prototxt的TRAIN 和TEST 階段都需要進行上面相同的操作吧?

4

我也遇到相同問題了,

我使用的是caffenet 網絡,原本最後一層輸出num_output是1000,我把它改成了3,其它卷積核數之類未修改,然後用來分類3種圖片圖片,訓練模型的結果accuracy 是0.979569,loss 值是0.0536901。

但是和樓主一樣用classification.bin 來分類時,幾乎把所有的3類圖片都歸到其中一類去了,基本都是錯的。

是不是和卷積核數有關呢,最後輸出的分類種數減小了,每一層的卷積核數也要做相應修改嗎? 這個問題困擾我好久了,一直找不出問題在哪兒

(4). 解決方案3

我已經自己解決了,問題出在均值文件上。在使用classification.bin 的時候,會將binaryproto 文件計算出三個通道的每個通道的一個均值,而不是直接用圖像減去binaryproto 矩陣。

所以,如果想使用classification 程序以及python 預測分類準確率的程序,就必須在train 和test 的時候,手動算出binaryproto 文件的每個通道的均值,然後使用這個均值,而不使用binaryproto 文件。

或者自己用接口寫個分類程序,不用classification.bin 。


解答:

評論已關閉