2015CVPR:MatchNet_ Unifying Feature and Metric Learning for Patch-Based Matching
主要是基於patch的圖像特征匹配,基於patch的論文有很多了,例如:
Learning to Compare Image Patches via Convolutional Neural Network(也是15年CVPR)
Image Patch Matching Using Convolutional Descriptors with Euclidean Distance
於是打算利用keras實現,但是沒有利用這些論文都使用的benchmark data,即含有3個子set的patchdata:Multi-view Stereo Correspondence Dataset。
大體上說,這些文章的思路都是利用一對CNN來提取一對圖像特征,然后通過歐氏距離(經典如Saimese網絡)或者通過全連接網絡(Matchnet)來實現特征的對比,最后通過交叉熵函數來完成優化。

論文很好懂,然后文中也有作者訓練好的caffe模型,但是並沒有訓練過程,所以借此機會利用keras練練手。
先說遇到的問題,keras(0.8.2的theano和1.0.7的keras,目前最新大約是0.9的theano和2.0的keras)利用GPU時總是出現損失為NAN的情況,一開始以為是參數問題,所以修改了權重初始化和Dropout等網絡結構,發現任然如下圖:

而且當我跑keras自帶的examples:mnist_cnn時竟然損失一路為NAN(笑哭/(ㄒoㄒ)/~~),我趕緊換成CPU跑了下,一切正常,正確率又飆到了99%多。我想是不是.theanoc.txt出了問題,我把optimizer=fast_compile刪掉(PyCharm跑總是提醒內存問題。。PyCharm確實很占地兒,所以轉戰Spider),同時把device=gpu改成了gpu0.結果正常了。。如下圖:

還沒有進一步調參,一直被NAN所困。。而且網絡也被我改得面目全非(因為只是測試數據量只有15000),和MatchNet作者的網絡出入很大。但是基本思路都是CNN+全連接。。
增大了卷積核,loss下降到0.26,同時訓練正確率也在90%以上:

將原數據的10%作為驗證集:

再利用keras的模型可視化工具將模型結構可視化,方法見keras中文文檔和博客:
from keras.utils.visualize_util import plot plot(model, to_file='model.png')
如圖:

或者如果要在ipython中展示圖片:
from IPython.display import SVG from keras.utils.visualize_util import model_to_dot SVG(model_to_dot(model).create(prog='dot', format='svg'))
效果和上圖一樣。
