4

私は 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、元のアーキテクチャのデータ層からのファイルが必要ですが、それは持っていません (それはネット手術スクリプトを実行しようとするとエラーがスローされます)。

4

2 に答える 2

7

問題は 4096 ではなく、25088 にあります。入力フィーチャ マップに基づいて、ネットワークの各レイヤーの出力フィーチャ マップを計算する必要があります。fcレイヤーは固定サイズの入力を受け取るため、前のconvレイヤーの出力はレイヤーが必要とする入力サイズと一致する必要があることに注意してくださいfc。前のレイヤーの入力特徴マップ サイズを使用して、fc6 入力特徴マップ サイズ (これは前のconvレイヤーの出力特徴マップです) を計算しますconv。式は次のとおりです。

H_out = ( H_in + 2 x Padding_Height - Kernel_Height ) / Stride_Height + 1
W_out = (W_in + 2 x Padding_Width - Kernel_Width) / Stride_Width + 1
于 2016-04-08T20:51:22.503 に答える
0

このエラーは、元のデータセットで行われた 227 ではなく、224 に画像をトリミングしている場合に発生します。それを調整すれば、準備完了です。

于 2017-06-16T16:45:21.700 に答える