老饼讲解:一步一步上手深度学习
终于开始讲CNN卷积神经网络啦!这才开始算是深度学习嘛~!
好了,赶快让我们开始吧!
要理解什么是CNN,最好先了解一下为什么需要CNN。
CNN最基础的就是用于解决图片的类别预测。这时就有人问了,MLP不是已经可以解决图片类别预测了吗?为什么还要CNN?嘿!那就得看是什么难度的图片预测问题了!
在之前的课程中,我们已经展示了如何用MLP来实现手写数字识别,效果还挺不错。但是,如果图片的Size较大,例如,你就会发现用MLP来识别图片非常悲剧。

你看,光输入就有个,那隐节点有5000,输入层到隐层的权重就有5W*5K=2.5亿个了。一是模型非常的大,其次是参数越多,所需要的训练样本就越多,很难获得这么多的样本。
总的来说,当图片输入Size较大时,MLP搞不来。
好了,那面对这问题,CNN是如何搞的呢?其实很简单,只需把图片压缩一下就行了,因为图片之间相邻的像素之间总是相似的、信息冗余是非常严重的。
好了,怎么压缩呢?一个简单的方法就是将每一小块取均值就行了,这样就简单地压小了一些,如下:

但这方法其实不算太高明,毕竟,这样压缩,图像的相邻的像素之间仍然是高度相似的,并没有真正解决信息冗余的问题。这样的压缩,其实是在无脑丢弃信息,而不能keep住关键信息。
CNN更加高明些,它引入了卷积运算,先用卷积运算把图像的信息处理一遍,再用池化对图像进行压缩,使得图像输入在压缩的过程尽量避免信息的流失。

如图所示,CNN使用输入->[卷积,池化]->[卷积,池化]->MLP这样的结构,来把图像先经过两次压缩,使得输入个数更小之后再扔给MLP来识别类别。当然,上面只是举一个例子,它也可以经过更多的压缩再丢给MLP。事实上,CNN是有许多各种各样的结构的,但上面的结构是一种经典、基础、原始的结构代表。
好了,那么卷积和池化分别是什么呢?不要急,我们下节再慢慢细说这两个家伙的具体运算与原理。下面我们还是先来看看如何实现一个CNN先~
好了,如果要在pytorch中实现一个CNN,也是很简单的,以解决手写数字(即28*28输入,10个输出)为例,构建一个CNN模型的代码如下:
# 卷积神经网络的结构
class ConvNet(nn.Module):
def __init__(self,in_channel,num_classes):
super(ConvNet, self).__init__()
self.stack=nn.Sequential(
#--------------C1层------------
nn.Conv2d(in_channel,6, kernel_size=5,stride=1,padding=2),
nn.ReLU(inplace=True),
nn.AvgPool2d(kernel_size=2,stride=2),
# 输出14*14
#--------------C2层------------
nn.Conv2d(6,16, kernel_size=5,stride=1,padding=2),
nn.ReLU(inplace=True),
nn.AvgPool2d(kernel_size=2,stride=2),
# 输出7*7
#--------------C3层------------
nn.Conv2d(16,80,kernel_size=7,stride=1,padding=0),
# 输出1*1*80
#--------------全连接层F4------
nn.Flatten(), # 对C3的结果进行展平
nn.Linear(80, 120),
nn.ReLU(inplace=True),
#--------------全连接层F5------
nn.Linear(120, num_classes)
)
def forward(self, x):
y = self.stack(x)
return y 只要拿它到《MLP识别手写数字》中,替换掉模型,进行训练,就能识别手写数字了。这里我们暂且不进行训练,这节我们只是先来初步探讨一下模型代码大概是怎么一回事:

如图,实现CNN和实现MLP是差不多的,只是在MLP之前,先加入[卷积,池化]层先进行压缩就行了,同时,因为模型的层数加深了,所以激活函数改用ReLu函数,此外,并无其它,就是这么简单。
这节我们又了解了CNN,在理解MLP的基础上,CNN就是这么的简单!但是,这只是基础CNN,在这基础上,又产生了许多经典的CNN模型,具体我们在《Part2-细说CNN经典模型》中再详细一个一个去探讨。
在这节里,我们没有细说卷积层和池化层,因为这两个东西需要耐心耐心的看才知道是怎么回事,后面再各用一节去讲解它们,然后还要在一些细节上理解一下它,哎,思想总是这么简单,细节总是这么多,慢慢来喽,这节就大概了解下怎么回事就好啦。好了,下课!
评论