使用matplotlib绘制训练和测试准确率及损失图

版权申诉
5星 · 超过95%的资源 0 下载量 18 浏览量 更新于2024-10-15 收藏 144KB RAR 举报
资源摘要信息: "使用matplotlib绘制训练集和测试集的准确率(accuracy)和损失(loss)图表" 在深度学习和机器学习项目中,模型的性能通常通过其在训练集和测试集上的准确率和损失来评估。准确率表示模型正确预测的样本比例,而损失则是模型预测误差的度量。通常,准确率越高、损失越低,表明模型的性能越好。在模型训练过程中,监控这两个指标的变化对于调试模型、避免过拟合或欠拟合以及优化模型参数至关重要。 要实现使用matplotlib绘制训练集和测试集的准确率和损失图表,你需要准备或生成两个数据集:一个是模型在训练过程中对训练集的性能评估,另一个是模型在训练过程中对测试集的性能评估。这些数据通常以一系列的值的形式出现,每个值对应于训练或测试过程中的一个迭代(Epoch)。 使用matplotlib绘制图表的基本步骤如下: 1. 准备数据:你需要收集或记录模型在每个epoch的训练和测试准确率以及损失值。 2. 导入matplotlib库:在Python脚本中导入matplotlib.pyplot模块,通常使用import matplotlib.pyplot as plt的简短形式。 3. 绘制图表:使用plt.plot()函数来绘制准确率和损失值。通常你会绘制两个子图,一个用于准确率,一个用于损失。 4. 自定义图表:你可以添加图表的标题、轴标签、图例、网格线等,以提高图表的可读性和美观性。 5. 显示图表:使用plt.show()函数来展示图表。 以下是一段示例代码,展示了如何使用matplotlib绘制训练和测试集的准确率和损失图表: ```python import matplotlib.pyplot as plt # 假设train_acc, test_acc, train_loss, test_loss是已经收集好的数据,每个列表中存储了对应的值 train_acc = [0.7, 0.75, 0.8, 0.82, 0.85] test_acc = [0.68, 0.74, 0.78, 0.81, 0.83] train_loss = [0.4, 0.35, 0.3, 0.28, 0.25] test_loss = [0.42, 0.37, 0.33, 0.31, 0.28] epochs = range(1, len(train_acc) + 1) # 绘制准确率图 plt.figure(figsize=(12, 6)) plt.subplot(1, 2, 1) plt.plot(epochs, train_acc, label='Training Accuracy') plt.plot(epochs, test_acc, label='Test Accuracy') plt.title('Training and Test Accuracy') plt.xlabel('Epoch') plt.ylabel('Accuracy') plt.legend() # 绘制损失图 plt.subplot(1, 2, 2) plt.plot(epochs, train_loss, label='Training Loss') plt.plot(epochs, test_loss, label='Test Loss') plt.title('Training and Test Loss') plt.xlabel('Epoch') plt.ylabel('Loss') plt.legend() # 显示图表 plt.tight_layout() plt.show() ``` 在上述代码中,我们首先导入了matplotlib.pyplot,并且准备了训练集和测试集在不同epoch的准确率和损失数据。接着,我们创建了一个图表,其中包含两个子图,分别展示了准确率和损失的变化。每个子图中,我们用不同的线条表示了训练集和测试集的数据,并为这些线条添加了图例。最后,我们使用plt.tight_layout()确保图表布局合理,并使用plt.show()显示图表。 在实际应用中,准确率和损失图表可以帮助我们快速识别模型训练过程中的趋势,例如是否存在过拟合(训练集准确率不断上升而测试集准确率停滞或下降)、欠拟合(训练和测试集的准确率都很低)或收敛(训练和测试集的损失值趋向稳定)。这些信息对于调整模型架构、优化算法参数以及改进数据预处理等环节都至关重要。

# coding: utf-8 import sys, os sys.path.append(os.pardir) # 为了导入父目录的文件而进行的设定 import numpy as np import matplotlib.pyplot as plt from dataset.mnist import load_mnist from two_layer_net import TwoLayerNet # 读入数据 (x_train, t_train), (x_test, t_test) = load_mnist(normalize=True, one_hot_label=True) network = TwoLayerNet(input_size=784, hidden_size=50, output_size=10) iters_num = 10000 # 适当设定循环的次数 train_size = x_train.shape[0] batch_size = 100 learning_rate = 0.1 train_loss_list = [] train_acc_list = [] test_acc_list = [] iter_per_epoch = max(train_size / batch_size, 1) for i in range(iters_num): batch_mask = np.random.choice(train_size, batch_size) x_batch = x_train[batch_mask] t_batch = t_train[batch_mask] # 计算梯度 #grad = network.numerical_gradient(x_batch, t_batch) grad = network.gradient(x_batch, t_batch) # 更新参数 for key in ('W1', 'b1', 'W2', 'b2'): network.params[key] -= learning_rate * grad[key] loss = network.loss(x_batch, t_batch) train_loss_list.append(loss) if i % iter_per_epoch == 0: train_acc = network.accuracy(x_train, t_train) test_acc = network.accuracy(x_test, t_test) train_acc_list.append(train_acc) test_acc_list.append(test_acc) print("train acc, test acc | " + str(train_acc) + ", " + str(test_acc)) # 绘制图形 markers = {'train': 'o', 'test': 's'} x = np.arange(len(train_acc_list)) plt.plot(x, train_acc_list, label='train acc') plt.plot(x, test_acc_list, label='test acc', linestyle='--') plt.xlabel("epochs") plt.ylabel("accuracy") plt.ylim(0, 1.0) plt.legend(loc='lower right') plt.show()什么意思

2023-07-09 上传
2023-05-29 上传