pytorch

作者: 犭虫彳亍口苗 | 来源:发表于2020-06-19 19:26 被阅读0次

    之前没有接触过机器学习和深度学习,打算通过学习框架顺带了解机器学习的应用,也顺便学习一下python的用法。
    关于TensorFlow和Pytorch的选择上,因为是初学,没有在意两者之间的优劣势,直接选择了pytorch。我想等深入学习之后自然会对框架有更全面客观的判断。
    此文记录自己从零学习机器学习和pytorch的过程,其中一些用语可能很不专业,因为全是我的菜鸟理解……

    官方文档地址:DEEP LEARNING WITH PYTORCH: A 60 MINUTE BLITZ
    中文版:http://pytorch123.com/SecondSection/what_is_pytorch/

    1 NEURAL NETWORKS

    教程中对一个神经网络训练过程做了以下介绍:

    一个典型的神经网络训练过程包括以下几点:
    1.定义一个包含可训练参数的神经网络
    2.迭代整个输入
    3.通过神经网络处理输入
    4.计算损失(loss)
    5.反向传播梯度到神经网络的参数
    6.更新网络的参数,典型的用一个简单的更新方法:weight = weight - learning_rate *gradient

    训练的过程通俗一点理解:输入数据,计算输出值与期待值的偏差(损失),将这个偏差通过一定形式反馈给神经网络,不断的迭代这个过程,直到这个偏差收敛。在接下来的代码分析中,要体会这个过程。

    在这一节文档中,介绍了一个处理图片的卷积神经网络。因此需要先了解一下图片卷积的过程:
    参考:理解图像卷积操作的意义
    我理解的是:图片上的卷积,可以看做用一个小滤镜从头到尾过滤一张图片。滤镜中的值不同,最终处理后的图片效果也不同,或是平滑、或是锐化等。暂时先这么简单理解。

    直接看代码,看一下Pytorch如何定义一个神经网络的:

    import torch
    import torch.nn as nn
    import torch.nn.functional as F
    
    
    class Net(nn.Module):
    
        def __init__(self):
            super(Net, self).__init__()
            # 1 input image channel, 6 output channels, 3x3 square convolution
            # kernel
            self.conv1 = nn.Conv2d(1, 6, 3)
            self.conv2 = nn.Conv2d(6, 16, 3)
            # an affine operation: y = Wx + b
            self.fc1 = nn.Linear(16 * 6 * 6, 120)  # 6*6 from image dimension
            self.fc2 = nn.Linear(120, 84)
            self.fc3 = nn.Linear(84, 10)
    
        def forward(self, x):
            # Max pooling over a (2, 2) window
            x = F.max_pool2d(F.relu(self.conv1(x)), (2, 2))
            # If the size is a square you can only specify a single number
            x = F.max_pool2d(F.relu(self.conv2(x)), 2)
            x = x.view(-1, self.num_flat_features(x))
            x = F.relu(self.fc1(x))
            x = F.relu(self.fc2(x))
            x = self.fc3(x)
            return x
    
        def num_flat_features(self, x):
            size = x.size()[1:]  # all dimensions except the batch dimension
            num_features = 1
            for s in size:
                num_features *= s
            return num_features
    
    
    net = Net()
    print(net)
    

    在上面的代码中,用到了几个Pytorch的库方法。Conv2d、Linear、max_pool2d、relu。分别了解一下这函数的功能:

    1.1 Conv2d()

    torch.nn.Conv2d(1, 6, 3)构造了一个卷积层,看一下Conv2d的构造参数列表:

    class Conv2d(in_channels: int, out_channels: int, kernel_size: _size_2_t, 
    stride: _size_2_t=..., padding: _size_2_t=..., dilation: _size_2_t=..., groups: int=..., bias: bool=..., padding_mode: str=...)
    
    • in_channels:表示输入通道数,如果是一张灰度图片,通道数就是1。
    • out_chaneels:表示卷积后的通道数。
    • kernel_size: 卷积核的大小。此处大小为 3*3。卷积核可以理解为一个处理图片的滤镜。

    结合参数的含义,可以得知 torch.nn.Conv2d(1, 6, 3)构造了一个能够处理 1通道图片为6通道图片的卷积层,这个卷积层的卷积核是 3*3。
    未完待续……

    相关文章

      网友评论

          本文标题:pytorch

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