如何解决TensorFlow中两个BinaryCrossentropy损失相加报类型错误的问题
报错原因
你当前的代码仅实例化了BinaryCrossentropy损失类的对象,没有实际执行损失计算得到数值张量,两个类对象不支持加法运算,因此触发类型错误。
TensorFlow的损失类使用逻辑分为两步:
- 第一步:实例化损失类对象,传入
reduction、from_logits等全局配置参数 - 第二步:调用已实例化的损失对象,传入真实标签和预测值,得到可参与运算的张量格式损失值
正确实现方案
方案1:复用损失类实例(推荐,适合同一配置的损失多次调用的场景)
# 实例化损失函数对象,配置可全局复用 bce_loss = tf.losses.BinaryCrossentropy() # 调用对象计算得到损失张量 real_loss = bce_loss(tf.ones_like(train_images[0]), train_images[0]) fake_loss = bce_loss(tf.zeros_like(train_images[0]), train_images[0]) # 张量支持直接算术运算 total_loss = real_loss + fake_loss
如果需要保留每个样本的独立损失值,不需要全局平均,实例化时添加参数reduction='none'即可。
方案2:直接使用函数式接口
也可以直接调用TensorFlow提供的损失函数接口,省略实例化步骤:
real_loss = tf.losses.binary_crossentropy(tf.ones_like(train_images[0]), train_images[0]) fake_loss = tf.losses.binary_crossentropy(tf.zeros_like(train_images[0]), train_images[0]) total_loss = real_loss + fake_loss
内容的提问来源于stack exchange,提问作者Ali N777
相关产品推荐
相关产品推荐

