我想在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不起作用。可能是因为输入形状错误了吗?
答案 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的结构通常如下所示:
将softmax应用于卷积层是没有意义的。