您当前的位置:首页 > IT编程 > python
| C语言 | Java | VB | VC | python | Android | TensorFlow | C++ | oracle | 学术与代码 | cnn卷积神经网络 | gnn | 图像修复 | Keras | 数据集 | Neo4j | 自然语言处理 | 深度学习 | 医学CAD | 医学影像 | 超参数 | pointnet | pytorch | 异常检测 | Transformers | 情感分类 | 知识图谱 |

自学教程:pytorch教程实现mnist手写数字识别代码示例

51自学网 2021-10-30 22:13:38
  python
这篇教程pytorch教程实现mnist手写数字识别代码示例写得很实用,希望能帮到您。

1.构建网络

nn.Moudle是pytorch官方指定的编写Net模块,在init函数中添加需要使用的层,在foeword中定义网络流向。

下面详细解释各层:

conv1层:输入channel = 1 ,输出chanael = 10,滤波器5*5

maxpooling = 2*2

conv2层:输入channel = 10 ,输出chanael = 20,滤波器5*5,

dropout

maxpooling = 2*2

fc1层:输入320 个神经单元,输出50个神经单元
fc1层:输入50个神经单元 ,输出10个神经单元
class Net(nn.Module):    def __init__(self):        super(Net, self).__init__()        self.conv1 = nn.Conv2d(1, 10, kernel_size=5)                 self.conv2 = nn.Conv2d(10, 20, kernel_size=5)        self.conv2_drop = nn.Dropout2d()        self.fc1 = nn.Linear(320, 50)        self.fc2 = nn.Linear(50, 10)     def forward(self, x):                                 #x.size() = 28*28*1        x = F.relu(F.max_pool2d(self.conv1(x), 2))        x = F.relu(F.max_pool2d(self.conv2_drop(self.conv2(x)), 2))  #x.size() =12*12*10            x = x.view(-1, 320)                                          #x.size() =1*320         x = F.relu(self.fc1(x))        x = F.dropout(x, training=self.training)        x = self.fc2(x)        return F.log_softmax(x, dim=1)

2.编写训练代码

model = Net()                                 #调用写好的网络if args.cuda:                                 #如果有GPU使用CPU    model.cuda()optimizer = optim.SGD(model.parameters(), lr=args.lr, momentum=args.momentum)   #设置SGD随机梯度下降算法def train(epoch):                                                     model.train()                                 for batch_idx, (data, target) in enumerate(train_loader):        if args.cuda:            data, target = data.cuda(), target.cuda()        data, target = Variable(data), Variable(target)        optimizer.zero_grad()                                  #梯度初始化为O        output = model(data)         loss = F.nll_loss(output, target)                      #简历loss function        loss.backward()                                        #反向传播,计算梯度        optimizer.step()                                       #更新权重        if batch_idx % args.log_interval == 0:                 #输出信息            print('Train Epoch: {} [{}/{} ({:.0f}%)]/tLoss: {:.6f}'.format(                epoch, batch_idx * len(data), len(train_loader.dataset),                100. * batch_idx / len(train_loader), loss.data[0]))

3.编写测试代码

def test():    model.eval()    test_loss = 0    correct = 0    for data, target in test_loader:        if args.cuda:            data, target = data.cuda(), target.cuda()        data, target = Variable(data, volatile=True), Variable(target)        output = model(data)        test_loss += F.nll_loss(output, target, size_average=False).data[0] # sum up batch loss        pred = output.data.max(1, keepdim=True)[1] # get the index of the max log-probability        correct += pred.eq(target.data.view_as(pred)).long().cpu().sum()     test_loss /= len(test_loader.dataset)    print('/nTest set: Average loss: {:.4f}, Accuracy: {}/{} ({:.0f}%)/n'.format(        test_loss, correct, len(test_loader.dataset),        100. * correct / len(test_loader.dataset)))

4.指导程序train和test

for epoch in range(1, args.epochs + 1):    train(epoch)                              #训练N个epoch    test()                                    #检验在测试集上的表现

5.完整代码

