2017-10-16 70 views
1

我想建立在Keras一個CNN與SOFTMAX層作爲輸出的載體,但我只得到這個作爲輸出:SOFTMAX層返回1S

[[[[ 1.] 
    [ 1.] 
    [ 1.]]]] 

我的模型是建立像這樣:

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

您的模型架構有問題。如果你看一些流行款式:

你會發現,對於CNN的結構通常是這樣的:

  1. 一些卷積具有激活激活的層
  2. 匯合層(即最大彙集,平均彙集等)
  3. 平卷積層
  4. 緻密層
  5. 然後,SOFTMAX

它沒有意義的應用添加Softmax的卷積層。

+0

謝謝,我試圖在卷積層之後添加一個緻密層,但沒有將其弄平。現在它工作了! – Eskahndor

+1

卷積層中的Softmax(通道求和1)對於圖像分割任務來說是一個好主意,其中每個通道都是一個類。 –

1

softmax激活將應用於最後一個軸。

看着你的model.summary(),你的輸出形狀是(None, 3, 3, 1)

在最後一個軸上只有一個元素,您的softmax輸出將始終爲1。

您必須選擇要加總1的軸,然後正確地重新整形輸出。舉例來說,如果你想SOFTMAX考慮3個通道,則需要將這些通道移動到最終位置:

#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()而不是Permute()


Keras似乎更適合與channels_last一起工作。在這種情況下,softmax將自動應用於通道,無需額外的工作。