私は PyCaffe を使用して、VGG 16 層ネットワークに触発されたニューラル ネットワークを実装しています。GitHub ページから入手できる事前トレーニング済みのモデルを使用したいと考えています。通常、これはレイヤー名を一致させることで機能します。
私の"fc6"
レイヤーでは、train.prototxt ファイルに次の定義があります。
layer {
name: "fc6"
type: "InnerProduct"
bottom: "pool5"
top: "fc6"
inner_product_param {
num_output: 4096
}
}
VGG-16 デプロイ アーキテクチャの prototxt ファイルは次のとおりです。prototxtの は私のものと同じであることに注意してください"fc6"
(学習率を除いて、それは無関係です)。また、私のモデルでも入力がすべて同じサイズであることに注意してください: 3 チャネル 224x224px 画像。
私はこのチュートリアルをかなり厳密にフォローしてきましたが、問題を引き起こしているコードのブロックは次のとおりです。
solver = caffe.SGDSolver(osp.join(model_root, 'solver.prototxt'))
solver.net.copy_from(model_root + 'VGG_ILSVRC_16_layers.caffemodel')
solver.test_nets[0].share_with(solver.net)
solver.step(1)
1 行目でソルバーの prototxt を読み込み、2 行目で事前トレーニング済みモデルから重みをコピーします ( VGG_ILSVRC_16_layers.caffemodel
)。ソルバーを実行すると、次のエラーが発生します。
Cannot copy param 0 weights from layer 'fc6'; shape mismatch. Source param
shape is 1 1 4096 25088 (102760448); target param shape is 4096 32768 (134217728).
To learn this layer's parameters from scratch rather than copying from a saved
net, rename the layer.
その要点は、彼らのモデルはレイヤーのサイズが1x1x4096であると想定しているのに対し、私のものはちょうど4096であるということです。しかし、これを変更する方法がわかりませんか?
ユーザーの Google グループでこの回答を見つけて、コピーする前に事前トレーニング済みのモデルを再形成するためにネット手術を行うように指示しましたが、それを行うにはlmdb
、元のアーキテクチャのデータ層からのファイルが必要ですが、それは持っていません (それはネット手術スクリプトを実行しようとするとエラーがスローされます)。