前言
我们在学习这两个网络时,应先了解CNN网络的相关知识
这篇博客能够帮我们更好的理解VGG16和RetNet18
1.VGG16
1.1 VGG简介
VGG论文网址:VGG论文
大家有兴趣的可以去研读一下。
首先呢,我们先简单了解一下VGG网络的来源:
自2012年AlexNet在lmageNet图片分类比赛中大获成功以来,关于深度神经网络的研究又一次如火如茶般进行;
VGGNet 是由牛津大学视觉几何小组 (Visual Geometry Group,VGG)提出的一种深层卷积网络结构,他们以 7.32% 的错误率赢得了 2014年 ILSVRC 分类任务的亚军(冠军由 GoogLeNet 以 6.65% 的错误率夺得)
AlexNet的网络结构来提高自己的准确率,主要有两个方向:小卷积核和多尺度。而VGG的作者们则选择了另外一个方向,即加深网络深度。
VGG网络有一个特点:在每一次池化之后,经过卷积通道数都会翻倍,这样呢,就可以保留更多的特征。
1.2 VGG模型
最上面我们可以看出VGG共有6中配置,分别为A,A-LRN,B,C,D,E,其中D和E两种最为常用,即我们所说的VGG16和VGG19。
而我们今天要学习的主要是D,即VGG16
下面是模型参数
这样看可能有点抽象,让我们结合下面的图片进行理解
我们结合图片对表进行理解:
“Weight layers” 在深度学习和神经网络的上下文中,通常指的是神经网络中的权重层。在神经网络中,每一层(无论是卷积层、全连接层还是其他类型的层)都有与之关联的权重矩阵(或权重张量,对于卷积层而言)。16Weight layers是指卷积层加上连接层共有16层,也就是对应着16个权重层。
con3-aaa,:卷积层全部都是3*3的卷积核,用上图中conv3-aaa表示,xxx表示通道数。其步长为1,用padding=same填充。池化层的池化核为2*2
maxpool :是指最大池化,在这里,pooling采用的是2*2的最大池化方法
FC-aaaa:指的是全连接层中有aaaa个节点
通俗地说,就是两组:两个卷积层接上一个池化层,
三组:三个卷积层接一个池化层,
最后是三个全连接层接上一个归一化处理,
这里的每一个卷积层和连接层后都要加上ReLu激活函数。
这样,我们对VGG16论文中的两个表格以及VGG16的框架就大体了解完了,接下来我们就具体分析它们,然后用代码实现它。
1.2.1 通道数
我们可以看出,初始的图片经过卷积层和池化层的处理,通道数在不断增加,有最开始输入的3个,变为了512个,再到4096个,最终的1000是指分类的类别数为1000个。
我们先要理解通道数指的是什么:通道数指的是同时处理的并发任务数量。
也就是说,通道数越多,同时处理的并发任务数量也就越多,
这样的好处也有很多,比如:
提高并发性:通过增加通道数,可以同时处理更多的任务,从而提高程序的并发性。这对于需要同时处理多个请求或任务的应用程序非常有用,例如网络服务器、数据处理等。
提高性能:增加通道数可以充分利用计算资源,提高程序的处理能力和响应速度。当程序中存在大量的IO操作时,通过增加通道数可以减少IO等待时间,提高整体性能。
提高资源利用率:通过增加通道数,可以更好地利用系统资源,充分发挥多核处理器的并行计算能力。这对于需要处理大量数据或计算密集型任务的应用程序非常有益。
支持高并发场景:在一些需要处理大量并发请求的场景下,增加通道数可以有效地提高系统的吞吐量和响应能力。例如,在Web服务器中,通过增加通道数可以同时处理更多的客户端请求,提供更好的用户体验。
1.2.3 最大池化层
通过最大池化层时,我们将池化层的大小和步长都设为2,这样可以将特征图的长和宽减半
不用多说,这样也有很多好处:
1. 降维与减少冗余信息:池化层通过下采样操作,有效地减少了特征图的维度,从而降低了数据的冗余性。这对于后续的卷积层或全连接层来说,可以显著减少计算量和内存消耗。
2. 扩大感知野:池化操作使得后续的卷积层能够看到更大范围的输入信息,即提高了网络的感知野。这有助于捕捉全局特征和上下文信息,从而增强网络的特征提取能力。
3. 防止过拟合:通过减少特征图的尺寸和参数数量,池化层有助于防止模型在训练过程中出现过拟合现象。过拟合是指模型在训练数据上表现良好,但在未见过的数据上性能较差的情况。
4. 提高鲁棒性:池化操作,尤其是最大池化,能够提取出输入中最显著的特征,对于输入中的微小变化(如平移、旋转或尺度变化)具有一定的不变性。这使得模型对于不同的输入变化更为鲁棒。
5. 加速计算:由于池化层减少了特征图的尺寸,后续的卷积或全连接层的计算量也会相应减少,从而提高了整体的计算速度。
1.2.4 ReLu函数
我们通过ReLu函数进行非线性激活,并且inplace选择了True,这样可以大大减少VGG16模型所需要的内存。
下面,我们就尝试用代码实现CNN网络
1.3 核心代码
import torch.nn
class VGG16(torch.nn.Module):
def __init__(self):
super(VGG16, self).__init__()
self.conv1 = torch.nn.Conv2d(1, 64, kernel_size=3, stride=1, padding=1)
self.relu1 = torch.nn.ReLU(inplace=True)
self.conv2 = torch.nn.Conv2d(64, 64, kernel_size=3, stride=1, padding=1)
self.relu2 = torch.nn.ReLU(inplace=True)
self.maxpl1 = torch.nn.MaxPool2d(kernel_size