如何在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
相关产品推荐
相关产品推荐

