這兩天真是淚千行。。。
訓練網絡成功后,為了看下效果,想要測試一下看看。
師兄說寫個簡單程序就好了。。。結果我幾天還沒弄出來--
找了無數教程,最后還是用的denny的代碼終於跑出來了
1.首先第一天壓根兒不知道測試程序里的prototxt是deploy,還傻乎乎的用train的程序。。。第二天才偶然發現。。然后就到處搜資料看deploy怎么寫。。。師姐給了兩個博客,講的算比較清楚的
http://www.cnblogs.com/carle-09/p/5779304.html 以及 http://blog.csdn.net/fx409494616/article/details/53008971。。。
但是關於第一個層。。。第二個博客把我坑了。。。應該是
input: "data" input_dim: 1 input_dim: 3 input_dim: 32 input_dim: 32
這個樣子的。第一個應該是數量,第二個是通道數,第三個和第四個是高度和寬度。。。。
2.然后剛開始我的程序是這樣的
然而一直出錯。。。於是我又改 啊改啊。。。復制粘貼了denny的程序:
#coding=utf-8
import caffe
import numpy as np
root='/home/xxx/' #根目錄
deploy=root + 'mnist/deploy.prototxt' #deploy文件
caffe_model=root + 'mnist/lenet_iter_9380.caffemodel' #訓練好的 caffemodel
img=root+'mnist/test/5/00008.png' #隨機找的一張待測圖片
labels_filename = root + 'mnist/test/labels.txt' #類別名稱文件,將數字標簽轉換回類別名稱
net = caffe.Net(deploy,caffe_model,caffe.TEST) #加載model和network
#圖片預處理設置
transformer = caffe.io.Transformer({'data': net.blobs['data'].data.shape}) #設定圖片的shape格式(1,3,28,28)
transformer.set_transpose('data', (2,0,1)) #改變維度的順序,由原始圖片(28,28,3)變為(3,28,28)
#transformer.set_mean('data', np.load(mean_file).mean(1).mean(1)) #減去均值,前面訓練模型時沒有減均值,這兒就不用
transformer.set_raw_scale('data', 255) # 縮放到【0,255】之間
transformer.set_channel_swap('data', (2,1,0)) #交換通道,將圖片由RGB變為BGR
im=caffe.io.load_image(img) #加載圖片
net.blobs['data'].data[...] = transformer.preprocess('data',im) #執行上面設置的圖片預處理操作,並將圖片載入到blob中
#執行測試
out = net.forward()
labels = np.loadtxt(labels_filename, str, delimiter='\t') #讀取類別名稱文件
prob= net.blobs['Softmax1'].data[0].flatten() #取出最后一層(Softmax)屬於某個類別的概率值,並打印
print prob
order=prob.argsort()[-1] #將概率值排序,取出最大值所在的序號
print 'the class is:',labels[order] #將該序號轉換成對應的類別名稱,並打印
由於我的不是分類,做了一些改動。
再次運行:錯誤如下:由於我服務器里沒有中文輸入法,只能這樣windows下截屏來記錄。。
最開始我沒仔細看報錯(心里太着急,摔)我又直接去百度方法。。。然后改了一天也沒什么進展。。。
晚飯時師兄跟我說建議我不要每次遇到問題就亂試各種亂七八糟的解決辦法,而是先找出問題在哪兒,再去解決,可能我都可以解決了,就不會困在原地。。。。
我覺得說的很對,我心情太急躁了。。。吃完飯回來我仔細看報錯。發現它的意思好像是說我有兩個錯誤嘛,第一個就是要把net里的替換成它寫的那樣,然后我就替換了,
再次運行,果然只剩下第二個錯誤了:
這時候我已經很開心了哈哈哈!有種心靜下來就會成功的感覺。。。。我接着看他說的錯誤,意思不就是說我deploy寫的不對嘛。。。於是就像開頭說的,我把deploy第一層由
layer {
name: "data"
type: "Input"
top: "data"
input_param { shape: { dim: 10 dim: 3 dim: 227 dim: 227 } }
}
改為
input: "data"
input_dim: 1
input_dim: 3
input_dim: 600
input_dim: 800 #我的輸入圖片訓練的時候就是600*800
然后再次運行:又報錯了,但是這次層都搭好了,就說我最后一層寫錯了,我是模仿第二個博主寫的,因為我看他train.prototxt里面最后一層是SoftmaxWithLoss,但到了deploy就變成了下面這樣
layer {
name: "prob"
type: "Softmax"
bottom: "fc8"
top: "prob"
}
於是我 就自作聰明的把我最后一層原本是歐幾里得loss中的"loss"去掉,只剩下歐幾里得,它報錯說沒有這個函數,我又加上了"loss",然后再次運行
這時候實在百度也沒答案,自己也看不懂就去問師姐了,,師姐過來幫我看了一下說這意思是說歐幾里得損失函數是需要兩個輸入,我突然想起來它的定義就是兩者之差的平方啊,我傻了。
訓練的文件里一個輸入是data另一個是label,這樣計算兩者差值,但現在我測試圖片,沒有label,就可以不要這一層,於是我刪掉了最后一層,再跑,哈哈哈哈哈哈!跑通了!!!!
但是看不了結果。。。。所以我現在先把這些寫好。。再去查怎么用python保存結果。。。弄好了再更哈哈哈哈哈。。好開森。。。連今天不能早睡我都沒關系哈哈哈!
很抱歉。。最后我也沒找到保存的方法。。只找到了可視化的方法。。
就是jupyter notebook
可視化也遇到了很多困難。。。當時沒空寫。。現在也懶得寫了。。反正我畢設暫時不會用python了。。。
轉戰matlab
等我順利畢業了再好好學!