TensorflowモデルをCaffeモデルに変換したいと考えています。TensorflowモデルをCaffeモデルに変換
私はgoogleで検索しましたが、私はcaffeからtensorflowへのコンバーターしか見つけられませんでしたが、その逆は見つかりませんでした。
どのようにすればいいですか? @Patwieによってコメントで示唆したように
おかげで、 エヴィ
TensorflowモデルをCaffeモデルに変換したいと考えています。TensorflowモデルをCaffeモデルに変換
私はgoogleで検索しましたが、私はcaffeからtensorflowへのコンバーターしか見つけられませんでしたが、その逆は見つかりませんでした。
どのようにすればいいですか? @Patwieによってコメントで示唆したように
おかげで、 エヴィ
は、あなたが層によって重み層をコピーして、手動で行う必要があります。例えば、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レイヤーで分離されています。また、ガンマ,平均および分散は、バッチ規格化層のために分離されている。
CaffeにはPythonラッパーも付属しています。唯一の方法は、手動で多かれ少なかれ手動でウェイトをコピーすることです。あなたはその質問で早くに行く方法です。近い将来にTensorFlowがONNXにも適応することを願っています。 – Patwie
難しいです。 Tensorflowはモデルとしてのコードですが、Caffeはモデルとしてのデータ構造です。 –