Keras多个二进制输出

Rad*_*duS 5 neural-network deep-learning keras

有人可以帮我理解这个问题.

我必须训练一个神经网络,它应该输出200个相互独立的类别,这些类别中的每一个都是从0到1的百分比.对我而言,这似乎是一个binary_crossentropy问题,但我在互联网上看到的每个例子都使用binary_crossentropy单个输出.由于我的输出应该是200,如果我申请binary_crossentropy,这是正确的吗?

这是我的想法,是一个正确的方法还是我应该改变它?

inputs = Input(shape=(input_shape,))
hidden = Dense(2048, activation='relu')(inputs)
hidden = Dense(2048, activation='relu')(hidden)
output = Dense(200, name='output_cat', activation='sigmoid')(hidden)
model = Model(inputs=inputs, outputs=[output])
loss_map = {'output_cat': 'binary_crossentropy'}
model.compile(loss=loss_map, optimizer="sgd", metrics=['mae', 'accuracy'])
Run Code Online (Sandbox Code Playgroud)

dee*_*pit 7

要使用Keras优化多个独立的二进制分类问题(而不是可以使用categorical_crossentropy的多类别问题),您可以执行以下操作(此处我以2个独立的二进制输出为例,但您可以根据需要进行扩展) :

    inputs = Input(shape=(input_shape,))
    hidden = Dense(2048, activation='relu')(inputs)
    hidden = Dense(2048, activation='relu')(hidden)
    output = Dense(units = 2, activation='sigmoid')(hidden )
Run Code Online (Sandbox Code Playgroud)

在这里,您使用Keras的Lambda图层分割输出:

    output_1 = Lambda(lambda x: x[...,:1])(output)
    output_2 = Lambda(lambda x: x[...,1:])(output)

    adad = optimizers.Adadelta()
Run Code Online (Sandbox Code Playgroud)

您的模型输出将成为不同独立输出的列表

    model = Model(inputs, [output_1, output_2])
Run Code Online (Sandbox Code Playgroud)

您可以在列表中为每个输出使用一个损失函数编译模型.(事实上​​,如果你只提供一种损失功能,我相信它会独立地应用于所有输出)

    model.compile(optimizer=adad, loss=['binary_crossentropy','binary_crossentropy'])
Run Code Online (Sandbox Code Playgroud)


Tro*_*y D 5

我知道这是一个老问题,但我相信接受的答案是不正确的,最高票的答案是可行的但不是最佳的。原发帖人的方法是解决这个问题的正确方法。他的输出是从 0 到 1 的 200 个独立概率,所以他的输出层应该是一个具有 200 个神经元和一个 sigmoid 激活层的密集层。这不是 categorical_crossentropy 问题,因为它不是 200 个相互排斥的类别。此外,当使用单个密集层时,没有理由使用 lambda 层分割输出。原海报的方法是正确的。这是使用 Keras 界面执行此操作的另一种方法。

        model = Sequential()
        model.add(Dense(2048, input_dim=n_input, activation='relu'))
        model.add(Dense(2048, input_dim=n_input, activation='relu'))
        model.add(Dense(200, activation='sigmoid'))
        model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
Run Code Online (Sandbox Code Playgroud)


bla*_*tor -2

对于多类别分类问题,您应该使用categorical_crossentropy而不是binary_crossentropy。这样,当您的模型对输入进行分类时,它将给出所有 200 个类别之间的概率离散度。接收最高概率的类别将是该特定输入的输出。

当你打电话的时候你可以看到这个model.predict()。例如,如果您仅对一个输入调用此函数并打印结果,您将看到 200 个百分比的结果(总和为 1)。我们希望这 200 个百分比中的一个比其他百分比高得多,这表明该模型认为很有可能这是该特定输入的正确输出(类别)。

该视频可能有助于澄清预测片段。打印预测大约从 3:17 开始,但要获得完整的上下文,您需要从头开始。

  • 我正在寻找的是 200 个类别,每个类别的百分比在 0 到 1 之间。所有 200 个类别的总和不是 1。那么 `categorical_crossentropy` 有帮助吗? (6认同)