PyTorch之LeNet-5:利用PyTorch实现最经典的LeNet-5卷积神经网络对手写数字图片识别CNN-阿里云开发者社区

开发者社区> 一个处女座的程序猿> 正文

PyTorch之LeNet-5:利用PyTorch实现最经典的LeNet-5卷积神经网络对手写数字图片识别CNN

简介: PyTorch之LeNet-5:利用PyTorch实现最经典的LeNet-5卷积神经网络对手写数字图片识别CNN
+关注继续查看

训练过程

image.png


代码设计

#PyTorch:利用PyTorch实现最经典的LeNet卷积神经网络对手写数字进行识别CNN——Jason niu

import torch

import torch.nn as nn

import torch.optim as optim

class LeNet(nn.Module):

   def __init__(self):

       super(LeNet,self).__init__()

       #Conv1 和 Conv2:卷积层,每个层输出在卷积核(小尺寸的权重张量)和同样尺寸输入区域之间的点积;

       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 = F.relu(F.max_pool2d(self.conv1(x),2)) #使用 max 运算执行特定区域的下采样(通常 2x2 像素);

       x = F.relu(F.max_pool2d(self.conv2_drop(self.conv2(x)),2))

       x = x.view(-1, 320)

       x = F.relu(self.fc1(x))  #修正线性单元函数,使用逐元素的激活函数 max(0,x);

       x = F.dropout(x, training=self.training) #Dropout2D随机将输入张量的所有通道设为零。当特征图具备强相关时,dropout2D 提升特征图之间的独立性;

       x = self.fc2(x)

       return F.log_softmax(x, dim=1)  #将 Log(Softmax(x)) 函数应用到 n 维输入张量,以使输出在 0 到 1 之间。

#创建 LeNet 类后,创建对象并移至 GPU

model = LeNet()

criterion = nn.CrossEntropyLoss()  

optimizer = optim.SGD(model.parameters(),lr = 0.005, momentum = 0.9) #要训练该模型,我们需要使用带动量的 SGD,学习率为 0.01,momentum 为 0.5。

import os

from torch.autograd import Variable

import torch.nn.functional as F

cuda_gpu = torch.cuda.is_available()

def train(model, epoch, criterion, optimizer, data_loader):

   model.train()

   for batch_idx, (data, target) in enumerate(data_loader):

       if cuda_gpu:

           data, target = data.cuda(), target.cuda()

           model.cuda()

       data, target = Variable(data), Variable(target)

       output = model(data)

       optimizer.zero_grad()

       loss = criterion(output, target)

       loss.backward()

       optimizer.step()

       if (batch_idx+1) % 400 == 0:

           print('Train Epoch: {} [{}/{} ({:.0f}%)]\tLoss: {:.6f}'.format(

               epoch, (batch_idx+1) * len(data), len(data_loader.dataset),

               100. * (batch_idx+1) / len(data_loader), loss.data[0]))

           

from torchvision import datasets, transforms

batch_num_size = 64

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=batch_num_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_num_size, shuffle=True)

def test(model, epoch, criterion, data_loader):

   model.eval()

   test_loss = 0

   correct = 0

   for data, target in data_loader:

       if cuda_gpu:

           data, target = data.cuda(), target.cuda()

           model.cuda()

       data, target = Variable(data), Variable(target)

       output = model(data)

       test_loss += criterion(output, target).data[0]

       pred = output.data.max(1)[1] # get the index of the max log-probability

       correct += pred.eq(target.data).cpu().sum()

   test_loss /= len(data_loader) # loss function already averages over batch size

   acc = correct / len(data_loader.dataset)

   print('\nTest set: Average loss: {:.4f}, Accuracy: {}/{} ({:.0f}%)\n'.format(

       test_loss, correct, len(data_loader.dataset), 100. * acc))

   return (acc, test_loss)

epochs = 5 #仅仅需要 5 个 epoch(一个 epoch 意味着你使用整个训练数据集来更新训练模型的权重),就可以训练出一个相当准确的 LeNet 模型。

#这段代码检查可以确定文件中是否已有预训练好的模型。有则加载;无则训练一个并保存至磁盘。

