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 。
解答:
- 上一篇 中山市中小學校文書檔案歸檔範圍和保管期限表
- 下一篇 醫院6S管理規定_圖文
評論已關閉