模块导入,常量参数设定 1 2 3 4 5 6 7 8 9 10 import torchimport torch.nn as nnimport torch.nn.functional as Fimport torch.optim as optimfrom torchvision import datasets, transformsfrom torchsummary import summaryBATCH_SIZE = 512 EPOCH = 20 DEIVCE = torch.device('cuda:0' if torch.cuda.is_available() else 'cpu' )
数据加载 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 train_loader = torch.utils.data.DataLoader( datasets.MNIST( 'data' , train=True , download=False , transform=transforms.Compose([ transforms.ToTensor(), transforms.Normalize((0.1307 ,), (0.3081 ,)) ])), batch_size=BATCH_SIZE, shuffle=True ) test_loader = torch.utils.data.DataLoader( datasets.MNIST( 'data' , train=False , transform=transforms.Compose([ transforms.ToTensor(), transforms.Normalize((0.1307 ,), (0.3081 ,)) ])), batch_size=BATCH_SIZE, shuffle=True )
LeNet模型搭建 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 26 class LeNet (nn.Module): def __init__ (self ): super (LeNet, self).__init__() self.conv1 = nn.Conv2d(1 , 6 , 5 ) self.pool1 = nn.MaxPool2d(2 ) self.conv2 = nn.Conv2d(6 , 16 , 3 ) self.pool2 = nn.MaxPool2d(2 ) self.fc1 = nn.Linear(16 *5 *5 , 120 ) self.fc2 = nn.Linear(120 , 84 ) self.fc3 = nn.Linear(84 , 10 ) def forward (self, x ): out = F.relu(self.conv1(x)) out = self.pool1(out) out = F.relu(self.conv2(out)) out = self.pool2(out) out = out.view(out.size(0 ), -1 ) out = F.relu(self.fc1(out)) out = F.relu(self.fc2(out)) out = self.fc3(out) out = F.log_softmax(out,dim=1 ) return out
查看模型结构 1 2 model = LeNet() summary(model, (1 ,28 ,28 ))
模型训练测试函数 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 26 27 28 29 30 model = LeNet().to(device) optimizer = optim.Adam(model.parameters()) def train (device, model, train_loader, optimizer, epoch ): model.train() for batch_idx, (data, target) in enumerate (train_loader): data, target = data.to(device), target.to(device) optimizer.zero_grad() output = model(data) loss = F.nll_loss(output, target) loss.backward() optimizer.step() if (batch_idx + 1 ) % 30 == 0 : print (f"Train Epoch {epoch} [{batch_idx * len (data)} /{len (train_loader.dataset)} Loss: {loss.item():.6 f} ]" ) def test (device, model, test_loader ): model.eval () test_loss = 0 correct = 0 with torch.no_grad(): for data, target in test_loader: data, target = data.to(device), target.to(device) output = model(data) test_loss += F.nll_loss(output, target, reduction='sum' ).item() pred = output.max (1 , keepdim=True )[1 ] correct += pred.eq(target.view_as(pred)).sum ().item() test_loss /= len (test_loader.dataset) print (f'\nTest Epoch: Average loss: {test_loss:.4 f} , Accuracy: {correct} /{len (test_loader.dataset)} ({100. * correct / len (test_loader.dataset):.2 f} %)\n' )
模型训练,测试 for epoch in range(1, EPOCH + 1):
train(DEIVCE, model, train_loader, optimizer, epoch)
test(DEIVCE, model, train_loader)