当前位置:   article > 正文

深度学习笔记_7经典网络模型LSTM解决FashionMNIST分类问题_lstm模型 绘制loss epoch 曲线

lstm模型 绘制loss epoch 曲线

1、 调用模型库,定义参数,做数据预处理

  1. import numpy as np
  2. import torch
  3. from torchvision.datasets import FashionMNIST
  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, accuracy_score, precision_score, recall_score, f1_score, roc_curve, auc
  10. import matplotlib.pyplot as plt
  11. # 检查 GPU 可用性
  12. device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
  13. print("Using device:", device)
  14. # 设置超参数
  15. sequence_length = 28
  16. input_size = 28
  17. hidden_size = 128
  18. num_layers = 2
  19. num_classes = 10
  20. batch_size = 64
  21. learning_rate = 0.001
  22. num_epochs = 50
  23. # 定义数据转换操作
  24. transform = transforms.Compose([
  25. transforms.RandomRotation(degrees=[-30, 30]), # 随机旋转
  26. transforms.RandomHorizontalFlip(), # 随机水平翻转
  27. transforms.RandomCrop(size=28, padding=4), # 随机裁剪
  28. transforms.ColorJitter(brightness=0.2, contrast=0.2, saturation=0.2, hue=0.2), # 颜色抖动
  29. transforms.ToTensor(), # 将图像转换为张量
  30. transforms.Normalize((0.5,), (0.5,))
  31. ])

2、下载FashionMNIST训练集

  1. # 下载FashionMNIST训练集
  2. trainset = FashionMNIST(root='data', train=True,
  3. download=True, transform=transform)
  4. # 下载FashionMNIST测试集
  5. testset = FashionMNIST(root='data', train=False,
  6. download=True, transform=transform)
  7. # 创建 DataLoader 对象
  8. train_loader = DataLoader(trainset, batch_size=batch_size, shuffle=True)
  9. test_loader = DataLoader(testset, batch_size=batch_size, shuffle=False)

3、定义LSTM模型

  1. # 定义LSTM模型
  2. class LSTM(nn.Module):
  3. def __init__(self, input_size, hidden_size, num_layers, num_classes):
  4. super(LSTM, self).__init__()
  5. self.hidden_size = hidden_size # LSTM隐含层神经元数
  6. self.num_layers = num_layers # LSTM层数
  7. self.lstm = nn.LSTM(input_size, hidden_size, num_layers, batch_first=True) # LSTM层
  8. self.fc = nn.Linear(hidden_size, num_classes) # 全连接层
  9. def forward(self, x):
  10. h0 = torch.zeros(self.num_layers, x.size(0), self.hidden_size).to(device) # 初始化状态
  11. c0 = torch.zeros(self.num_layers, x.size(0), self.hidden_size).to(device)
  12. out, _ = self.lstm(x, (h0, c0)) # LSTM前向传播
  13. out = self.fc(out[:, -1, :]) # 只取序列最后一个时间步的输出
  14. return F.log_softmax(out, dim=1) # 使用log_softmax作为输出
  15. # 初始化模型、优化器和损失函数
  16. model = LSTM(input_size, hidden_size, num_layers, num_classes).to(device)
  17. optimizer = optim.Adam(model.parameters(), lr=learning_rate)
  18. criterion = nn.CrossEntropyLoss()
  19. # 记录训练和测试过程中的损失和准确率
  20. train_losses = []
  21. test_losses = []
  22. train_accuracies = []
  23. test_accuracies = []
  24. conf_matrix_list = []
  25. accuracy_list = []
  26. error_rate_list = []
  27. precision_list = []
  28. recall_list = []
  29. f1_score_list = []
  30. roc_auc_list = []

