TensorFlow 1.x中绘制训练/验证精度与损失曲线的方法
给你的TensorFlow 1.x RNN训练代码添加训练曲线绘制功能
嘿,作为刚接触TensorFlow 1.x的新手,能写出这样的RNN训练代码已经很棒啦!要实现随训练轮次绘制精度和损失曲线,咱们只需要做几个小改动:导入绘图库、记录每轮的指标数据,最后用这些数据画图就行。
下面是修改后的完整代码,我已经标注了新增的部分:
# 新增:导入绘图库,Colab里自带matplotlib import matplotlib.pyplot as plt # 在Colab里让图像直接显示(可选,但很实用) %matplotlib inline import tensorflow as tf # hyperparameters n_neurons = 128 learning_rate = 0.001 batch_size = 128 n_epochs = 5 # parameters n_steps = 32 n_inputs = 32 n_outputs = 10 # build a rnn model X = tf.placeholder(tf.float32, [None, n_steps, n_inputs]) y = tf.placeholder(tf.int32, [None]) cell = tf.nn.rnn_cell.BasicRNNCell(num_units=n_neurons) output, state = tf.nn.dynamic_rnn(cell, X, dtype=tf.float32) logits = tf.layers.dense(state, n_outputs) cross_entropy = tf.nn.sparse_softmax_cross_entropy_with_logits(labels=y, logits=logits) loss = tf.reduce_mean(cross_entropy) optimizer = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(loss) prediction = tf.nn.in_top_k(logits, y, 1) accuracy = tf.reduce_mean(tf.cast(prediction, tf.float32)) # input data # 假设你已经有x_train, y_train, x_test, y_test的定义 x_test = x_test.reshape([-1, n_steps, n_inputs]) # 新增:初始化四个列表,用来保存每轮的训练/验证指标 train_loss_history = [] train_acc_history = [] test_loss_history = [] test_acc_history = [] # initialize the variables init = tf.global_variables_initializer() # train the model with tf.Session() as sess: sess.run(init) n_batches = 100 for epoch in range(n_epochs): for batch in range(n_batches): # 这里注意:原代码里每次batch都用整个x_train和y_train?应该是取batch数据哦 # 如果你有生成batch的代码,记得替换这里,比如用x_train[batch*batch_size:(batch+1)*batch_size] sess.run(optimizer, feed_dict={X: x_train, y: y_train}) # 获取当前轮次的训练和验证指标 loss_train, acc_train = sess.run([loss, accuracy], feed_dict={X: x_train, y: y_train}) loss_test, acc_test = sess.run([loss, accuracy], feed_dict={X: x_test, y: y_test}) # 新增:把指标存入历史列表 train_loss_history.append(loss_train) train_acc_history.append(acc_train) test_loss_history.append(loss_test) test_acc_history.append(acc_test) print('Epoch: {}, Train Loss: {:.3f}, Train Acc: {:.3f}'.format(epoch + 1, loss_train, acc_train)) print('Test Loss: {:.3f}, Test Acc: {:.3f}\n'.format(loss_test, acc_test)) # 新增:绘制训练曲线 plt.figure(figsize=(12, 5)) # 绘制损失曲线 plt.subplot(1, 2, 1) plt.plot(range(1, n_epochs+1), train_loss_history, label='Train Loss') plt.plot(range(1, n_epochs+1), test_loss_history, label='Test Loss') plt.title('Loss Curve') plt.xlabel('Epochs') plt.ylabel('Loss') plt.legend() # 绘制精度曲线 plt.subplot(1, 2, 2) plt.plot(range(1, n_epochs+1), train_acc_history, label='Train Accuracy') plt.plot(range(1, n_epochs+1), test_acc_history, label='Test Accuracy') plt.title('Accuracy Curve') plt.xlabel('Epochs') plt.ylabel('Accuracy') plt.legend() plt.tight_layout() plt.show()
几个小提醒:
- 原代码里的batch训练部分有点小问题:每次循环都用整个
x_train和y_train,这其实不是真正的batch训练哦。如果你的数据集很大,记得改成按batch_size取切片,或者用生成器来生成batch数据,不然训练效率会很低,也容易过拟合。 - 如果你运行代码时发现图像没显示,确保开头的
%matplotlib inline已经加上,这是Colab里让matplotlib图像直接在单元格中显示的魔法命令。 - 曲线的样式可以自己调整,比如改变线条颜色、添加标记点,只需要修改
plt.plot的参数就行(比如加marker='o')。
内容的提问来源于stack exchange,提问作者rajpal
相关产品推荐
相关产品推荐

