B站 刘二大人 ,传送门PyTorch深度学习实践——多分类问题
参考错错莫课代表的PyTorch *深度学习实践 第9讲*
笔记:
源代码如下:
import torch from torchvision import transforms from torchvision import datasets from torch.utils.data import DataLoader import torch.nn.functional as F import torch.optim as optim # prepare dataset batch_size = 64 transform = transforms.Compose([transforms.ToTensor(), transforms.Normalize((0.1307,), (0.3081,))]) # 归一化,均值和方差 train_dataset = datasets.MNIST(root='../mnist_dataset/mnist_dataset/', train=True, download=True, transform=transform) train_loader = DataLoader(train_dataset, shuffle=True, batch_size=batch_size) test_dataset = datasets.MNIST(root='../mnist_dataset/mnist_dataset/', train=False, download=True, transform=transform) test_loader = DataLoader(test_dataset, shuffle=False, batch_size=batch_size) # design model using class class Net(torch.nn.Module): def __init__(self): super(Net, self).__init__() self.linear1 = torch.nn.Linear(784, 512) self.linear2 = torch.nn.Linear(512, 256) self.linear3 = torch.nn.Linear(256, 128) self.linear4 = torch.nn.Linear(128, 64) self.linear5 = torch.nn.Linear(64, 10) def forward(self, x): x = x.view(-1, 784) # -1其实就是自动获取mini_batch x = F.relu(self.linear1(x)) x = F.relu(self.linear2(x)) x = F.relu(self.linear3(x)) x = F.relu(self.linear4(x)) return self.linear5(x) # 最后一层不做激活,不进行非线性变换 model = Net() # construct loss and optimizer criterion = torch.nn.CrossEntropyLoss() optimizer = optim.SGD(model.parameters(), lr=0.1, momentum=0.5) # training cycle forward, backward, update def train(epoch): running_loss = 0.0 for batch_idx, data in enumerate(train_loader, 0): inputs, target = data # 获得此批次的数据和标签 optimizer.zero_grad() outputs = model(inputs) # 获得模型预测结果 loss = criterion(outputs, target) loss.backward() optimizer.step() running_loss += loss.item() if batch_idx % 300 == 299: 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_gard(): for data in test_loader: images, labels = data outputs = model(images) _, predicted = torch.max(outputs.data, dim=1) # dim = 1 列是第0个维度,行是第1个维度 total += labels.size(0) correct += (predicted == labels).sum().item() # 张量之间的比较运算 print('accuracy on test set: %d %% ' % (100 * correct / total)) if __name__=='__main__': # if这条语句在windows系统下一定要加,否则会报错,视频里面有讲解 for epoch in range(10): train(epoch) test()
部分输出结果:
[1, 300] loss: 2.209
[1, 600] loss: 1.067
[1, 900] loss: 0.456
accuracy on test set: 88 %
[2, 300] loss: 0.311
[2, 600] loss: 0.269
[2, 900] loss: 0.235
accuracy on test set: 93 %
[3, 300] loss: 0.185
[3, 600] loss: 0.183
[3, 900] loss: 0.162
accuracy on test set: 95 %
[4, 300] loss: 0.135
[4, 600] loss: 0.129
[4, 900] loss: 0.125
accuracy on test set: 95 %
[5, 300] loss: 0.105
[5, 600] loss: 0.096
[5, 900] loss: 0.102
accuracy on test set: 97 %
[6, 300] loss: 0.088
[6, 600] loss: 0.075
[6, 900] loss: 0.078
accuracy on test set: 97 %
[7, 300] loss: 0.065
[7, 600] loss: 0.066
[7, 900] loss: 0.067
accuracy on test set: 97 %
[8, 300] loss: 0.051
[8, 600] loss: 0.056
[8, 900] loss: 0.055
accuracy on test set: 97 %
[9, 300] loss: 0.043
[9, 600] loss: 0.045
[9, 900] loss: 0.040
accuracy on test set: 97 %
[10, 300] loss: 0.032
[10, 600] loss: 0.035
[10, 900] loss: 0.037
accuracy on test set: 97 %