2017-10-16 8 views
1

のベクトルを返します。 :ソフトマックス層は、私は出力としてソフトマックス層でKerasにCNNを構築したいが、私は唯一の出力としてこれを取得1S

model = Sequential() 
model.add(Conv2D(2, (1,3), padding='valid', 
      input_shape=(3,3,50), init='normal', data_format='channels_first')) 
model.add(Activation('relu')) 
model.add(Conv2D(20, (1,48), init='normal', data_format='channels_first')) 
model.add(Activation('relu')) 
model.add(Conv2D(1, (1, 1), init='normal', data_format='channels_first', activation='softmax')) 

softmaxが機能しないのはなぜですか。それはおそらく誤った入力形状のためでしょうか?

答えて

0

モデルアーキテクチャに問題があります。あなたは人気モデルのいくつかを見てみると:

  1. いくつかの畳み込み:

    あなたはCNNのための構造は、通常はこのようになっていることがわかります再活性化を伴う層

  2. プール層(すなわち、最大プール、平均プールなど)
  3. フラット次にコンボリューション層
  4. 緻密層
  5. 、ソフトマックス

これは、畳み込み層にソフトマックスを適用しても意味がありません。

+0

ありがとうございました。畳み込みレイヤーの後に密なレイヤーを追加しようとしましたが、レイヤーを平坦化しませんでした。今それは動作します! – Eskahndor

+1

畳み込みレイヤー(1を合計するチャンネル)のSoftmaxは、各チャンネルがクラスである画像セグメンテーションタスクに適しています。 –

1

softmax最後の軸にアクティブ化が適用されます。

model.summary()をご覧ください。出力の形状は(None, 3, 3, 1)です。

最終軸に1つの要素しかない場合、softmax出力は常に1になります。

合計する軸を1つ選択してから、出力を正しく再構成する必要があります。

#your last convolutional layer, without the activation: 
model.add(Conv2D(3, (1, 1), kernel_initializer='normal', data_format='channels_first')) 

#a permute layer to move the channels to the last position: 
model.add(Permute((2,3,1))) 

#the softmax, now considering that channels sum 1. 
model.add(Activation('softmax')) 

しかし、あなたの目的は、全体の結果は1を加算していることであるならば、あなたはFlatten()を追加する必要があります:あなたはソフトマックスは、3つのチャネルを考慮したい場合たとえば、あなたは最終的な位置にこれらのチャネルを移動する必要がありますPermute()の代わりに


ケラスはchannels_lastとの作業に適しているようです。この場合、余分な作業を必要とせずにsoftmaxが自動的にチャンネルに適用されます。

関連する問題