美文网首页
用pytorch实现LeNet

用pytorch实现LeNet

作者: 不分享的知识毫无意义 | 来源:发表于2020-03-16 17:18 被阅读0次

    这篇文章是简单了解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

          本文链接:https://www.haomeiwen.com/subject/oilnehtx.html