4、 训练循环

  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. data, target = data.to(device), target.to(device) # 将数据移到 GPU 上
  9. data = data.view(-1, sequence_length, input_size)
  10. output = model(data)
  11. loss = criterion(output, target)
  12. loss.backward()
  13. optimizer.step()
  14. train_loss += loss.item()
  15. # 计算训练准确率
  16. _, predicted = output.max(1)
  17. total += target.size(0)
  18. correct += predicted.eq(target).sum().item()
  19. # 计算平均训练损失和训练准确率
  20. train_loss /= len(train_loader)
  21. train_accuracy = 100. * correct / total
  22. train_losses.append(train_loss)
  23. train_accuracies.append(train_accuracy)
  24. # 测试模型
  25. model.eval()
  26. test_loss = 0.0
  27. correct = 0
  28. all_labels = []
  29. all_preds = []
  30. with torch.no_grad():
  31. for data, target in test_loader:
  32. data, target = data.to(device), target.to(device) # 将数据移到 GPU 上
  33. data = data.view(-1, sequence_length, input_size)
  34. output = model(data)
  35. test_loss += criterion(output, target).item()
  36. pred = output.argmax(dim=1, keepdim=True)
  37. correct += pred.eq(target.view_as(pred)).sum().item()
  38. all_labels.extend(target.cpu().numpy()) # 将结果移到 CPU 上
  39. all_preds.extend(pred.cpu().numpy()) # 将结果移到 CPU 上
  40. # 计算平均测试损失和测试准确率
  41. test_loss /= len(test_loader)
  42. test_accuracy = 100. * correct / len(test_loader.dataset)
  43. test_losses.append(test_loss)
  44. test_accuracies.append(test_accuracy)
  45. # 计算额外的指标
  46. conf_matrix = confusion_matrix(all_labels, all_preds)
  47. conf_matrix_list.append(conf_matrix)
  48. accuracy = accuracy_score(all_labels, all_preds)
  49. accuracy_list.append(accuracy)
  50. error_rate = 1 - accuracy
  51. error_rate_list.append(error_rate)
  52. precision = precision_score(all_labels, all_preds, average='weighted')
  53. recall = recall_score(all_labels, all_preds, average='weighted')
  54. f1 = f1_score(all_labels, all_preds, average='weighted')
  55. precision_list.append(precision)
  56. recall_list.append(recall)
  57. f1_score_list.append(f1)
  58. fpr, tpr, thresholds = roc_curve(all_labels, all_preds, pos_label=1)
  59. roc_auc = auc(fpr, tpr)
  60. roc_auc_list.append(roc_auc)
  61. # 打印每个 epoch 的指标
  62. 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}%')
  63. # 打印或绘制训练后的最终指标
  64. print(f'Final Confusion Matrix:\n{conf_matrix_list[-1]}')
  65. print(f'Final Accuracy: {accuracy_list[-1]:.2%}')
  66. print(f'Final Error Rate: {error_rate_list[-1]:.2%}')
  67. print(f'Final Precision: {precision_list[-1]:.2%}')
  68. print(f'Final Recall: {recall_list[-1]:.2%}')
  69. print(f'Final F1 Score: {f1_score_list[-1]:.2%}')
  70. print(f'Final ROC AUC: {roc_auc_list[-1]:.2%}')

5、绘制Loss、Accuracy曲线图, 计算混淆矩阵

  1. import seaborn as sns
  2. # 绘制Loss曲线图
  3. plt.figure()
  4. plt.plot(train_losses, label='Train Loss', color='blue')
  5. plt.plot(test_losses, label='Test Loss', color='red')
  6. plt.xlabel('Epoch')
  7. plt.ylabel('Loss')
  8. plt.legend()
  9. plt.title('Loss Curve')
  10. plt.grid(True)
  11. plt.savefig('loss_curve.png')
  12. plt.show()
  13. # 绘制Accuracy曲线图
  14. plt.figure()
  15. plt.plot(train_accuracies, label='Train Accuracy', color='red') # 绘制训练准确率曲线
  16. plt.plot(test_accuracies, label='Test Accuracy', color='green')
  17. plt.xlabel('Epoch')
  18. plt.ylabel('Accuracy')
  19. plt.legend()
  20. plt.title('Accuracy Curve')
  21. plt.grid(True)
  22. plt.savefig('accuracy_curve.png')
  23. plt.show()
  24. # 计算混淆矩阵
  25. class_labels = [str(i) for i in range(10)]
  26. confusion_mat = confusion_matrix(all_labels, all_preds)
  27. plt.figure()
  28. sns.heatmap(confusion_mat, annot=True, fmt='d', cmap='Blues', cbar=False)
  29. plt.xlabel('Predicted Labels')
  30. plt.ylabel('True Labels')
  31. plt.title('Confusion Matrix')
  32. plt.savefig('confusion_matrix.png')
  33. plt.show()

本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号