【问题标题】:one-hot encoded Keras CNN output not as expectedone-hot 编码的 Keras CNN 输出不如预期
【发布时间】:2018-09-24 08:45:29
【问题描述】:

我有一个简单的问题要解决,其中有 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])

谢谢。

【问题讨论】:

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


    【解决方案1】:

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

    如果 softmax 的输入包含两个相等的最大值,您可以获得两个 softmax 的最大值。在极少数情况下,卷积滤波器产生相同的值(logits)是可能的。否则,只有一个最大值,然后,预测一个类。

    来自github 的示例:

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

    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 output of Conv2D

    【讨论】:

    • 是的,我知道问题出在我使用的 Softmax 激活上。但是,您可能会建议我做什么作为获得输出的解决方案。谢谢。
    • @alireSaRanjbar 通常任务类似于您通过多个二元分类器解决的任务,每个类别的图像一个。有理由避免这种方式吗?
    猜你喜欢
    • 2021-08-05
    • 2019-07-14
    • 2017-12-09
    • 2020-08-16
    • 2019-04-21
    • 2020-06-20
    • 2021-10-07
    • 2018-09-11
    • 2017-06-21
    相关资源
    最近更新 更多