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

如何在Google Colab中打印TensorFlow分类器训练的损失与步数

问题:Colab中TensorFlow Estimator训练无损失和步数输出的解决办法

我正在跟随FreeCodeCamp机器学习课程,使用以下TensorFlow代码训练鸢尾花分类数据集:

CSV_COLUMN_NAMES = ['SepalLength', 'SepalWidth', 'PetalLength', 'PetalWidth', 'Species']
SPECIES = ['Setosa', 'Versicolor', 'Virginica'] # 定义后续要用的常量

train_path = tf.keras.utils.get_file(
    "iris_training.csv", 
    "https://storage.googleapis.com/download.tensorflow.org/data/iris_training.csv")
test_path = tf.keras.utils.get_file(
    "iris_test.csv", 
    "https://storage.googleapis.com/download.tensorflow.org/data/iris_test.csv")

# 用Keras(TensorFlow内置模块)获取数据集并读取为pandas DataFrame
train = pd.read_csv(train_path, names=CSV_COLUMN_NAMES, header=0)
test = pd.read_csv(test_path, names=CSV_COLUMN_NAMES, header=0) 

train.rename(columns={'120': 'SepalLength', '4': 'SepalWidth',
                      'setosa': 'PetalLength', 'versicolor': 'PetalWidth',
                      'virginica': 'Species'}, inplace=True)
test.rename(columns={'30': 'SepalLength', '4': 'SepalWidth',
                     'setosa': 'PetalLength', 'versicolor': 'PetalWidth',
                     'virginica': 'Species'}, inplace=True)

train_y = train.pop('Species')
test_y = test.pop('Species')
train.head() # 此时Species列已被移除

def input_fn(features, labels, training=True, batch_size=256):
  # 将输入转换为Dataset
  dataset = tf.data.Dataset.from_tensor_slices((dict(features), labels))

  # 训练模式下打乱并重复数据
  if training:
    dataset = dataset.shuffle(1000).repeat()
  return dataset.batch(batch_size)

# 特征列定义输入的使用方式
my_feature_columns = [] 
for key in train.keys():
  my_feature_columns.append(tf.feature_column.numeric_column(key=key))

print(my_feature_columns) 

# 构建包含2个隐藏层(30和10个节点)的DNN模型
classifier = tf.estimator.DNNClassifier(
  feature_columns=my_feature_columns,  
  hidden_units=[30, 10], # 两个隐藏层分别有30和10个节点
  n_classes=3) # 模型需要区分3个类别

classifier.train(
    input_fn=lambda: input_fn(train, train_y, training=True),
    steps=5000) # 定义训练的总步数

# TODO: 打印损失和步数

本地运行时classifier.train()会在控制台输出训练步数和损失值,但在Google Colab中无此输出,请问如何在Colab中打印训练过程中的损失与步数?


解决办法

方法一:调整TensorFlow日志级别

Colab默认调低了TensorFlow的日志输出级别,只需在代码开头添加日志配置,即可让训练过程的信息正常显示:

import tensorflow as tf
tf.get_logger().setLevel('INFO')

添加后,Estimator训练时的步数、损失等日志会直接输出到Colab控制台。

方法二:自定义Hook捕获训练指标

如果需要自定义输出频率或格式,可以通过SessionRunHook来捕获训练过程中的损失和步数:

import tensorflow as tf

class TrainingLoggerHook(tf.estimator.SessionRunHook):
    def begin(self):
        self.step = 0

    def before_run(self, run_context):
        # 捕获总损失值
        return tf.estimator.SessionRunArgs(tf.compat.v1.losses.get_total_loss())

    def after_run(self, run_context, run_values):
        self.step += 1
        # 每500步打印一次,可以根据需求修改间隔
        if self.step % 500 == 0:
            loss_value = run_values.results
            print(f"训练步数: {self.step}, 当前损失: {loss_value:.4f}")

# 训练时传入自定义Hook
classifier.train(
    input_fn=lambda: input_fn(train, train_y, training=True),
    steps=5000,
    hooks=[TrainingLoggerHook()]
)

方法三:切换到Keras API(推荐)

TensorFlow Estimator API相对老旧,Keras API在Colab中的日志输出更直观,使用也更简洁。改用Keras实现后,训练过程会自动输出步数和损失:

# 构建Keras序列模型
model = tf.keras.Sequential([
    tf.keras.layers.Dense(30, activation='relu', input_shape=(4,)),
    tf.keras.layers.Dense(10, activation='relu'),
    tf.keras.layers.Dense(3, activation='softmax')
])

# 编译模型
model.compile(optimizer='adam',
              loss='sparse_categorical_crossentropy',
              metrics=['accuracy'])

# 训练模型,自动输出每轮的损失和准确率
history = model.fit(train, train_y, epochs=50, batch_size=256)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 13:45:49