Keras中的Softmax层返回1s的向量

时间:2017-10-16 13:31:24

标签: python keras softmax

我想在Keras中使用softmax图层作为输出构建CNN,但我只将其作为输出:

[[[[ 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不起作用。可能是因为输入形状错误了吗?

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

您的模型架构存在问题。如果你看一些流行的模型:

您会发现CNN的结构通常如下所示:

  1. 一些带有relu激活的卷积层
  2. 汇集层(即最大池,平均池等)
  3. 展开卷积图层
  4. 致密层
  5. 然后,softmax
  6. 将softmax应用于卷积层是没有意义的。