pytorch学习第四篇:从全连接到卷积

传统神经网络

传统神经网络nn,采用这种全连接的方式,可以看出是一列一列数据,包括起始和中间的隐层都是一列数据。
例如我们再对图像用这种方式来计算,需要把图像转为一列数据,例如图像为28x28单通道图像,需要转为28x28=784的列数据再进行神经网络训练。

input layer = 1 x 784 与 w1=784x512进行矩阵运算,再加上偏置项b1,再到激活函数,得到隐藏层hidden layer1 = 1x512

隐藏层hidden layer1 = 1x512与w2=512x512进行矩阵计算,再加上偏置项b2,再到激活函数,得到隐藏层hidden layer2 = 1x512

隐藏层hidden layer2 = 1x512与w3 = 512x10进行矩阵运算,再加上偏置项b3,得到输出层output layer = 1x10
这里输出为10,是对图像做的分类任务
pytorch学习第四篇:从全连接到卷积_第1张图片
上面这种方式,放在pytorch中如何使用呢?我们可以使用如下方式来定义我们的神经网络。

class NeuralNetwork(nn.Module):
    def __init__(self):
        super().__init__()
        self.flatten = nn.Flatten()
        self.linear_relu_stack = nn.Sequential(
            nn.Linear(28*28, 512),
            nn.ReLU(),
            nn.Linear(512, 512),
            nn.ReLU(),
            nn.Linear(512, 10)
        )

    def forward(self, x):
        x = self.flatten(x)
        logits = self.linear_relu_stack(x)
        return logits

这样便获得了我们传统神经网络nn,观察这种传统神经网络是不管是输入层隐藏层还是输出层都是一列数据,但是我们的图像需要进行转换,例如28x28需要转换维784的列数据才能进行计算,有没有办法,不进行转换,直接对28x28的数据进行计算,上面是单通道,但是通常我们的图像数据是3通道数据,红绿蓝三通道,有没有办法直接对三通道图像进行计算。答案是有的,站在巨人的肩膀上,巨人们想出了运用卷积这种方式。

卷积(CNN)

我们再来看看卷积,那么卷积有什么神奇之处,让我可以直接不用转为列数据了,直接就可以运算呢?
pytorch学习第四篇:从全连接到卷积_第2张图片
可以看出我们的神经网络计算已经变为这种三维的方式。
我们的输入为28x28x1的,而w1则变为卷积核,比如可以3x3的矩阵,也可以为4x4,一般取正方形矩阵。通过内积的方式的进行计算,注意这里是内积,不是矩阵运算了。为了方便展示卷积核是如何运算的,我们使用2x2的卷积核,如下图
如图a中内积计算为:1x0+2x1+4x2+3x5 = 25
pytorch学习第四篇:从全连接到卷积_第3张图片

那么三通道图像呢?例如为28x28x3的图像,如何进行卷积,方法与上面一样。
我们的卷积核从原来的3x3x1变为了3x3x3。
三个通道分别内积,再求和,再加上偏置项
pytorch学习第四篇:从全连接到卷积_第4张图片

这里只有一个Filter w0为3x3x3,这样我需要进行很多次矩阵运算,这里为了更快速训练,我想加入更多的Filter,这里也就是深度。
这里我们增加了Filter w1再进行卷积运算,那么经过w0与w1进行运算后得到3x3x2的输出。如下图。
pytorch学习第四篇:从全连接到卷积_第5张图片

在上面的图像中,周围填充了0,这是为什么?
因为我们要增加边缘的权重,在对图像做卷积时,我们可以看到中间的位置会被卷积核多次运算,而边缘的位置计算少,那么如何解决这个问题,通过边缘填充0,这样就可以使我们的边缘位置,也会被多次计算,增加边缘的权重。
pytorch学习第四篇:从全连接到卷积_第6张图片

总结

通过全连接的方式,模拟神经元操作,而遇到多维数据,再用卷积进行计算,一步步在神经网络的算法上,向前迈进。
两个都有一个共同点,就是y = wx+b,即使是卷积,也是这样的操作,只不过通过卷的方式来进行计算,更加的快速高效,对图像处理更好。
这篇文章有些我对神经网络自己的理解,如果不对,欢迎指正,希望能对你理解神经网络有所帮助。记得关注点赞收藏。

你可能感兴趣的:(Pytorch学习,pytorch,学习,人工智能)