代码之家  ›  专栏  ›  技术社区  ›  Jane Sully

二进制交叉熵损失可以用于非二进制数据吗?

  •  0
  • Jane Sully  · 技术社区  · 4 年前

    我只使用 Dense 层。

    iLayer = Input ((784,))
    layer1 = Dense(128, activation='relu' ) (iLayer)
    layer2 = Dense(64, activation='relu') (layer1)
    layer3 = Dense(28, activation ='relu') (layer2)
    layer4 = Dense(64, activation='relu') (layer3)
    layer5 = Dense(128, activation='relu' ) (layer4)
    layer6 = Dense(784, activation='softmax' ) (layer5)
    model = Model (iLayer, layer6)
    model.compile(loss='binary_crossentropy', optimizer='adam')
    
    (trainX, trainY), (testX, testY) =  mnist.load_data()
    print ("shape of the trainX", trainX.shape)
    trainX = trainX.reshape(trainX.shape[0], trainX.shape[1]* trainX.shape[2])
    print ("shape of the trainX", trainX.shape)
    model.fit (trainX, trainX, epochs=5, batch_size=100)
    

    问题:

    (一) softmax 提供概率分布。理解。这意味着,我有一个784个值的向量,概率在0和1之间。例如[0.02,0.03。。。。。最多784个项目],将所有784个元素相加得到1。

    2) 我不明白二进制交叉熵是如何处理这些值的。二进制交叉熵代表两个输出值,对吧?

    0 回复  |  直到 6 年前
        1
  •  26
  •   today    5 年前

    在自动编码器的上下文中,模型的输入和输出是相同的。因此,如果输入值在[0,1]范围内,则可以使用 sigmoid 作为最后一层的激活函数。否则,您需要为最后一层使用适当的激活函数(例如。 linear 默认值)。

    至于损失函数,它又回到输入数据的值。如果输入数据是 只有 在0和1之间 (而不是它们之间的值) ,那么 binary_crossentropy 作为损失函数是可以接受的。否则,您需要使用其他损失函数,例如 'mse' (即均方误差)或 'mae' (即平均绝对误差)。注意,如果输入值在范围内 [0,1] 你可以用 二进制交叉熵 ,因为它通常被使用(例如。 Keras autoencoder tutorial this paper ). 但是,不要期望损失值变为零,因为 当预测和标签都不是0或1时(无论它们是否相等),不返回零。 Here 是来自 Hugo Larochelle 他解释了自动编码器中使用的损耗函数(关于使用 二进制交叉熵 输入在[0,1]范围内时从 5:30 )

    trainX = trainX.astype('float32')
    trainX /= 255.
    

    现在值应该在[0,1]范围内。所以 可以用作激活函数和 二进制交叉熵 mse 作为损失函数。


    即使真实标签值(即地面真实值)在[0,1]范围内,也可以使用?

    bce_loss = -y*log(p) - (1-y)*log(1-p)
    

    哪里 y 才是真正的标签 p 是预测值。让我们考虑一下 是的 作为固定的,看看有什么价值 p p (我假设 log

    bce_loss_derivative = -y*(1/p) - (1-y)*(-1/(1-p)) = 0 =>
                          -y/p + (1-y)/(1-p) = 0 =>
                          -y*(1-p) + (1-y)*p = 0 =>
                          -y + y*p + p - y*p = 0 =>
                           p - y = 0 => y = p
    

    如你所见,二进制交叉熵在 y=p