# -*- coding: utf-8 -*-from __future__ import print_functionimport argparseimport torchimport torch.nn as nnimport torch.nn.functional as Fimport torch.optim as optimfrom torchvision import datasets, transformsfrom torch.autograd import Variable# Training settingsparser = argparse.ArgumentParser(description='PyTorch MNIST Example')parser.add_argument('--batch-size', type=int, default=64, metavar='N',                    help='input batch size for training (default: 64)')parser.add_argument('--test-batch-size', type=int, default=1000, metavar='N',                    help='input batch size for testing (default: 1000)')parser.add_argument('--epochs', type=int, default=10, metavar='N',                    help='number of epochs to train (default: 10)')parser.add_argument('--lr', type=float, default=0.01, metavar='LR',                    help='learning rate (default: 0.01)')parser.add_argument('--momentum', type=float, default=0.5, metavar='M',                    help='SGD momentum (default: 0.5)')parser.add_argument('--no-cuda', action='store_true', default=False,                    help='disables CUDA training')parser.add_argument('--seed', type=int, default=1, metavar='S',                    help='random seed (default: 1)')parser.add_argument('--log-interval', type=int, default=10, metavar='N',                    help='how many batches to wait before logging training status')args = parser.parse_args()args.cuda = not args.no_cuda and torch.cuda.is_available() torch.manual_seed(args.seed)if args.cuda:    torch.cuda.manual_seed(args.seed) kwargs = {'num_workers': 1, 'pin_memory': True} if args.cuda else {}train_loader = torch.utils.data.DataLoader(    datasets.MNIST('../data', train=True, download=True,                   transform=transforms.Compose([                       transforms.ToTensor(),                       transforms.Normalize((0.1307,), (0.3081,))                   ])),    batch_size=args.batch_size, shuffle=True, **kwargs)test_loader = torch.utils.data.DataLoader(    datasets.MNIST('../data', train=False, transform=transforms.Compose([                       transforms.ToTensor(),                       transforms.Normalize((0.1307,), (0.3081,))                   ])),    batch_size=args.test_batch_size, shuffle=True, **kwargs)class Net(nn.Module):    def __init__(self):        super(Net, self).__init__()        self.conv1 = nn.Conv2d(1, 10, kernel_size=5)        self.conv2 = nn.Conv2d(10, 20, kernel_size=5)        self.conv2_drop = nn.Dropout2d()        self.fc1 = nn.Linear(320, 50)        self.fc2 = nn.Linear(50, 10)     def forward(self, x):        print (x.size())        x = F.relu(F.max_pool2d(self.conv1(x), 2))        print(x.size())        x = F.relu(F.max_pool2d(self.conv2_drop(self.conv2(x)), 2))        print(x.size())        x = x.view(-1, 320)        x = F.relu(self.fc1(x))        x = F.dropout(x, training=self.training)        x = self.fc2(x)        return F.log_softmax(x, dim=1) model = Net()                                 #调用写好的网络if args.cuda:                                 #如果有GPU使用CPU    model.cuda()optimizer = optim.SGD(model.parameters(), lr=args.lr, momentum=args.momentum)   #设置SGD随机梯度下降算法def train(epoch):    model.train()    for batch_idx, (data, target) in enumerate(train_loader):        if args.cuda:            data, target = data.cuda(), target.cuda()        data, target = Variable(data), Variable(target)        optimizer.zero_grad()                                  #梯度初始化为O        output = model(data)        loss = F.nll_loss(output, target)                      #简历loss function        loss.backward()                                        #反向传播,计算梯度        optimizer.step()                                       #更新权重        if batch_idx % args.log_interval == 0:                 #输出信息            print('Train Epoch: {} [{}/{} ({:.0f}%)]/tLoss: {:.6f}'.format(                epoch, batch_idx * len(data), len(train_loader.dataset),                100. * batch_idx / len(train_loader), loss.data[0]))def test():    model.eval()    test_loss = 0    correct = 0    for data, target in test_loader:        if args.cuda:            data, target = data.cuda(), target.cuda()        data, target = Variable(data, volatile=True), Variable(target)        output = model(data)        test_loss += F.nll_loss(output, target, size_average=False).data[0] # sum up batch loss        pred = output.data.max(1, keepdim=True)[1] # get the index of the max log-probability        correct += pred.eq(target.data.view_as(pred)).long().cpu().sum()     test_loss /= len(test_loader.dataset)    print('/nTest set: Average loss: {:.4f}, Accuracy: {}/{} ({:.0f}%)/n'.format(        test_loss, correct, len(test_loader.dataset),        100. * correct / len(test_loader.dataset))) for epoch in range(1, args.epochs + 1):    train(epoch)    test()

以上就是pytorch教程实现mnist手写数字识别代码示例的详细内容,更多关于pytorch实现mnist手写数字识别的资料请关注51zixue.net其它相关文章!


Pytorch教程内置模型源码实现
Python--模块(Module)和包(Package)详解
万事OK自学网:51自学网_软件自学网_CAD自学网自学excel、自学PS、自学CAD、自学C语言、自学css3实例,是一个通过网络自主学习工作技能的自学平台,网友喜欢的软件自学网站。