【问题标题】:maximizing binary cross_entropy in a keras model在 keras 模型中最大化二进制交叉熵
【发布时间】:2020-04-09 22:51:15
【问题描述】:

我不知道在 keras 模型中创建一个最大化二元 cross_entropy 损失的模型。

研究:

1.https://intellipaat.com/community/17707/how-to-maximize-loss-function-in-keras 说:

只需将损失乘以 -1 即可最大化损失函数,同时尝试使其最小化:

new_loss = -loss

但使用:

model.compile(loss=-1 * 'binary_crossentropy', optimizer=adam_optimizer())

导致这个错误:

ValueError: The model cannot be compiled because it has no loss to optimize.
  1. https://stats.stackexchange.com/questions/303229/why-does-keras-binary-crossentropy-loss-function-return-wrong-values

给了我一个近似于 keras binary_crossentropy 损失的自定义函数:

import keras.backend as K
def binary_crossentropy(y_true, y_pred):
    result = []
    for i in range(len(y_pred)):
        y_pred[i] = [max(min(x, 1 - K.epsilon()), K.epsilon()) for x in y_pred[i]]
        result.append(-np.mean([y_true[i][j] * math.log(y_pred[i][j]) + (1 - y_true[i][j]) * math.log(1 - y_pred[i][j]) for j in range(len(y_pred[i]))]))
    return np.mean(result)

但我不能使用它,因为它会导致错误:

len is not well defined for symbolic Tensors. (43_54/Sigmoid:0) Please call `x.shape` rather than `len(x)` for shape information.

当我用.shape[0]替换len

我得到另一个错误:

__index__ returned non-int (type NoneType)

我用其他几种方式修改了语法,但似乎没有任何效果。 有什么想法吗?

python 3.6

张量流 1.15

keras 2.3.1

【问题讨论】:

  • 尝试使用 model.compile(optimizer='adam', loss=-1 *tf.keras.losses.BinaryCrossentropy(from_logits=True), metrics=['accuracy'])

标签: tensorflow keras deep-learning


【解决方案1】:

您只需要根据 keras 实现定义一个新的损失:

def neg_binary_crossentropy(y_true, y_pred):
    return -1.0 * keras.losses.binary_crossentropy(y_true, y_pred)

然后在model.compile中使用:

model.compile(loss=neg_binary_crossentropy, optimizer="adam")

【讨论】:

    猜你喜欢
    • 2019-07-13
    • 1970-01-01
    • 2020-09-30
    • 1970-01-01
    • 2018-11-03
    • 2018-11-28
    • 2018-03-12
    • 2021-07-17
    • 2020-08-27
    相关资源
    最近更新 更多