test_pytorch_cuda.py 3.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. import torch
  2. import torch.nn as nn
  3. import torch.optim as optim
  4. from torchvision import datasets, transforms
  5. import matplotlib.pyplot as plt
  6. # 检查是否有可用的GPU
  7. device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
  8. print(f"using device:{device}")
  9. # 定义数据预处理步骤
  10. transform = transforms.Compose([
  11. transforms.ToTensor(),
  12. transforms.Normalize((0.1307,), (0.3081,))
  13. ])
  14. # 加载MNIST训练数据集
  15. train_dataset = datasets.MNIST(root='./data', train=True, transform=transform, download=True)
  16. train_loader = torch.utils.data.DataLoader(train_dataset, batch_size=64, shuffle=True)
  17. # 加载MNIST测试数据集
  18. test_dataset = datasets.MNIST(root='./data', train=False, transform=transform, download=True)
  19. test_loader = torch.utils.data.DataLoader(test_dataset, batch_size=64, shuffle=False)
  20. # 定义卷积神经网络模型
  21. class Net(nn.Module):
  22. def __init__(self):
  23. super(Net, self).__init__()
  24. self.conv1 = nn.Conv2d(1, 10, kernel_size=5)
  25. self.conv2 = nn.Conv2d(10, 20, kernel_size=5)
  26. self.fc1 = nn.Linear(320, 50)
  27. self.fc2 = nn.Linear(50, 10)
  28. def forward(self, x):
  29. x = nn.functional.relu(nn.functional.max_pool2d(self.conv1(x), 2))
  30. x = nn.functional.relu(nn.functional.max_pool2d(self.conv2(x), 2))
  31. x = x.view(-1, 320)
  32. x = nn.functional.relu(self.fc1(x))
  33. x = self.fc2(x)
  34. return x
  35. # 创建模型实例并将其移动到设备(GPU或CPU)
  36. model = Net()
  37. model.to(device)
  38. # 定义损失函数和优化器
  39. criterion = nn.CrossEntropyLoss()
  40. optimizer = optim.SGD(model.parameters(), lr=0.01)
  41. # 训练模型
  42. def train_model():
  43. model.train()
  44. for epoch in range(5): # should be 20
  45. running_loss = 0.0
  46. for batch_idx, (data, target) in enumerate(train_loader):
  47. data, target = data.to(device), target.to(device)
  48. optimizer.zero_grad()
  49. output = model(data)
  50. loss = criterion(output, target)
  51. loss.backward()
  52. optimizer.step()
  53. running_loss += loss.item()
  54. if batch_idx % 100 == 0:
  55. print('Train Epoch: {} [{}/{} ({:.0f}%)]\tLoss: {:.6f}'.format(
  56. epoch + 1, batch_idx * 64, len(train_loader.dataset),
  57. 100. * batch_idx / len(train_loader), running_loss / (batch_idx + 1)))
  58. print('====> Epoch: {} Average Loss: {:.4f}'.format(epoch + 1, running_loss / len(train_loader)))
  59. # 测试模型
  60. def test_model():
  61. model.eval()
  62. test_loss = 0
  63. correct = 0
  64. with torch.no_grad():
  65. for data, target in test_loader:
  66. data, target = data.to(device), target.to(device)
  67. output = model(data)
  68. test_loss += criterion(output, target).item()
  69. pred = output.argmax(dim=1, keepdim=True)
  70. correct += pred.eq(target.view_as(pred)).sum().item()
  71. test_loss /= len(test_loader)
  72. accuracy = correct / len(test_loader.dataset)
  73. print('Test set: Average loss: {:.4f}, Accuracy: {:.2f}%'.format(test_loss, 100 * accuracy))
  74. if __name__ == "__main__":
  75. train_model()
  76. test_model()