相信剛學caffe,跑FCN模型的時候都遇到過loss下不去的問題,用的明明是給定的數據集和模型的啊,本人也是新手,在這個坑裡爬了好久,終於在學弟的指導下(捂臉)解決了這個問題。

簡單說大家直接用官方給的caffe FCN代碼的時候應該會碰到報錯fc6層shape mismatch,然後網上看到有人說要把fc6層改為fc6_new,其實也算是對的,但是fc6層可是有102760448個參數啊,那麼低的學習率不知道要學到猴年馬月了,然後看vgg16model可以看到fc6層是全連接的,而fcn裡面用的卻是卷積層,這不是坑爹嗎。

解決方法:使用surgery.py裡面的transplant函數

以siftflow為例,在siftflow-fcn32s裡面,原始的solve.py是這樣拷貝權重的

weights = ../ilsvrc-nets/vgg16-fcn.caffemodel

solver = caffe.SGDSolver(solver.prototxt)

solver.net.copy_from(weights)

這樣會丟掉fc6的參數,應該改為

vgg_weights = ../ilsvrc-nets/VGG_ILSVRC_16_layers.caffemodel

vgg_proto = ../ilsvrc-nets/VGG_ILSVRC_16_layers_deploy.prototxt

solver = caffe.SGDSolver(solver.prototxt)

vgg_net = caffe.Net(vgg_proto, vgg_weights, caffe.TRAIN)

surgery.transplant(solver.net, vgg_net)

del vgg_net

其中VGG_ILSVRC_16_layers.caffemodel是下載的vgg參數

VGG_ILSVRC_16_layers_deploy.prototxt是模型,可以在Visual Geometry Group Home Page下載到,網頁中搜索 16-layer model ,後面的連接就是

gist.githubusercontent.com

可以看到211839e770f7b538e2d8和參數caffemodel的數字是一樣的

另外也有vgg16_conv的,有學長給了我一個,但是他也忘記從哪裡下載來的了- -,有興趣的可以找找看,那個網站裡面沒仔細看不知道有沒有,有知道的評論個鏈接吧

然後上圖,我跑的siftflow的結果

順便提醒下新手們,solver.py裡面有個

也就是跑50*2000,和solver.prototxt裡面max_iter: 300000不一樣的- -,也就是只跑100000不會跑300000

結果害我只保存了60000的結果,上圖

可以看到32s跑出來的效果果然不是很理想啊,可以慢慢繼續跑16s,8s

最後,感謝一起交流的大夥,感謝實驗室學弟的幫忙,

有興趣交流的可以加入我之前加的一個FCN討論群,當然都是新手為主- -希望能有大佬加入幫主大家啊,感謝!!

QQ群560233379

———————————————略有違和的分割線—————————————————

怕有些人那個連接打不開,VGG_ILSVRC_16_layers_deploy.prototxt直接貼在評論了

還有測試單張圖片的話,複製一個train.prototxt,然後吧輸入層改成voc-fcn8s裡面deploy.prototxt的輸入層就行,再把最後的loss層去掉(siftflow有2個loss層:sem的loss和loss_geo),然後打開infer.py,把out = net.blobs[score].data[0].argmax(axis=0)中的score改成score_sem或者score_geo,最後加上

plt.imshow(out)

plt.show()

來顯示圖片

輸入層

layer {

name: "input"

type: "Input"

top: "data"

input_param {

# These dimensions are purely for sake of example;

# see infer.py for how to reshape the net to the given input size.

shape { dim: 1 dim: 3 dim: 500 dim: 500 }

}

}


推薦閱讀:
相关文章