• 深度学习笔记_4、CNN卷积神经网络+全连接神经网络解决MNIST数据


    1、首先,导入所需的库和模块,包括NumPy、PyTorch、MNIST数据集、数据处理工具、模型层、优化器、损失函数、混淆矩阵、绘图工具以及数据处理工具。

    1. import numpy as np
    2. import torch
    3. from torchvision.datasets import mnist
    4. import torchvision.transforms as transforms
    5. from torch.utils.data import DataLoader
    6. import torch.nn.functional as F
    7. import torch.optim as optim
    8. from torch import nn
    9. from sklearn.metrics import confusion_matrix
    10. import matplotlib.pyplot as plt
    11. import seaborn as sns
    12. import csv
    13. import pandas as pd

    2、设置超参数,包括训练批次大小、测试批次大小、学习率和训练周期数。

    1. # 设置超参数
    2. train_batch_size = 64
    3. test_batch_size = 64
    4. learning_rate = 0.001
    5. num_epochs = 10

    3、创建数据转换管道,将图像数据转换为张量并进行标准化。

    1. transform = transforms.Compose([
    2. transforms.ToTensor(),
    3. transforms.Normalize([0.5], [0.5])
    4. ])

    4、下载和预处理MNIST数据集,分为训练集和测试集。

    1. # 下载和预处理数据集
    2. train_dataset = mnist.MNIST('data', train=True, transform=transform, download=True)
    3. test_dataset = mnist.MNIST('data', train=False, transform=transform)

    5、创建用于训练和测试的数据加载器,以便有效地加载数据。

    1. # 创建数据加载器
    2. train_loader = DataLoader(train_dataset, batch_size=train_batch_size, shuffle=True)
    3. test_loader = DataLoader(test_dataset, batch_size=test_batch_size, shuffle=False)

     6、定义了一个简单的CNN模型,包括两个卷积层和两个全连接层。

    1. # 定义CNN模型
    2. class CNN(nn.Module):
    3. def __init__(self):
    4. super(CNN, self).__init__()
    5. self.conv1 = nn.Conv2d(1, 32, kernel_size=5)
    6. self.conv2 = nn.Conv2d(32, 64, kernel_size=5)
    7. self.fc1 = nn.Linear(1024, 256)
    8. self.fc2 = nn.Linear(256, 10)
    9. def forward(self, x):
    10. x = F.relu(F.max_pool2d(self.conv1(x), 2))
    11. x = F.relu(F.max_pool2d(self.conv2(x), 2))
    12. x = x.view(x.size(0), -1)
    13. x = F.relu(self.fc1(x))
    14. x = self.fc2(x)
    15. return F.log_softmax(x, dim=1)

    7、初始化模型、优化器和损失函数。

    1. # 初始化模型、优化器和损失函数
    2. model = CNN()
    3. optimizer = optim.Adam(model.parameters(), lr=learning_rate)
    4. criterion = nn.CrossEntropyLoss()

    8、准备用于记录训练和测试过程中损失和准确率的列表。

    1. # 记录训练和测试过程中的损失和准确率
    2. train_losses = []
    3. test_losses = []
    4. train_accuracies = []
    5. test_accuracies = []

    9、进入训练循环,遍历每个训练周期。在每个训练周期内,进入训练模式,遍历训练数据批次,计算损失、反向传播并更新模型参数,同时记录训练损失和准确率。

    1. for epoch in range(num_epochs):
    2. model.train()
    3. train_loss = 0.0
    4. correct = 0
    5. total = 0
    6. for batch_idx, (data, target) in enumerate(train_loader):
    7. optimizer.zero_grad()
    8. output = model(data)
    9. loss = criterion(output, target)
    10. loss.backward()
    11. optimizer.step()
    12. train_loss += loss.item()
    13. # 计算训练准确率
    14. _, predicted = output.max(1)
    15. total += target.size(0)
    16. correct += predicted.eq(target).sum().item()
    17. # 计算平均训练损失和训练准确率
    18. train_loss /= len(train_loader)
    19. train_accuracy = 100. * correct / total
    20. train_losses.append(train_loss)
    21. train_accuracies.append(train_accuracy) # 记录训练准确率
    22. # 测试模型
    23. model.eval()
    24. test_loss = 0.0
    25. correct = 0
    26. all_labels = []
    27. all_preds = []
    28. with torch.no_grad():
    29. for data, target in test_loader:
    30. output = model(data)
    31. test_loss += criterion(output, target).item()
    32. pred = output.argmax(dim=1, keepdim=True)
    33. correct += pred.eq(target.view_as(pred)).sum().item()
    34. all_labels.extend(target.numpy())
    35. all_preds.extend(pred.numpy())

    10、在每个训练周期结束后,进入测试模式,遍历测试数据批次,计算测试损失和准确率,同时记录它们。打印每个周期的训练和测试损失以及准确率。

    1. # 计算平均测试损失和测试准确率
    2. test_loss /= len(test_loader)
    3. test_accuracy = 100. * correct / len(test_loader.dataset)
    4. test_losses.append(test_loss)
    5. test_accuracies.append(test_accuracy)
    6. print(f'Epoch [{epoch + 1}/{num_epochs}] -> Train Loss: {train_loss:.4f}, Train Accuracy: {train_accuracy:.2f}%, Test Loss: {test_loss:.4f}, Test Accuracy: {test_accuracy:.2f}%')

    11、losses、acces、eval_losses、eval_acces保存到TXT文件

    1. # 保存训练结果
    2. data = np.column_stack((train_losses,test_losses,train_accuracies, test_accuracies))
    3. np.savetxt("results.txt", data)

    12、绘制Loss、ACC图像

    1. # 绘制Loss曲线图
    2. plt.figure(figsize=(10, 2))
    3. plt.plot(train_losses, label='Train Loss', color='blue')
    4. plt.plot(test_losses, label='Test Loss', color='red')
    5. plt.xlabel('Epoch')
    6. plt.ylabel('Loss')
    7. plt.legend()
    8. plt.title('Loss Curve')
    9. plt.grid(True)
    10. plt.savefig('loss_curve.png')
    11. plt.show()
    12. # 绘制Accuracy曲线图
    13. plt.figure(figsize=(10, 2))
    14. plt.plot(train_accuracies, label='Train Accuracy', color='red') # 绘制训练准确率曲线
    15. plt.plot(test_accuracies, label='Test Accuracy', color='green')
    16. plt.xlabel('Epoch')
    17. plt.ylabel('Accuracy')
    18. plt.legend()
    19. plt.title('Accuracy Curve')
    20. plt.grid(True)
    21. plt.savefig('accuracy_curve.png')
    22. plt.show()

     

     13、绘制混淆矩阵图像

    1. # 计算混淆矩阵
    2. confusion_mat = confusion_matrix(all_labels, all_preds)
    3. plt.figure(figsize=(10, 8))
    4. sns.heatmap(confusion_mat, annot=True, fmt='d', cmap='Blues', cbar=False)
    5. plt.xlabel('Predicted Labels')
    6. plt.ylabel('True Labels')
    7. plt.title('Confusion Matrix')
    8. plt.savefig('confusion_matrix.png')
    9. plt.show()

     

  • 相关阅读:
    deepin安装MySQL5.7
    【蜂鸟E203的FPGA验证】Chap.7 Vivado综合与性能分析-建立Vivado工程
    快速排序实现Java版本
    P10 属性分组
    15 | 流
    WinForm简洁有效的项目框架结构
    2022“杭电杯”中国大学生算法设计超级联赛(8)
    el-table,列表合并,根据名称列名称相同的品名将其它列值相同的进行合并
    【开发篇】三、web下单元测试与mock数据
    sentry线上报跨域问题记录
  • 原文地址:https://blog.csdn.net/cfy2401926342/article/details/133562536