用pytorch实现LeNet

这篇文章是简单了解pytorch的工作流,发现pytorch和tensorflow不一样的地方,具体的小知识我会列出来,大家可以有针对性的看一下。

1.LeNet简介

这是一个简单的基于卷积神经网络的“深层”网络,网络结构如下:


LeNet网络结构

看见这个图是不是很眼熟啊,任何一本教科书上应该都有,网络其实由五层组成:

  • 第一层卷积,卷积核6×5×5,激活函数Relu,防止梯度消失的
  • 第一层池化,卷积核5×2×2
  • 第二层卷积,卷积核16×5×5,激活函数Relu,防止梯度消失的
  • 第二层池化,卷积核16×2×2
  • 第一层全连接,(之前有个flatten操作,具体咋做就不说了),参数维度256×120
  • 第二层全连接,参数维度120×84
  • 第三层全连接,参数维度84×10
  • 最后你要想做分类,再加个softmax层就行了

2.pytorch知识点

  • torch的变量叫Variable,在torch.autograd这个API里,可以设置是否是需要求导的,一旦设置一个变量可以求导,后续所有依赖它计算的变量都是需要求导的。pytorch运算是基于Variable进行的,运算之前一定把tensor转成Variable
  • torch很重要的一个模块是nn,这里边包装了很多神经网络常用的层(一般都是可以学习参数的,放在init函数里),比如Conv2d,还有一个API是functional,里边包装的Relu等不可学习参数的层,使用时要注意一下。
  • torch定义自己的网络结构模块的时候,需要显式的继承自nn.Moudle模型。
  • torch定义自己的神经网络的时候都要继承自nn.Module,初始化的时候需要加一句 super(LeNet, self).init() 等同于nn.Module.init()。
  • named_parameters这个参数会存各个层的变量名和取值,相当于字典,可以用字典的方式打印。
  • 打印定义好的神经网络类,相当于打印网络结构会输出网络的相关信息。
  • torch默认输入的是一个batch数据,所以你想输入一个数据的时候,可以调用unsqueeze(x)伪装成batch数据。
  • torch的实现机制类似于keras的model,每定义一个层可以用这个层加括号的形式实现。
  • torch的nn.Module一般都自带比较好的参数初始化策略,我们不用考虑,这也是torch比较友好的地方,代码里你也可以看到nn.Moudle基本不用初始化。

3.LeNet的简单实现

import torch as t
import torch.nn as nn
import torch.nn.functional as F
from torch.autograd import Variable as V

class LeNet(nn.Module):
    #必须继承自nn.moddule类,是nn最基本的类,可以是一个tensor或者是一个tensor的集合
    def __init__(self):
        super(LeNet, self).__init__()
        self.conv1 = nn.Conv2d(1,6,(5, 5))#输入通道数,输出通道数
        self.conv2 = nn.Conv2d(6,16,(5, 5))
        self.fc1 = nn.Linear(256, 120)
        self.fc2 = nn.Linear(120, 84)
        self.fc3 = nn.Linear(84, 10)
        
    def forward(self, x):
        x = F.max_pool2d(F.relu(self.conv1(x)),(2, 2))
        x = F.max_pool2d(F.relu(self.conv2(x)),(2, 2))
        x = x.view(x.size()[0], -1)
        x = F.relu(self.fc1(x))
        x = F.relu(self.fc2(x))
        x = F.relu(self.fc3(x))
        return x
        
def output_name_and_params(net):
    for name, parameters in net.named_parameters():#是个字典存名字,返回参数名和参数取值
        print('name:{},param:{}'.format(name,parameters))
        
        
if __name__ == '__main__':
    net = LeNet()
    print('net:{}'.format(net))
    params = net.parameters()
    print('params:{}'.format(params))
    output_name_and_params(net)
    input_image = t.FloatTensor(10,1,28,28)
    input_image = V(input_image)
    output = net(input_image)
    print('output:{}'.format(output))
    print('output.size:{}'.format(output.size()))

你可能感兴趣的:(用pytorch实现LeNet)