You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何解决Keras自定义损失函数训练时无法打印信息的问题?

解决Keras自定义损失函数中print训练时不输出的问题

这个问题我之前也碰到过,其实核心原因是TensorFlow的计算图执行模式在起作用:

当你编译模型时,Keras会把自定义损失函数转换成TensorFlow计算图的一部分,这时候Python原生的print()语句只会在构建计算图的阶段(也就是编译时)执行一次。而训练过程中,模型是在计算图上执行的,不会触发Python层面的print操作。

下面给你两个可行的解决办法:

1. 使用TensorFlow原生的tf.print()(推荐)

tf.print()是专门为计算图设计的打印操作,它会被嵌入到计算图节点中,训练时每次执行损失函数都会触发打印。修改你的损失函数如下:

import tensorflow as tf

def loss_yolo(self, y_true, y_pred):
    # 打印固定字符串,也可以打印张量信息
    tf.print('inside loss function...')
    # 如果需要查看张量的形状或数值,直接传入张量即可
    tf.print('y_true shape:', tf.shape(y_true), 'y_pred shape:', tf.shape(y_pred))
    
    # 这里必须补充你的损失计算逻辑,返回一个有效的损失张量
    # 示例:简单的均方误差(替换成你实际的YOLO损失计算)
    loss = tf.reduce_mean(tf.square(y_true - y_pred))
    return loss

注意:自定义损失函数必须返回一个标量损失张量(或者批量的损失张量),否则模型训练会报错,你之前的代码里缺少返回值,这一点也要补上哦。

2. 强制使用Eager Execution模式

如果你只是想调试,也可以强制让模型在Eager模式下运行,这样Python的print()就能正常工作。不过这种方式会牺牲一部分训练效率,不推荐在正式训练时使用:

# 在代码开头开启Eager模式(TensorFlow 2.x默认已经开启,但可以显式指定)
tf.config.run_functions_eagerly(True)

# 之后再定义模型、编译、训练
# ...

内容的提问来源于stack exchange,提问作者Shiro

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 03:32:08