一键编码Keras CNN输出不符合预期

时间:2018-09-24 08:45:30

标签: python keras output conv-neural-network one-hot-encoding

我有一个简单的问题要解决,其中有32个与图像(1x2048)大小相同的滤镜。因此,滤波器的权重将与像素一乘一,而不是对像素进行卷积。

每个图像的输出是一个单矢量,例如[1,0,0,0]。当我对两个图像求和并进行预测时,输出将为[1,0,0,0]或[0,0,1,0]。

但是,由于我已将两个图像相加,因此我希望获得[1,0,1,0]作为输出,以了解图像中同时具有这两个类。但是,我不知道该怎么做才能达到我的期望以及问题可能出在哪里。

input_shape=(1,2048,1)
model = Sequential()
model.add(Conv2D(32, kernel_size=(1, 2048), strides=(1, 1),
activation='softmax', 
input_shape=input_shape,
kernel_regularizer=keras.regularizers.l1(L1regularization),
kernel_constraint=keras.constraints.non_neg()            ))

model.compile(loss=keras.losses.categorical_crossentropy,     
optimizer=optimizer,metrics=[metrics])

谢谢。

1 个答案:

答案 0 :(得分:0)

这是由于softmax的属性-softmax函数可最大化高值。然后,在大多数情况下,softmax函数只有一个最大值。 Softmax:

softmax

如果softmax的输入包含两个相等的higest值,则可以为softmax获得两个最大值。在非常罕见的情况下,通过卷积滤波器产生相同的值(对数)是可能的。否则,只有一个最大值,然后预测一个类。

来自github的示例:IMAGE

在最后一张图像的情况下,softmax产生两个相似的值。但是你不应该一直都这么期待。
如果要检查此假设,请通过Conv2D激活来检查linear层的输出。

model = Sequential()
model.add(Conv2D(32, kernel_size=(1, 2048), strides=(1, 1),
    activation='linear', 
    input_shape=input_shape,
    kernel_regularizer=keras.regularizers.l1(L1regularization),
    kernel_constraint=keras.constraints.non_neg()))
model.add(Activation('softmax'))

是相同的体系结构,但是您get outputConv2D的成员。