自定义 Keras binary_crossentropy 损失函数不起作用

约安

我正在尝试重新定义 keras 的 binary_crossentropy 损失函数,以便我可以对其进行自定义,但它给我的结果与现有的结果不同。

我将 TF 1.13.1 与 Keras 2.2.4 一起使用。

我浏览了 Keras 的 github 代码。我的理解是 model.compile(optimizer='adam', loss='binary_crossentropy', metrics =['accuracy']) 中的损失是在 loss.py 中定义的,使用了在 tensorflow_backend.py 中定义的 binary_crossentropy。

我运行了一个虚拟数据和模型来测试它。以下是我的发现:

  • 自定义损失函数输出与 keras 相同的结果
  • 在 keras 模型中使用自定义损失会给出不同的精度结果
from numpy.random import seed
seed(1)
from tensorflow import set_random_seed
set_random_seed(2)

import tensorflow as tf
from keras import losses
import keras.backend as K
import keras.backend.tensorflow_backend as tfb
from keras.layers import Dense
from keras import Sequential

#Dummy check of loss output
def binary_crossentropy_custom(y_true, y_pred):
    return K.mean(binary_crossentropy_custom_tf(y_true, y_pred), axis=-1)

def binary_crossentropy_custom_tf(target, output, from_logits=False):
    """Binary crossentropy between an output tensor and a target tensor.

    # Arguments
        target: A tensor with the same shape as `output`.
        output: A tensor.
        from_logits: Whether `output` is expected to be a logits tensor.
            By default, we consider that `output`
            encodes a probability distribution.

    # Returns
        A tensor.
    """
    # Note: tf.nn.sigmoid_cross_entropy_with_logits
    # expects logits, Keras expects probabilities.
    if not from_logits:
        # transform back to logits
        _epsilon = tfb._to_tensor(tfb.epsilon(), output.dtype.base_dtype)
        output = tf.clip_by_value(output, _epsilon, 1 - _epsilon)
        output = tf.log(output / (1 - output))

    return tf.nn.sigmoid_cross_entropy_with_logits(labels=target,
                                                   logits=output)

logits = tf.constant([[-3., -2.11, -1.22],
                     [-0.33, 0.55, 1.44],
                     [2.33, 3.22, 4.11]])

labels = tf.constant([[1., 1., 1.], 
                      [1., 1., 0.], 
                      [0., 0., 0.]])

custom_sigmoid_cross_entropy_with_logits = binary_crossentropy_custom(labels, logits)
keras_binary_crossentropy = losses.binary_crossentropy(y_true=labels, y_pred=logits)

with tf.Session() as sess:
    print('CUSTOM sigmoid_cross_entropy_with_logits: ', sess.run(custom_sigmoid_cross_entropy_with_logits), '\n')
    print('KERAS keras_binary_crossentropy: ', sess.run(keras_binary_crossentropy), '\n')

#CUSTOM sigmoid_cross_entropy_with_logits:  [16.118095 10.886106 15.942386] 

#KERAS keras_binary_crossentropy:  [16.118095 10.886106 15.942386] 

#Dummy check of model accuracy

X_train = tf.random.uniform((3, 5), minval=0, maxval=1, dtype=tf.dtypes.float32)
labels = tf.constant([[1., 0., 0.], 
                      [0., 0., 1.], 
                      [1., 0., 0.]])

model = Sequential()
#First Hidden Layer
model.add(Dense(5, activation='relu', kernel_initializer='random_normal', input_dim=5))
#Output Layer
model.add(Dense(3, activation='sigmoid', kernel_initializer='random_normal'))

#I ran model.fit for each model.compile below 10 times using the same X_train and provide the range of accuracy measurement
# model.compile(optimizer='adam', loss='binary_crossentropy', metrics =['accuracy']) #0.748 < acc < 0.779
# model.compile(optimizer='adam', loss=losses.binary_crossentropy, metrics =['accuracy']) #0.761 < acc < 0.778
model.compile(optimizer='adam', loss=binary_crossentropy_custom, metrics =['accuracy']) #0.617 < acc < 0.663

history = model.fit(X_train, labels, steps_per_epoch=100, epochs=1)

我希望自定义损失函数能够提供类似的模型精度输出,但事实并非如此。任何想法?谢谢!

史努比博士

Keras 会accuracy根据损失自动选择要使用的实现,如果您使用自定义损失,这将不起作用。但在这种情况下,您可以明确使用正确的准确性,即binary_accuracy

model.compile(optimizer='adam', loss=binary_crossentropy_custom, metrics =['binary_accuracy'])

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

