参考:
https://pytorch.org/tutorials/beginner/blitz/cifar10_tutorial.html#sphx-glr-beginner-blitz-cifar10-tutorial-py
Step1准备数据输入
按需制作训练集
Step2 设计神经网络
注意forward()函数是override method,名字不能改
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 import torch.nn as nnimport torch.nn.functional as Fclass Net (nn.Module) : def __init__ (self) : super(Net, self).__init__() self.conv1 = nn.Conv2d(3 , 6 , 5 ) self.pool = nn.MaxPool2d(2 , 2 ) self.conv2 = nn.Conv2d(6 , 16 , 5 ) self.fc1 = nn.Linear(16 * 5 * 5 , 120 ) self.fc2 = nn.Linear(120 , 84 ) self.fc3 = nn.Linear(84 , 10 ) def forward (self, x) : x = self.pool(F.relu(self.conv1(x))) x = self.pool(F.relu(self.conv2(x))) x = x.view(-1 , 16 * 5 * 5 ) x = F.relu(self.fc1(x)) x = F.relu(self.fc2(x)) x = self.fc3(x) return x net = Net()
##Step3 定义损失函数和优化方法
1 2 3 4 import torch.optim as optimcriterion = nn.CrossEntropyLoss() optimizer = optim.SGD(net.parameters(), lr=0.001 , momentum=0.9 )
Step4 训练网络
4.1 循环更新参数
for epoch in range(times):
参数的梯度置零
前向传播获取神经网络的输出
比较输出与标签的差距并计算损失
损失反向传播
优化器更新参数
累计损失
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 for epoch in range(2 ): running_loss = 0.0 for i, data in enumerate(trainloader, 0 ): inputs, labels = data optimizer.zero_grad() outputs = net(inputs) loss = criterion(outputs, labels) loss.backward() optimizer.step() running_loss += loss.item()
Step4 保存训练结果
1 torch.save(net.state_dict(), PATH)
Step5 恢复并评估模型
5.1恢复模型
1 2 net = Net() net.load_state_dict(torch.load(PATH))
5.2 测试集前向传播得到输出
1 2 with torch.no_grad(): outputs = net(images)