最近由於要將訓練好的模型移植到硬件上,因此需要將TensorFlow轉為caffe模型。
caffe模型需要兩個文件,一個是定義網絡結構的prototxt,一個是存儲了參數的caffemodel文件。只要生成這兩個文件,caffe模型就算轉好了。
在模型轉換的過程中,我主要參考了https://github.com/lFatality/tensorflow2caffe。
首先根據已有的tensorflow模型定義caffe模型需要的網絡結構prototxt文件,這個可以參考一些現有經典的prototxt。
然后生成caffe模型需要的模型參數caffemodel。基本過程是:把ckpt中的參數讀出來,因為tensorflow和caffe對特征的維度處理不一樣,tensorflow中特征的維度是NHWC(Number of filters * Height * Width * Channel),caffe中特征的維度是NCWH(Number of filters * Channel * width * height),所以,需要將參數從NHWC轉為NCWH的順序,然后保存為caffe模型。
具體過程,參考資料中講得比較清楚,在此不做太多說明。在模型轉換的過程中,在batch norm層的轉換時碰到了一些問題,在caffe中batch norm中除了存儲mean和variance之外還有scale_factor,在測試過程中需要將其設置為1。
下面是其中一層全連接層的轉換代碼。
net.params['fc15'][0].data[...] = w_15_new net.params['fc15'][1].data[...] = b_15 net.params['fc15_bn'][0].data[...] = mean_15 net.params['fc15_bn'][1].data[...] = variance_15 net.params['fc15_bn'][2].data[...] = 1 net.params['fc15_scale'][0].data[...] = gamma_15 net.params['fc15_scale'][1].data[...] = beta_15