if (os.path.isfile('pretrained/MNIST_net.t7')):

   print ('Loading model')

   model.load_state_dict(torch.load('pretrained/MNIST_net.t7', map_location=lambda storage, loc: storage))

   acc, loss = test(model, 1, criterion, test_loader)

else:

   print ('Training model') #打印出该模型的信息。打印函数显示所有层(如 Dropout 被实现为一个单独的层)及其名称和参数。

   for epoch in range(1, epochs + 1):

       train(model, epoch, criterion, optimizer, train_loader)

       acc, loss = test(model, 1, criterion, test_loader)

   torch.save(model.state_dict(), 'pretrained/MNIST_net.t7')

print (type(t.cpu().data))#以使用 .cpu() 方法将张量移至 CPU(或确保它在那里)。

#或当 GPU 可用时(torch.cuda. 可用),使用 .cuda() 方法将张量移至 GPU。你可以看到张量是否在 GPU 上,其类型为 torch.cuda.FloatTensor。

#如果张量在 CPU 上,则其类型为 torch.FloatTensor。

if torch.cuda.is_available():

   print ("Cuda is available")

   print (type(t.cuda().data))

else:

   print ("Cuda is NOT available")

   

if torch.cuda.is_available():

   try:

       print(t.data.numpy())

   except RuntimeError as e:

       "you can't transform a GPU tensor to a numpy nd array, you have to copy your weight tendor to cpu and then get the numpy array"

print(type(t.cpu().data.numpy()))

print(t.cpu().data.numpy().shape)

print(t.cpu().data.numpy())

data = model.conv1.weight.cpu().data.numpy()

print (data.shape)

print (data[:, 0].shape)

kernel_num = data.shape[0]

fig, axes = plt.subplots(ncols=kernel_num, figsize=(2*kernel_num, 2))

for col in range(kernel_num):

   axes[col].imshow(data[col, 0, :, :], cmap=plt.cm.gray)

plt.show()


版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
.net 图片上传
  ///       /// asp.net上传图片并生成缩略图      ///       /// HtmlInputFile控件      /// 保存的路径,些为相对服务器路径的下的文件夹      /// 缩略图的thumb      //...
784 0
巧用CSS3滤镜实现图片不同渲染效果
本站在首页文章封面图从无色转变为有色,以及页面切换、发布留言等信息提示的背景模糊都利用到了css3的filter滤镜。 CSS3 Filter是W3C CSS filter Effect 1.0中定义的滤镜,一个使用CSS来改变图片和HTML的模糊度、亮度、对比度、饱和度等等效果的过滤器。
1022 0
(14)[Xamarin.Android] 异步的网络图片下载
原文 [Xamarin.Android] 异步的网络图片下载 在设计要从网络上接大量数据并且显示在Android Listview中,而这些资料是利用Json格式传送并且数据中包含这图片档案。 那在Xamarin中如何实作这种异步下载的观念? *在阅读这一篇前,建议可以先看一下当麻哥的如何客制化的ListView之章 http://www.
926 0
使用OpenApi弹性释放和设置云服务器ECS释放
云服务器ECS的一个重要特性就是按需创建资源。您可以在业务高峰期按需弹性的自定义规则进行资源创建,在完成业务计算的时候释放资源。本篇将提供几个Tips帮助您更加容易和自动化的完成云服务器的释放和弹性设置。
7751 0
Netflix开源面向稀疏数据优化的轻量级神经网络库Vectorflow
在Netflix公司,我们的机器学习科学家在多个不同的领域处理着各种各样的问题:从根据你的爱好来定制电视和推荐电影,到优化编码算法。我们有一小部分问题涉及到处理极其稀疏的数据;手头问题的总维度数很容易就能达到数千万个特征,即使每次要看的可能只是少数的非零项。
4172 0
+关注
一个处女座的程序猿
国内互联网圈知名博主、人工智能领域优秀创作者,全球最大中文IT社区博客专家、CSDN开发者联盟生态成员、中国开源社区专家、华为云社区专家、51CTO社区专家、Python社区专家等,曾受邀采访和评审十多次。仅在国内的CSDN平台,博客文章浏览量超过2500万,拥有超过57万的粉丝。
1701
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
文娱运维技术
立即下载
《SaaS模式云原生数据仓库应用场景实践》
立即下载
《看见新力量:二》电子书
立即下载