You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Matlab字母识别实验:如何绘制神经网络学习误差与识别误差曲线?

绘制神经网络学习误差与模式识别误差曲线的实操指南

嘿,针对你在字母识别神经网络实验里要绘制的两条曲线,我给你梳理下实操步骤和注意点——都是我平时做这类分类任务常用的方法:

先搞懂两条曲线的核心区别

  • 学习误差曲线:本质是模型在训练集上的损失值变化(比如交叉熵损失),反映模型对训练数据的拟合进度,每一轮训练后都可以记录。
  • 模式识别误差曲线:更贴合字母识别的任务场景,一般用验证/测试集上的分类错误率(错分的字母样本数占总样本数的比例)来绘制,反映模型的真实识别能力(泛化性),而非单纯的损失值。

第一步:收集关键数据

不管你用什么框架(PyTorch、Keras、TensorFlow),训练过程中必须记录这两组数据:

  1. 每一轮(Epoch)的平均训练损失:如果按批次训练,就把每一批的损失累加后除以训练集总样本数。
  2. 每一轮(或间隔几轮)的验证/测试错误率:在验证集上跑一遍模型,统计错分样本数,用1 - 正确率得到错误率。

举个PyTorch的记录示例(字母识别是分类任务,用交叉熵损失+分类错误率):

# 初始化存储列表
train_losses = []
val_error_rates = []

for epoch in range(20):  # 假设训练20轮
    # 训练阶段
    model.train()
    total_loss = 0.0
    for imgs, labels in train_dataloader:
        optimizer.zero_grad()
        outputs = model(imgs)
        loss = torch.nn.CrossEntropyLoss()(outputs, labels)
        loss.backward()
        optimizer.step()
        total_loss += loss.item() * imgs.size(0)
    avg_train_loss = total_loss / len(train_dataloader.dataset)
    train_losses.append(avg_train_loss)

    # 验证阶段(计算识别错误率)
    model.eval()
    correct = 0
    total = 0
    with torch.no_grad():
        for imgs, labels in val_dataloader:
            outputs = model(imgs)
            _, preds = torch.max(outputs, 1)
            correct += (preds == labels).sum().item()
            total += imgs.size(0)
    error_rate = 1 - (correct / total)
    val_error_rates.append(error_rate)

如果你的实验已经跑完,手里只有截图里的历史数据,也可以手动把数值整理成列表,跳过训练记录步骤直接绘图。

第二步:用Matplotlib绘制曲线

这是最通用的绘图方式,代码简单直观,适合快速出图:

import matplotlib.pyplot as plt

plt.figure(figsize=(12, 5))

# 绘制学习误差曲线
plt.subplot(1, 2, 1)
plt.plot(range(1, len(train_losses)+1), train_losses, color='#1f77b4', linewidth=2, label='训练损失')
plt.xlabel('训练轮数(Epoch)')
plt.ylabel('损失值')
plt.title('学习误差曲线')
plt.legend()
plt.grid(alpha=0.3)

# 绘制模式识别误差曲线
plt.subplot(1, 2, 2)
plt.plot(range(1, len(val_error_rates)+1), val_error_rates, color='#ff7f0e', linewidth=2, label='验证错误率')
plt.xlabel('训练轮数(Epoch)')
plt.ylabel('错误率')
plt.title('模式识别误差曲线')
plt.legend()
plt.grid(alpha=0.3)

plt.tight_layout()
plt.show()

额外实用提示

  • 如果用Keras,可以直接用model.fit()返回的history对象提取数据:比如history.history['loss']是训练损失,1 - history.history['val_accuracy']就是验证错误率,直接拿来绘图就行。
  • 训练时别只盯着学习误差:如果训练损失持续下降,但模式识别误差突然上升,说明模型过拟合了,要考虑加正则化、dropout或者提前停止训练。
  • 要是想实时监控曲线,可以用TensorBoard:PyTorch和TensorFlow都支持把损失和错误率写入日志,训练过程中就能看到动态曲线。

内容的提问来源于stack exchange,提问作者Ігор Тригук

火山引擎 最新活动