Neural network Keras多二进制输出

Neural network Keras多二进制输出,neural-network,deep-learning,keras,Neural Network,Deep Learning,Keras,有人能帮我更好地理解这个问题吗 我必须训练一个神经网络,它应该输出200个相互独立的类别,每个类别的百分比从0到1。在我看来,这似乎是一个binary\u crossentropy问题,但我在互联网上看到的每一个例子都使用binary\u crossentropy进行单一输出。因为我的输出应该是200,如果我应用binary\u crossentropy,那是正确的吗 这就是我的想法,这是一个正确的方法还是我应该改变它 inputs = Input(shape=(input_shape,)) h

有人能帮我更好地理解这个问题吗

我必须训练一个神经网络,它应该输出200个相互独立的类别,每个类别的百分比从0到1。在我看来,这似乎是一个
binary\u crossentropy
问题,但我在互联网上看到的每一个例子都使用
binary\u crossentropy
进行单一输出。因为我的输出应该是200,如果我应用
binary\u 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'])

当存在多个类时,应使用分类的交叉熵。请参阅。

有关多类别分类问题,您应该使用
分类交叉熵
而不是
二进制交叉熵
。这样,当您的模型对输入进行分类时,它将给出所有200个类别之间的概率分布。接收概率最高的类别将是该特定输入的输出

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


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

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

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

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

    adad = optimizers.Adadelta()
模型输出将成为不同独立输出的列表

    model = Model(inputs, [output_1, output_2])
您在一个列表中为每个输出使用一个损失函数来编译模型。(事实上,如果您只给出一种损失函数,我相信它将独立地应用于所有输出)


我知道这是一个老生常谈的问题,但我相信公认的答案是不正确的,投票最多的答案是可行的,但不是最优的。原始海报的方法是解决这个问题的正确方法。他的输出是从0到1的200个独立概率,因此他的输出层应该是一个密集层,有200个神经元和一个乙状结肠活动分层。这不是一个分类的交叉熵问题,因为它不是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'])

我如何使用
分类交叉熵返回百分比?有200个类,每个类的百分比可以在0到1之间?这些类不是相互排斥的,这意味着我需要所有的200个。我认为你的方法是可以的。你可以搜索多标签示例,而不是二进制分类示例。我正在寻找的是对于is 200个类别,每个类别的百分比在0和1之间。不是所有200个类别的总和都是1。那么
categorical\u crossentropy
会有帮助吗?
    model.compile(optimizer=adad, loss=['binary_crossentropy','binary_crossentropy'])
        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'])