目录
老饼讲解:一步一步上手深度学习

【模型】CNN卷积神经网络是什么

作者 : 老饼 发表日期 : 2025-09-29 20:50:06 更新日期 : 2026-05-20 14:29:50
老饼讲解-简单易懂,干货满满,爽过嗦螺!


终于开始讲CNN卷积神经网络啦!这才开始算是深度学习嘛~!

好了,赶快让我们开始吧!

一、CNN是怎么一回事

1.1. 为什么要CNN

要理解什么是CNN,最好先了解一下为什么需要CNN。

CNN最基础的就是用于解决图片的类别预测。这时就有人问了,MLP不是已经可以解决图片类别预测了吗?为什么还要CNN?嘿!那就得看是什么难度的图片预测问题了!

在之前的课程中,我们已经展示了如何用MLP来实现手写数字识别,效果还挺不错。但是,如果图片的Size较大,例如,你就会发现用MLP来识别图片非常悲剧。

MLP在图片预测上的困难

你看,光输入就有个,那隐节点有5000,输入层到隐层的权重就有5W*5K=2.5亿个了。一是模型非常的大,其次是参数越多,所需要的训练样本就越多,很难获得这么多的样本。

总的来说,当图片输入Size较大时,MLP搞不来。

1.2. CNN如何解决参数过多的问题

好了,那面对这问题,CNN是如何搞的呢?其实很简单,只需把图片压缩一下就行了,因为图片之间相邻的像素之间总是相似的、信息冗余是非常严重的。

好了,怎么压缩呢?一个简单的方法就是将每一小块取均值就行了,这样就简单地压小了一些,如下:

简单的图片降维

但这方法其实不算太高明,毕竟,这样压缩,图像的相邻的像素之间仍然是高度相似的,并没有真正解决信息冗余的问题。这样的压缩,其实是在无脑丢弃信息,而不能keep住关键信息。

CNN更加高明些,它引入了卷积运算,先用卷积运算把图像的信息处理一遍,再用池化对图像进行压缩,使得图像输入在压缩的过程尽量避免信息的流失。

 CNN卷积神经网络

如图所示,CNN使用输入->[卷积,池化]->[卷积,池化]->MLP这样的结构,来把图像先经过两次压缩,使得输入个数更小之后再扔给MLP来识别类别。当然,上面只是举一个例子,它也可以经过更多的压缩再丢给MLP。事实上,CNN是有许多各种各样的结构的,但上面的结构是一种经典、基础、原始的结构代表。

好了,那么卷积和池化分别是什么呢?不要急,我们下节再慢慢细说这两个家伙的具体运算与原理。下面我们还是先来看看如何实现一个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经典模型》中再详细一个一个去探讨。

在这节里,我们没有细说卷积层和池化层,因为这两个东西需要耐心耐心的看才知道是怎么回事,后面再各用一节去讲解它们,然后还要在一些细节上理解一下它,哎,思想总是这么简单,细节总是这么多,慢慢来喽,这节就大概了解下怎么回事就好啦。好了,下课!



图标 评论
添加评论