【问题标题】:multiple softmax classifications (Keras)多个softmax分类(Keras)
【发布时间】:2019-07-20 11:00:47
【问题描述】:

我正在尝试构建一个将输出 2 个标签的 CNN,其中每个标签有 12 种可能性;输入是一张图片。

换句话说,我想要的输出是 A(12 个选项中的一个)和 B(12 个不同选项中的一个)。

单独使用每个标签,首选当然是 softmax,但我找不到是否可以像那样做“多个 softmax”标签。

很明显,我可以输出 24 个神经元,使用 sigmoid 输出然后手动归一化,但是网络本质上不会耦合每组中的 12 个选项。

我正在编写我想要的伪伪代码,如果它存在的话:

model = Sequential()
model.add(Convolution2D(64, kernel_size=3,activation='relu', input_shape=image_shape))
model.add(Flatten())
model.add(Dense(256,activation='relu'))
# pseudo-pseudo-code
model.add(Dense((12,12),activation=('softmax','softmax'))) # <- here is where I would have liked 2 softmax outputs with 12 neurons in each

欢迎任何解决方案(我正在使用 Keras,但我很乐意使用任何其他包的解决方案,甚至自己编写代码)。

编辑:我还可以生成代表所有组合的 144 个输出,但我不确定这是否是一个好的解决方案 - 也非常欢迎对此发表任何评论

【问题讨论】:

    标签: python keras neural-network conv-neural-network


    【解决方案1】:

    我会使用带有 2 个输出的功能 API。指导在https://keras.io/getting-started/functional-api-guide/#multi-input-and-multi-output-models

    以下内容:

    input = Input(input_shape=image_shape)
    cnv = Convolution2d(...)(input)
    hidden = Dense(256, ...)(Flatten()(cnv))
    output1 = Dense(12, activation='softmax')(hidden)
    output2 = Dense(12, activation='softmax')(hidden)
    model = keras.models.Model(inputs=input, outputs=[output1, output2])
    model.compile(optimizer='sgd', loss=['binary_crossentropy', 'binary_crossentropy'],
                  loss_weights=[1., 1.])
    

    【讨论】:

    • 谢谢!这看起来确实像我正在寻找的东西 - 我会阅读指南并尝试实施它。
    • 以防万一有人来读这个,loss 应该是 categorical_crossentropy 而不是二进制
    • output2的输出是基于output1的输出吗?例如,你在 output1 得到标签“C”,那么第二个输出来自“C”的 12 个标签?如果每个输出 1 个标签有 12 个子标签。
    • @TheJokerAEZ 在上面的例子中 output2 不直接依赖于 output1;但没有什么能阻止您构建一个不同的示例,其中 output2 将 output1 作为(其中一个)输入。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-04-10
    • 1970-01-01
    • 2017-04-26
    • 1970-01-01
    • 2018-03-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多