1. 程式人生 > >caffe轉換tensorflow工具caffe-tensorflow

caffe轉換tensorflow工具caffe-tensorflow

caffe-tensorflow轉換介紹及使用

caffe-tensorflow可以將caffe的網路定義檔案和預訓練引數轉換成tensorflow的形式,包括tensorflow的網路結構原始碼和npy格式的權重檔案。
從github上下載原始碼,進入原始碼目錄執行convert.py即可。
其呼叫格式為

python convert.py def_path --caffemodel caffemodel_path --data-output-path dataoutput_path --code-output-path codeoutput_path

其中def_path為必需項,四個引數兩個caffe輸入,兩個tensorflow端的輸出。如果只需要權重引數則只需前三個引數。輸出的tensorflow程式碼為其原始碼中Network的子類,網路構建過程實現了其setup方法,因此需在程式碼中引入才可以呼叫。tensorflow目錄下network.py這個檔案中實現了Network類,這個類封裝了一些layer,包括帶group的conv層,caffe-tensorflow的轉換還是比較安全的,自行轉換會遇到很多諸如caffe,tensorflow卷積核格式、fc權重格式、輸入輸出資料表示格式的不同的問題,caffe-tensorflow這個專案都會自行轉換。

caffe-tensorflow實現細節

caffe-tensorflow的具體原理是通過pycaffe讀取網路定義檔案,並重新生成一張圖,圖上的節點儲存各個層的資訊,GraphBuilder類負責生成圖結構,每個節點代表一個layer,作者定義了許多transformer,每個transformer對圖做一些操作,有對圖中資料進行操作的也有對圖中的layer進行修改的,其中DataInjector類對caffemodel資料進行讀取並將資料分發到圖的各個節點上。

DataReshaper將caffe與tensorflow中的不同格式做了轉換,包括卷積核的格式換,tensorflow的卷積核是[filter_height, filter_width, in_channels, out_channels]而caffe的卷積核是[out_channels, in_channels, filter_height, filter_width],tensorflow的fc層引數也和caffe的不同,tensorflow一般為[input_dimension,output_dimension],caffe剛好相反。而且tensorflow第一個fc層需要對pool5進行reshape,而pool5層和caffe的pool5層由於格式不同(tensorflow為NHWC,caffe為NCHW)所以caffe的weight實際上並不能適用與簡單的將NHWC格式展開,所以這一層的weight需要變換。另外lrn的引數不同也需要調整,具體細節在另一篇部落格lrn的介紹中有說明。