binary/categorical crossentropy实现

import tensorflow as tf
from tensorflow import keras

print(tf.__version__)
# 2.0.0-beta0

def cross_entropy(x, y):
    return tf.reduce_sum(-y*tf.math.log(x), axis=-1)

def softmax_cross_entropy_with_logits(x, y):
    return tf.reduce_sum(-y * tf.math.log_softmax(x, axis=-1), axis=-1)

1. CategoricalCrossentropy(from_logits=True)

target = tf.convert_to_tensor([[1., 0., 0.], [0., 1., 0.], [0., 0., 1.]])
logit = tf.convert_to_tensor([[.9, .05, .05], [.5, .89, .6], [.05, .01, .94]])

cce = keras.losses.CategoricalCrossentropy(from_logits=True)
print(cce(target, logit))

prob = tf.math.softmax(logit, axis=-1)
print(tf.reduce_mean(cross_entropy(prob, target)))
# 0.6981444

 2.CategoricalCrossentropy(from_logits=False)

cce2 = keras.losses.CategoricalCrossentropy()
print(cce2(target, logit))

prob = logit/tf.reduce_sum(logit, axis=-1, keepdims=True)
"""
prob= [[0.9       , 0.05      , 0.05      ],
       [0.2512563 , 0.44723618, 0.30150756],
       [0.05      , 0.01      , 0.94      ]],
"""
print(tf.reduce_mean(cross_entropy(prob, target)))
# 0.32396814

3.BinaryCrossentropy(from_logits=False)

bce = keras.losses.BinaryCrossentropy()
print(bce(target, logit))

bce2 = keras.losses.binary_crossentropy
print(tf.math.reduce_mean(bce2(target, logit)))
# 0.22857076

pos = -tf.math.log(tf.boolean_mask(logit, tf.equal(target, 1.0)))
neg = -tf.math.log(tf.boolean_mask(1-logit, tf.equal(target, 0.0)))
print(tf.reduce_mean(tf.concat([pos,neg], axis=0)))

prob2 = tf.stack([logit, 1-logit], axis=-1)
target2 = tf.stack([target, 1-target], axis=-1)
print(cce2(target2, prob2))
# 0.22857088

4.BinaryCrossentropy(from_logits=True) 

bce3 = keras.losses.BinaryCrossentropy(from_logits=True)
print(bce3(target, logit))
# 0.6533409

prob3 = tf.stack([tf.math.sigmoid(logit), 1-tf.math.sigmoid(logit)], axis=-1)
target3 = tf.stack([target, 1-target], axis=-1)
print(cce2(target3, prob3))

print(tf.reduce_mean(cross_entropy(prob3, target3)))
# 0.6533408

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值