【问题标题】:tf.keras.losses.categorical_crossentropy() 不输出它应该输出的内容
【发布时间】:2022-01-22 07:40:32
【问题描述】:

我正在尝试用 3 个类训练分类器 CNN。我正在尝试解决我的损失函数。我正在测试tf.keras.losses.CategoricalCrossentropy()tf.keras.losses.categorical_crossentropy().numpy()。我正在关注the tensorflow documentation 的独立使用指南。

我认为我没有得到应有的正确输出。 当我输入y_true=[0.,1.,0.]y_pred=[1.,0.,0.] 时,我预计会丢失无穷大(程序中的输出:nan)。但是,我收到的输出是16.118095。当分类与标签(即y_true=[1.,0.,0.]y_pred=[1.,0.,0.])对齐时,输出为1.192093e-07,即使我期望一个完美的0。

我真的对这种行为感到困惑。同样,对于 1 个长向量情况:y_true=[1.]y_pred=[0.],损失为 16.118095,同样,当分类对齐 y_true=[1.]y_pred=[1.] 时,我收到 1.192093e-07y_true=[0.]y_pred=[0.]结果是nan

我认为总结我得到的结果、我期望的结果以及我输入到损失函数中的值会使事情更具可读性,所以我将在下面这样做:

y_true y_pred Actual Output What I Expect
[0.,1.,0.] [1.,0.,0.] 16.118095 nan or infinity
[1.,0.,0.] [1.,0.,0.] 1.192093e-07 True 0
[0.,1.] [1.,0.] 16.118095 nan or infinity
[1.,0.] [1.,0.] 1.192093e-07 True 0
[1.] [0] nan or infinity nan or infinity
[1.] [1.] 1.192093e-07 True 0

如果这是一个微不足道的问题,我很抱歉,但我真的不知道为什么我会得到我得到的结果。我认为出了点问题,因为我只有 16 岁而不是无穷大,但如果没有任何问题,我希望得到保证。如果我错了,我非常感谢您的指正。

【问题讨论】:

    标签: python tensorflow keras deep-learning loss-function


    【解决方案1】:

    原因是tf.keras.losses.categorical_crossentropy 在等于一或零时对y_pred 应用了一个小偏移量 (1e-7),这就是为什么在您的情况下您看不到预期的输出。

    import tensorflow as tf
    
    def categorical_crossentropy(y_true, y_pred, clip=False):
        if clip == True:
            y_pred = tf.clip_by_value(y_pred, 1e-7, 1 - 1e-7)
        return - tf.experimental.numpy.nansum(y_true * tf.math.log(y_pred))
    
    y_true = [0., 1., 0.]
    y_pred = [1., 0., 0.]
    
    print(tf.keras.losses.categorical_crossentropy(y_true, y_pred).numpy())
    # 16.118095
    
    print(categorical_crossentropy(y_true, y_pred, clip=True).numpy())
    # 16.118095
    
    print(categorical_crossentropy(y_true, y_pred, clip=False).numpy())
    # inf
    
    y_true = [1., 0., 0.]
    y_pred = [1., 0., 0.]
    
    print(tf.keras.losses.categorical_crossentropy(y_true, y_pred).numpy())
    # 1.1920929e-07
    
    print(categorical_crossentropy(y_true, y_pred, clip=True).numpy())
    # 1.1920929e-07
    
    print(categorical_crossentropy(y_true, y_pred, clip=False).numpy())
    # -0.0
    
    y_true = [0., 1., 0.]
    y_pred = [0.05, 0.95, 0.]
    
    print(tf.keras.losses.categorical_crossentropy(y_true, y_pred).numpy())
    # 0.051293306
    
    print(categorical_crossentropy(y_true, y_pred, clip=True).numpy())
    # 0.051293306
    
    print(categorical_crossentropy(y_true, y_pred, clip=False).numpy())
    # 0.051293306
    

    【讨论】:

    • 感谢您的彻底回复!如果我理解正确,数值差异是因为偏移量 tensorflow 自动包含,我得到了我应该得到的结果?
    • 是的,没错,您的代码没有任何问题,您得到的结果也符合预期。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-01
    • 1970-01-01
    • 2022-07-06
    • 1970-01-01
    • 1970-01-01
    • 2017-04-25
    • 2017-09-11
    相关资源
    最近更新 更多