2017-02-08 7 views
8

私はこれが愚かな質問であると確信していますが、他の場所ではそれを見つけることができませんのでここで尋ねます。セマンティックセグメンテーションのクロスエントロピーロス

私は、7つのラベルを持つkernのcnn(unet)を使ってセマンティックイメージセグメンテーションを行っています。ですから、各画像の私のラベルはtheanoバックエンドを使って(7、n_rows、n_cols)です。したがって、各ピクセルの7つのレイヤにわたって、1つのホットエンコードされています。この場合、カテゴリクロスエントロピーを使用する正しいエラー関数はありますか?それは私にはそう思われますが、ネットワークはバイナリのクロスエントロピー損失でより良く学習するようです。誰かがそれがなぜであり、何が原則的な目的であるかについて何らかの光を当てることができますか?

答えて

10

最後のレイヤーで活性化すると、二重クロスエントロピー損失が使用され、反対の予測に重大なペナルティが生じます。出力がワンホットコードであり、予測の合計が1であることは考慮されていません。誤った予測は重大なペナルティを課すため、適切に分類することを幾分学んでいます。

これまでのワンホットコードを実施するには、カテゴリクロスエントロピーでsoftmaxのアクティブ化を使用します。これはあなたが使うべきものです。

Kerasは各ピクセルでsoftmaxをサポートしていないため、問題はsoftmaxを使用しています。

Permuteレイヤーを使用して寸法を(n_rows、n_cols、7)に置き換えて、Reshapeレイヤーを使用して(n_rows * n_cols、7)に変更してください。その後、softmaxアクティブ化レイヤーを追加して、クロスエントロピー損失を使用することができます。それに応じてデータも再構成する必要があります。

そうすることの他の方法は、深さ、ソフトマックス実装することになります。

def depth_softmax(matrix): 
    sigmoid = lambda x: 1/(1 + K.exp(-x)) 
    sigmoided_matrix = sigmoid(matrix) 
    softmax_matrix = sigmoided_matrix/K.sum(sigmoided_matrix, axis=0) 
    return softmax_matrix 

とラムダ層としてそれを使用する:

model.add(Deconvolution2D(7, 1, 1, border_mode='same', output_shape=(7,n_rows,n_cols))) 
model.add(Permute(2,3,1)) 
model.add(BatchNormalization()) 
model.add(Lambda(depth_softmax)) 

tfimage_dim_orderingが使用されている場合、あなたは道を行うことができますPermuteレイヤーを使用します。

詳細については、hereを参照してください。

+0

非常に詳細な回答ありがとうございます。私は、形を変えて、ソフトマックスとカテゴリークロスエントロピーで行った。スピードや最終精度の点で2つの方法のパフォーマンスに大きな違いがあると思いますか?再度、感謝します! – TSW

+0

私はこのシナリオでは自分で作業していませんが、両方を確認できます。あなたが試みることができるもう一つのことは、最初に 'sigmoid'とバイナリのクロスエントロピー損失として最終層のモデルを作り、' 'softmax''でトップレイヤーとend'を置き換えて、カテゴリクロスエントロピーで再学習します。 2回目のトレーニングはすばやく収束しますが、全体的にトレーニング時間が短縮され、より正確になると思います。 – indraforyou

+0

こんにちはindraforyou、私はまたセマンティックセグメンテーションの場合に取り組んでいます。マスクされた画像は、(1、n_rows、n_cols)として表される。この場合、SigmoidとBinary Cross-Entrophyを使用できますか?含まれる具体的な手続きはありますか? – user297850

関連する問題