为什么我的Keras自定义损失函数不起作用?

来自分类Dev

自定义keras损失

来自分类Dev

Keras上的自定义损失功能

来自分类Dev

在Keras建立自定义损失

来自分类Dev

Keras 中自定义损失的输出

来自分类Dev

Keras,Python中的自定义损失函数?

来自分类Dev

Keras模型-在自定义损失函数中获取输入

来自分类Dev

在CNN的Keras自定义损失函数中处理数据

来自分类Dev

Keras:无法在模型中使用自定义损失函数

来自分类Dev

自定义损失函数,Keras \\ ValueError:无渐变

来自分类Dev

基于输入数据的Keras中的自定义损失函数

来自分类Dev

keras 中的加权 mse 自定义损失函数 - 自定义权重

来自分类Dev

CNN仅针对binary_crossentropy损失函数收敛而在测试数据集上失败

来自分类Dev

Keras:渐变问题,自定义图层在顺序模型中不起作用

来自分类Dev

如何为Keras使用自定义损失功能

来自分类Dev

以y_true取决于y_pred的方式自定义Keras的损失函数

来自分类Dev

琐碎的自定义Keras损失函数导致精度指标失败

来自分类Dev

如何编写具有加权平均的keras自定义f1损失函数?

来自分类Dev

Keras的自定义损失函数中y_true的大小

来自分类Dev

Tensorflow 2:自定义损失函数的工作原理与原始Keras SparseCategoricalCrossentropy不同

来自分类Dev

在keras自定义损失函数中获取训练数据形状

来自分类Dev

y_pred的自定义损失函数Keras仅高于某个阈值

来自分类Dev

Keras自定义损失函数InvalidArgumentError:In [1]不是矩阵。相反,它具有形状[]

来自分类Dev

Keras自定义损失函数:tf.function-decorated中的ValueError

来自分类Dev

张量的矢量化运算,而不是在keras自定义损失函数中使用for循环

来自分类Dev

在Keras / Tensorflow自定义损失函数中使用其他**可**变量

来自分类Dev

Keras模型的自定义损失函数给出错误答案

来自分类Dev

Keras中的自定义损失函数,使用掩码数组作为输入

来自分类Dev

如何在Keras自定义损失函数中使用张量?

Related 相关文章

  1. 1

    为什么我的Keras自定义损失函数不起作用?

  2. 2

    自定义keras损失

  3. 3

    Keras上的自定义损失功能

  4. 4

    在Keras建立自定义损失

  5. 5

    Keras 中自定义损失的输出

  6. 6

    Keras,Python中的自定义损失函数?

  7. 7

    Keras模型-在自定义损失函数中获取输入

  8. 8

    在CNN的Keras自定义损失函数中处理数据

  9. 9

    Keras:无法在模型中使用自定义损失函数

  10. 10

    自定义损失函数,Keras \\ ValueError:无渐变

  11. 11

    基于输入数据的Keras中的自定义损失函数

  12. 12

    keras 中的加权 mse 自定义损失函数 - 自定义权重

  13. 13

    CNN仅针对binary_crossentropy损失函数收敛而在测试数据集上失败

  14. 14

    Keras:渐变问题,自定义图层在顺序模型中不起作用

  15. 15

    如何为Keras使用自定义损失功能

  16. 16

    以y_true取决于y_pred的方式自定义Keras的损失函数

  17. 17

    琐碎的自定义Keras损失函数导致精度指标失败

  18. 18

    如何编写具有加权平均的keras自定义f1损失函数?

  19. 19

    Keras的自定义损失函数中y_true的大小

  20. 20

    Tensorflow 2:自定义损失函数的工作原理与原始Keras SparseCategoricalCrossentropy不同

  21. 21

    在keras自定义损失函数中获取训练数据形状

  22. 22

    y_pred的自定义损失函数Keras仅高于某个阈值

  23. 23

    Keras自定义损失函数InvalidArgumentError:In [1]不是矩阵。相反,它具有形状[]

  24. 24

    Keras自定义损失函数:tf.function-decorated中的ValueError

  25. 25

    张量的矢量化运算,而不是在keras自定义损失函数中使用for循环

  26. 26

    在Keras / Tensorflow自定义损失函数中使用其他**可**变量

  27. 27

    Keras模型的自定义损失函数给出错误答案

  28. 28

    Keras中的自定义损失函数,使用掩码数组作为输入

  29. 29

    如何在Keras自定义损失函数中使用张量?

热门标签

归档