在pytorch上进行一个图像识别的项目。
在该项目中,用的是卷积神经网络实现。所以在介绍代码之前,先来回顾一下卷积神经网络。
对于图像处理问题,图像的输入是一个个像素组成。组成一副图像的像素点较多,因此如果用全连接神经网络进行训练和学习的话,网络的参数太多、计算量太大。所以,卷积神经网络就诞生了。
卷积神经网络特点:
1、全连接网络的特殊化
2、权值共享,减少计算量
先来解释一下为什么是全连接网络的特殊化。在全连接网络中,我们假设有3个输入,隐层有5个神经元,输出层有2个神经元。隐层的5个神经元都要与输入的3个神经元进行连接。也就是,有5*3个权值。但是在卷积神经网络中,5个神经元不再与输入的3个神经元连接,有可能是两个或者更少。所以说,卷积神经网络隐层神经元的权值只是把全连接神经网络的部分权重给拿出来。
再来说说权值共享。我们用一个卷积核去跟输入进行卷积操作,卷积核矩阵的“内容”就是权值,那也就是说,我们在进行卷积操作的时候,每个神经元的权重更新的数目就是卷积核的大小。如果说,我们有5个卷积核,每个卷积核的大小为22,那么我们所需更新权重的个数为52*2个权重。大大减少了计算量!!
其实,每个卷积核去“勘探”某个特征,多个卷积核去“勘探”多个特征。经过卷积操作,我们的视野就像放大了一样。也就是说,全连接网络的输入把视野放到一个个的像素点上,卷积神经网络把视野放在了和卷积核大小相同的区域上。经过多次卷积操作,我们的视野不断放大。
对于池化层,我们可以用不同的方法对其进行操作。总之就是“取其精华”。把主要的拿出来,次要的抛弃掉。经过池化,我们的计算维度又会得到减少。
以上是我目前对卷积神经网络的理解。
卷积神经网络在pytorch上的实现。
首先,先理清一下思路:
1、对网络进行实例化
2、前向传播
3、求损失
4、反向传播
5、权重更新
1、对神经网络进行实例化
class Net(nn.Module):
def __init__(self):
supe