10分钟快速入门PyTorch (4)

作者: SherlockLiao | 来源:发表于2017-05-17 12:13 被阅读319次

    经过前面几节的学习,终于完成了我们的基础部分,下面正式进入到了深度学习部分。

    第一个要讲的当然是cnn了,也就是卷积神经网络,这一部分的内容在之前的文章小白学cnn以及keras速成里面已经很详细的讲解过了,所以这里也就不再细讲了,直接进入代码部分。

    Code

    数据集仍然是使用MNIST手写字体,和之前一样做同样的预处理。

    model

    # 定义 Convolution Network 模型
    class Cnn(nn.Module):
        def __init__(self, in_dim, n_class):
            super(Cnn, self).__init__()
            self.conv = nn.Sequential(
                nn.Conv2d(in_dim, 6, 3, stride=1, padding=1),
                nn.ReLU(True),
                nn.MaxPool2d(2, 2),
                nn.Conv2d(6, 16, 5, stride=1, padding=0),
                nn.ReLU(True),
                nn.MaxPool2d(2, 2),
            )
    
            self.fc = nn.Sequential(
                nn.Linear(400, 120),
                nn.Linear(120, 84),
                nn.Linear(84, n_class)
            )
    
        def forward(self, x):
            out = self.conv(x)
            out = out.view(out.size(0), -1)
            out = self.fc(out)
            return out
    
    
    model = Cnn(1, 10)  # 图片大小是28x28
    use_gpu = torch.cuda.is_available()  # 判断是否有GPU加速
    if use_gpu:
        model = model.cuda()
    # 定义loss和optimizer
    criterion = nn.CrossEntropyLoss()
    optimizer = optim.SGD(model.parameters(), lr=learning_rate)
    

    以上就是网络的模型的部分了。和之前比主要增加了这些不一样的部分

    • 1 nn.Sequential()
      这个表示将一个有序的模块写在一起,也就相当于将神经网络的层按顺序放在一起,这样可以方便结构显示

    • 2 nn.Conv2d()
      这个是卷积层,里面常用的参数有四个,in_channels, out_channels, kernel_size, stride, padding
      in_channels表示的是输入卷积层的图片厚度

    out_channels表示的是要输出的厚度

    kernel_size表示的是卷积核的大小,可以用一个数字表示长宽相等的卷积核,比如kernel_size=3,也可以用不同的数字表示长宽不同的卷积核,比如kernel_size=(3, 2)

    stride表示卷积核滑动的步长

    padding表示的是在图片周围填充0的多少,padding=0表示不填充,padding=1四周都填充1维

    • 3 nn.ReLU()
      这个表示使用ReLU激活函数,里面有一个参数inplace,默认设置为False,表示新创建一个对象对其修改,也可以设置为True,表示直接对这个对象进行修改

    • 4 nn.MaxPool2d()
      这个是最大池化层,当然也有平均池化层,里面的参数有kernel_size, stride, padding

    kernel_size表示池化的窗口大小,和卷积层里面的kernel_size是一样的

    stride也和卷积层里面一样,需要自己设置滑动步长

    padding也和卷积层里面的参数是一样的,默认是0

    模型需要传入的参数是输入的图片维数以及输出的种类数

    train

    训练的过程是一样的,只是输入图片不再需要展开

    这是训练20个epoch的结果,当然你也可以增加训练次数,修改里面的参数达到更好的效果,可以参考一下Lenet的网络结构,自己重新写一写

    3

    大体上简单的卷积网络就是这么构建的,当然现在也有很多复杂的网络,比如vgg,inceptionv1-v4,resnet以及修正的inception-resnet,这些网络都是深层的卷积网络,有兴趣的同学可以去看看pytorch的官方代码实现,或者去github上搜索相应的网络。

    下一节我们将要开始一种特别适合序列数据的新的网络结构,循环神经网络。


    本文代码已经上传到了github

    欢迎查看我的知乎专栏,深度炼丹

    欢迎访问我的博客

    相关文章

      网友评论

      • zenRRan:为什么不写写cnn在nlp上的应用呢 cnn在nlp上也是很常用的 我挺想看看pytotch的cnn nlp例子的
        zenRRan: @zenRRan 你是覃立波吧
        zenRRan: @SherlockLiao 我看你lstm都用在nlp了,就顺便问了问cnn😁😁😁 我一会去看看你的推荐 非常感谢
        SherlockLiao:@zenRRan 可以看看facebook出的cnn做机器翻译,在github上可以找到fairseq
        另外我也是新手,还不太会这方面的东西:sweat:
      • SherlockLiao:@ScotCris 感谢支持
      • ScotCris:支持下~

      本文标题:10分钟快速入门PyTorch (4)

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