2017-10-16 54 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将自动应用于通道,无需额外的工作。