2017-05-03 17 views
2

これは、トレーニング前にモデルに既存のウェイトを追加する方法に関する質問hereの拡張です。caffeの最終レイヤーを変更する

既存のウェイトを使用したかったのですが、最終的なレイヤーは1000ではなく50を出力しました(ネットワークは1000アイテムを分類するように訓練されていたので)。以前の投稿から、出力レイヤの名前を変更することで、私は重みを追加することができました。しかし、その後、最終層に依存する他の層があることに気付きました。ここでVGGネットワ​​ークからの抜粋です:

layer { 
    name: "loss3/classifier" 
    type: "InnerProduct" 
    bottom: "pool5/7x7_s1" 
    top: "loss3/classifier" 
    param { 
    lr_mult: 1 
    decay_mult: 1 
    } 
    param { 
    lr_mult: 2 
    decay_mult: 0 
    } 
    inner_product_param { 
    num_output: 50 
    weight_filler { 
     type: "xavier" 
    } 
    bias_filler { 
     type: "constant" 
     value: 0 
    } 
    } 
} 
layer { 
    name: "loss3/loss3" 
    type: "SoftmaxWithLoss" 
    bottom: "loss3/classifier" 
    bottom: "label" 
    top: "loss3/loss3" 
    loss_weight: 1 
} 
layer { 
    name: "loss3/top-1" 
    type: "Accuracy" 
    bottom: "loss3/classifier" 
    bottom: "label" 
    top: "loss3/top-1" 
    include { 
    phase: TEST 
    } 
} 
layer { 
    name: "loss3/top-5" 
    type: "Accuracy" 
    bottom: "loss3/classifier" 
    bottom: "label" 
    top: "loss3/top-5" 
    include { 
    phase: TEST 
    } 
    accuracy_param { 
    top_k: 5 
    } 
} 

私の質問は以下のとおりです。

  1. 正確下部と上部の引数は何?

  2. 後続の2つのレイヤーで "loss3/classifier"の名前を変更する必要がありますか?

答えて

1

これは非常に基本的な質問です。私は、あなたがcaffeの基礎を得るために、いくつかのドキュメントと基本的なcaffeチュートリアルを調べることを強くお勧めします。 This tutorialは良い出発点です。


深いネットワークには、ネットの入力から予測された出力へのデータの「流れ」を記述する下層のグラフがあります。あなたの質問に添付したスニペットはそのようなグラフの1つを表しています。
各レイヤーは、 "データパス"に沿った "処理単位"を表します。入力は"bottom"ブロブで、レイヤーは処理されたデータを"top"ブロブとして出力します。
それで、あなたは層

layer { 
    name: "loss3/classifier" 
    type: "InnerProduct" 
    bottom: "pool5/7x7_s1" 
    top: "loss3/classifier" 
    ... 
} 

を持っている場合、この層は、(レイヤのtypeによって定義される)"InnerProduct"の動作を行います。入力ブロブ"pool5/7x7_s1"bottomと定義されています)に対して操作を実行し、結果をブロブ"loss3/classifier"topブロブとして定義)に出力します。この層の学習可能なパラメータ(重みおよびバイアス)は、層の名前"loss3/classifier"を使用して、caffeによって格納され、アクセスされます。
そのため、あなたはtopを変更ずに"loss3/classifier_50"にlayyerの名前を変更する場合は、所望の効果が得られます:カフェは、彼にこの層の重みをコピーしませんが、他の層に接続され、この層の出力を維持します。


ところで、
はあなたがVGGネットを使用していますか?このプロトタイプはGoogLeNetアーキテクチャのようです...
AlexNet、VGG、GoogLeNetは3つの全く異なるネットです。

+1

はい。あなたが正しいです。それはgooglenetです。私はそのような基本的な質問をお詫び申し上げます。私は間違いなくチュートリアルを進めます。ありがとうございました! – MoneyBall

関連する問題