传送门:刘二老师pytorch第十讲
import torch import torch.nn.functional as F from torchvision import transforms from torchvision import datasets from torch.utils.data import DataLoader import torch.optim as optim # 1.Prepare Dateset batch_size = 64 transform = transforms.Compose([ transforms.ToTensor(), transforms.Normalize((0.1307), (0.3081)) ]) train_dataset = datasets.MNIST(root="D:\Python-learn\深度学习", train=True, download=False, transform=transform) train_loader = DataLoader(train_dataset, shuffle=True, batch_size=batch_size) test_dataset = datasets.MNIST(root="D:\Python-learn\深度学习", train=False, download=True, transform=transform) test_loader = DataLoader(test_dataset, shuffle=False, batch_size=batch_size) # 2.Design Model class Net(torch.nn.Module): def __init__(self): super(Net, self).__init__() self.conv1 = torch.nn.Conv2d(1, 10, kernel_size=5) self.conv2 = torch.nn.Conv2d(10, 20, kernel_size=5) self.pooling = torch.nn.MaxPool2d(2) self.fc = torch.nn.Linear(320, 10) self.relu = torch.nn.ReLU def forward(self, x): # Flatten data from (n, 1, 28, 28) to (n, 784) batch_size = x.size(0) # 0取到n x = F.relu(self.pooling(self.conv1(x))) x = F.relu(self.pooling(self.conv2(x))) x = x.view(batch_size, -1) # flatten x = self.fc(x) # 做全连接层变换320->10 return x # 最后一层不激活,需要计算交叉熵损失 model = Net() # 2.1 Move model to GPU device = torch.device("cuda:0"if torch.cuda.is_available() else "cpu") model.to(device) # 3.Construct Loss and Optimizer criterion = torch.nn.CrossEntropyLoss() optimizer = optim.SGD(model.parameters(), lr=0.01, momentum=0.5) # 4.train and test # Move Tensor to GPU def train(epoch): running_loss = 0.0 for batch_idx, data in enumerate(train_loader, 0): inputs, target = data # 将训练数据转移到GPU inputs, target = inputs.to(device), target.to(device) optimizer.zero_grad() # forward + backward + update outputs = model(inputs) loss = criterion(outputs, target) loss.backward() optimizer.step() running_loss += loss.item() if batch_idx % 300 == 299: # 每300个minibatch打印一次损失 print('[%d, %5d] loss: %.3f' % (epoch + 1, batch_idx + 1, running_loss /300)) running_loss = 0.0 def test(): correct = 0 total = 0 with torch.no_grad(): for data in test_loader: images, labels = data # 将测试数据转移到GPU images, labels = images.to(device), labels.to(device) outputs = model(images) _, predict = torch.max(outputs.data, dim=1) # 沿着行找最大值的索引 total += labels.size(0) # 0表示取(N, 1)的第一个元素N correct += (predict == labels).sum().item() print('Accuracy on test set:%d %%' % (100 * correct / total)) if __name__ =='__main__': for epoch in range(10): # range() 函数是从 0 开始计数的 。 train(epoch) test()