2016-12-14 72 views
14

TensorflowモデルをCaffeモデルに変換したいと考えています。TensorflowモデルをCaffeモデルに変換

私はgoogleで検索しましたが、私はcaffeからtensorflowへのコンバーターしか見つけられませんでしたが、その逆は見つかりませんでした。

どのようにすればいいですか? @Patwieによってコメントで示唆したように

おかげで、 エヴィ

+1

CaffeにはPythonラッパーも付属しています。唯一の方法は、手動で多かれ少なかれ手動でウェイトをコピーすることです。あなたはその質問で早くに行く方法です。近い将来にTensorFlowがONNXにも適応することを願っています。 – Patwie

+0

難しいです。 Tensorflowはモデルとしてのコードですが、Caffeはモデルとしてのデータ構造です。 –

答えて

1

は、あなたが層によって重み層をコピーして、手動で行う必要があります。例えば、caffemodelにtensorflowチェックポイントから最初のCONV層の重みをコピーするには、次のような何かをする必要があります:

sess = tf.Session() 
new_saver = tf.train.import_meta_graph("/path/to/checkpoint.meta") 
what = new_saver.restore(sess, "/path/to/checkpoint") 

all_vars = tf.get_collection(tf.GraphKeys.GLOBAL_VARIABLES) 

conv1 = all_vars[0] 
bias1 = all_vars[1] 

conv_w1, bias_1 = sess.run([conv1,bias1]) 

net = caffe.Net('path/to/conv.prototxt', caffe.TEST) 

net.params['conv_1'][0].data[...] = conv_w1 
net.params['conv_1'][1].data[...] = bias_1 

... 

net.save('modelfromtf.caffemodel') 

注1:このコードは、 がテストされていません。これがうまくいくかどうかはわかりませんが、私はそれをすべきだと思います。また、これは1つのコンバレイヤーのみです。実際にテンソルフローチェックポイントを分析して、どのレイヤーのウェイトがどのインデックスにあるかを確認してから、各レイヤーのウェイトを個別にコピーする必要があります(print all_vars)。

注2:彼らは一般的に、設定されたパターン(conv1-> bn1-> relu1-> conv2-> bn2-> relu2 ...)

をたどるように、一部の自動化は、最初のコンバージョン層の上に反復することによって行うことができます注3:Tensorflowは、各レイヤーの重みを別々のインデックスにさらに分割する場合があります。例えば、の重みの偏りは、上記のようにconvレイヤーで分離されています。また、ガンマ,平均および分散は、バッチ規格化層のために分離されている。

関連する問題