3

私はカフェモデルの畳み込み層のサイズを変更しようとしています(これはthis questionへのフォローアップの質問です)。 how to do net surgeryに関するチュートリアルがありますが、1つのカフェモデルから同じサイズの別のカフェモデルに重量パラメータをコピーする方法のみを示しています。
代わりに、私はそれが現在(X 3 X 3 X 364)から(X 3 X 4 X 364)にそのサイズを変更するような私の畳み込みフィルターに新しいチャンネル(すべて0)を追加する必要があります。ネット手術:caffeodelファイルの畳み込み層をcaffeで再形成する方法は?

畳み込みレイヤーが'conv1'となっているとします。これは私がこれまで試したものです:

# Load the original network and extract the fully connected layers' parameters. 
net = caffe.Net('../models/train.prototxt', 
       '../models/train.caffemodel', 
       caffe.TRAIN) 

今、私はこれを行うことができます。

net.blobs['conv1'].reshape(64,4,3,3); 
net.save('myNewTrainModel.caffemodel'); 

しかし、保存されたモデルが変更されていないようです。私は畳み込みの実際の重さがよりもnet.blobsに格納されているが、net.paramsオブジェクトを再形成する方法を理解できないことを読んだ。誰にもアイデアはありますか?

答えて

5

あなたがよく指摘したように、net.blobsは学習されたパラメータ/重みを保存せず、フィルタ/アクティベーションをネットの入力に適用した結果を格納します。学習された重みはnet.paramsに格納されます。 (詳細はthisを参照してください)。

AFAIKでは、直接reshapenet.paramsとチャンネルを追加することはできません。
できることは、2つのネットdeploy_trained_net_with_3ch.prototxtdeploy_empty_net_with_4ch.prototxtです。 2つのファイルは、入力シェイプ定義と最初のレイヤーの名前を除いて、ほぼ同じです。すべてのレイヤ名が(conv1から離れて)同じですので、train.caffemodelの重みを持つことになりますnet4ch.params

net3ch = caffe.Net('deploy_trained_net_with_3ch.prototxt', 'train.caffemodel', caffe.TEST) 
net4ch = caffe.Net('deploy_empty_net_with_4ch.prototxt', 'train.caffemodel', caffe.TEST) 


その後、関連部分をのpythonに両方ネットをロードしてコピーすることができます。第一層として、あなたは今、手動で該当部分をコピーすることができます。

net4ch.params['conv1_4ch'][0].data[:,:3,:,:] = net3ch.params['conv1'][0].data[...] 

し、最終的に:非常に多くの質問に答えるための

net4ch.save('myNewTrainModel.caffemodel') 
+2

感謝を。あなたは本当に私をたくさん助けました!しかし、今後もいくつか質問が残るかもしれません;) – mcExchange

関連する問題