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

如何在TensorFlow 1.x版本中绘制训练与验证准确率及损失曲线?

在TensorFlow 1.x中绘制训练与验证的准确率、损失曲线

TensorFlow 1.x采用静态计算图模式,没有TF2里Keras训练后自动返回的history对象,所以得手动在训练循环里记录每一轮的训练/验证指标,之后用Matplotlib绘图的逻辑和你提供的TF2代码基本一致,核心差异在数据收集环节。

步骤1:训练时手动记录指标

在每轮epoch训练结束后,计算训练集的平均损失、准确率,再跑一遍验证集算出对应指标,把这些值分别存入列表保存。

示例1:TF1.14+兼容模式(接近TF2写法)

import tensorflow as tf
import matplotlib.pyplot as plt

# 假设已准备好训练/验证数据、定义好模型、优化器
# x_train, y_train, x_val, y_val = 你的数据集
# model = tf.keras.models.Sequential(...) 或自定义模型

# 初始化存储指标的列表
train_losses = []
train_accs = []
val_losses = []
val_accs = []
total_epochs = 34  # 和你TF2代码的epoch范围对应

for epoch in range(total_epochs):
    # 训练阶段:遍历训练批次,累加损失和准确率
    train_loss = 0.0
    train_acc = 0.0
    batch_num = 0
    for x_batch, y_batch in tf.data.Dataset.from_tensor_slices((x_train, y_train)).batch(32):
        with tf.GradientTape() as tape:
            logits = model(x_batch)
            loss = tf.reduce_mean(tf.losses.sparse_categorical_crossentropy(y_batch, logits))
        # 反向传播更新参数
        grads = tape.gradient(loss, model.trainable_variables)
        optimizer.apply_gradients(zip(grads, model.trainable_variables))
        
        # 计算当前批次准确率
        preds = tf.argmax(logits, axis=1)
        acc = tf.reduce_mean(tf.cast(tf.equal(preds, y_batch), tf.float32))
        
        train_loss += loss.numpy()
        train_acc += acc.numpy()
        batch_num += 1
    # 记录当前epoch的平均训练指标
    avg_train_loss = train_loss / batch_num
    avg_train_acc = train_acc / batch_num
    train_losses.append(avg_train_loss)
    train_accs.append(avg_train_acc)
    
    # 验证阶段:不更新参数,只计算指标
    val_loss = 0.0
    val_acc = 0.0
    val_batch_num = 0
    for x_val_batch, y_val_batch in tf.data.Dataset.from_tensor_slices((x_val, y_val)).batch(32):
        logits_val = model(x_val_batch)
        loss_val = tf.reduce_mean(tf.losses.sparse_categorical_crossentropy(y_val_batch, logits_val))
        preds_val = tf.argmax(logits_val, axis=1)
        acc_val = tf.reduce_mean(tf.cast(tf.equal(preds_val, y_val_batch), tf.float32))
        
        val_loss += loss_val.numpy()
        val_acc += acc_val.numpy()
        val_batch_num += 1
    avg_val_loss = val_loss / val_batch_num
    avg_val_acc = val_acc / val_batch_num
    val_losses.append(avg_val_loss)
    val_accs.append(avg_val_acc)
    
    # 打印当前epoch结果,方便监控
    print(f"Epoch {epoch+1}/{total_epochs} | 训练损失: {avg_train_loss:.4f} 训练准确率: {avg_train_acc:.4f} | 验证损失: {avg_val_loss:.4f} 验证准确率: {avg_val_acc:.4f}")

示例2:TF1原生Session模式

如果用的是更早版本的TF1,需要基于静态图和Session来实现,核心逻辑还是记录每轮指标:

import tensorflow as tf
import matplotlib.pyplot as plt

# 构建静态计算图
input_dim = 你的输入维度
x = tf.placeholder(tf.float32, shape=[None, input_dim])
y = tf.placeholder(tf.int32, shape=[None])
# 定义模型
logits = tf.layers.dense(x, units=10)  # 示例:全连接层输出10类
# 定义损失和准确率
loss = tf.reduce_mean(tf.losses.sparse_categorical_crossentropy(y, logits))
acc = tf.reduce_mean(tf.cast(tf.equal(tf.argmax(logits, axis=1), y), tf.float32))
# 定义优化器
train_op = tf.train.AdamOptimizer(learning_rate=0.001).minimize(loss)

# 初始化存储列表
train_losses = []
train_accs = []
val_losses = []
val_accs = []
total_epochs = 34

# 启动会话训练
with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    for epoch in range(total_epochs):
        # 训练循环
        train_loss = 0.0
        train_acc = 0.0
        batch_num = 0
        # 假设get_train_batches()是你自定义的获取训练批次的函数
        for x_batch, y_batch in get_train_batches():
            loss_val, acc_val, _ = sess.run([loss, acc, train_op], feed_dict={x: x_batch, y: y_batch})
            train_loss += loss_val
            train_acc += acc_val
            batch_num += 1
        avg_train_loss = train_loss / batch_num
        avg_train_acc = train_acc / batch_num
        train_losses.append(avg_train_loss)
        train_accs.append(avg_train_acc)
        
        # 验证循环
        val_loss = 0.0
        val_acc = 0.0
        val_batch_num = 0
        for x_val_batch, y_val_batch in get_val_batches():
            loss_val, acc_val = sess.run([loss, acc], feed_dict={x: x_val_batch, y: y_val_batch})
            val_loss += loss_val
            val_acc += acc_val
            val_batch_num += 1
        avg_val_loss = val_loss / val_batch_num
        avg_val_acc = val_acc / val_batch_num
        val_losses.append(avg_val_loss)
        val_accs.append(avg_val_acc)
        
        print(f"Epoch {epoch+1}/{total_epochs} | 训练损失: {avg_train_loss:.4f} 训练准确率: {avg_train_acc:.4f} | 验证损失: {avg_val_loss:.4f} 验证准确率: {avg_val_acc:.4f}")

步骤2:绘制曲线

收集完所有epoch的指标后,绘图代码和你提供的TF2代码几乎一样,只需要替换对应的列表名称:

绘制损失曲线

epoch_range = range(1, total_epochs+1)
plt.plot(epoch_range, train_losses, 'g', label='Training loss')
plt.plot(epoch_range, val_losses, 'b', label='Validation loss')
plt.title('Training and Validation Loss')
plt.xlabel('Epochs')
plt.ylabel('Loss')
plt.legend()
plt.show()

绘制准确率曲线

plt.plot(epoch_range, train_accs, 'g', label='Training Accuracy')
plt.plot(epoch_range, val_accs, 'b', label='Validation Accuracy')
plt.title('Training and Validation Accuracy')
plt.xlabel('Epochs')
plt.ylabel('Accuracy')
plt.legend()
plt.show()

核心差异说明

TF1.x没有自动记录指标的history对象,必须手动在训练循环里累加每批次的损失和准确率,算出每轮的平均值后存入列表;而绘图部分完全依赖Matplotlib,和TensorFlow版本无关,所以和TF2的绘图代码通用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 03:05:23