2017-03-04 41 views
1

2つのモデルがありますが、NM1とNM2としましょう。Caffe、2つのモデルの出力を結合する

私が探しているのは、以下の例のようなものです。

私たちは犬の絵を持っているとしましょう。

NM1は、確率0.52の猫であり、確率0.48の犬であると予測しています。 NM2は、それが確率0.6の犬であり、確率0.4の猫であると予測しています。

NM1 - 間違った NM2を予測する - 正しく

NM1 + NM2を予測する - したがって、各モデルは内積で終了

(0.48 + 0.6> 0.52 + 0.4ために)接続した後に(正しく予測しますソフトマックス)、2つの確率ベクトルが得られます。

次のステップでは、これらの2つのベクトルがあり、それらを追加したいと考えています。ここではEltwiseレイヤーを使用します。

layer { 
    name: "eltwise-sum" 
    type: "Eltwise" 
    bottom: "fc8" 
    bottom: "fc8N" 
    top: "out" 
    eltwise_param { operation: SUM } 
} 

NM1に参加する前に、精度は約70%、NM2~10%でした。

接合後も精度は1%に達することはありません。

私の結論は、私が間違っていることを理解し、誰かが私が間違っているところを私に説明することができればと感謝しています。

PS。 lmdbを作成するときにシャッフルをオフにしました。

UPDATE

layer { 
    name: "eltwise-sum" 
    type: "Eltwise" 
    bottom: "fc8L" 
    bottom: "fc8NL" 
    top: "out" 
    eltwise_param { 
    operation: SUM 
    coeff: 0.5 
    coeff: 0.5 
    } 

} 


#accur for PI alone 
layer { 
    name: "accuracyPINorm" 
    type: "Accuracy" 
    bottom: "fc8L" 
    bottom: "label" 
    top: "accuracyPiNorm" 
    include { 
    phase: TEST 
    } 
} 

#accur for norm images alone 
layer { 
    name: "accuracyIMGNorm" 
    type: "Accuracy" 
    bottom: "fc8NL" 
    bottom: "labelN" 
    top: "accuracyIMGNorm" 
    include { 
    phase: TEST 
    } 
} 

#accur for them together 
layer { 
    name: "accuracy" 
    type: "Accuracy" 
    bottom: "out" 
    bottom: "label" 
    top: "accuracy" 
    include { 
    phase: TEST 
    } 
} 

Model image

+1

[** DO NOT TURN SHUFFLING OFF **](http://stackoverflow.com/a/37659171/1714410)のようなものが必要です。 – Shai

+0

@Shai問題だと理解していますが、シャッフルをオフにすることは、両方の入力から同じ画像が得られるかどうかを確認する1つの方法にすぎません。 シャッフルすると、入力ごとに異なる画像が返される可能性があります。 –

+1

lmdbsを生成するために使用されるテキストファイルの行をシャッフルします。 – Shai

答えて

1

あなたは(要素単位)確率を追加したい場合は、"Softmax"後、およびない"InnerProduct"層の後に追加する必要があります。

layer { 
    type: "InnerProduct" 
    name: "fc8" 
    top: "fc8" 
    # ... 
} 
layer { 
    type: "Softmax" 
    name: "prob_nm1" 
    top: "prob_nm1" 
    bottom: "fc8" 
} 
layer { 
    type: "InnerProduct" 
    name: "fc8N" 
    top: "fc8N" 
    # ... 
} 
layer { 
    type: "Softmax" 
    name: "prob_nm2" 
    top: "prob_nm2" 
    bottom: "fc8N" 
} 
# Joining the probabilites 
layer { 
    type: "Eltwise" 
    name: "prob_sum" 
    bottom: "prob_nm1" 
    bottom: "prob_nm2" 
    top: "prob_sum" 
    eltwise_param { 
    operation: SUM 
    coeff: 0.5 
    coeff: 0.5 
    } 
} 
+0

ありがとうございます。以前は間違って書いていましたが、InnerProductsの後にSoftmaxを使いました。私が知らなかったのはEltwise層の引数coeffだった。多分それが問題でした!私は今それを試し、結果をここに書くでしょう。再度、感謝します! –

+1

@AleksanderMonk私はこれがトリックをするのか分からない。複合モデルをトレーニング/微調整していますか?どのように精度を測定していますか? – Shai

+0

はい、私は、入力の1つには通常の画像と2番目の入力には鮮明な画像を組み合わせたモデルを訓練しようとしています。 正確なレイヤーで質問を更新しました。 1番目のモデルの出力精度をチェックし、2番目のモデルの出力精度をチェックし、Eltwise出力の精度をチェックします。 –

関連する問題