- 🍨 本文为🔗365天深度学习训练营 中的学习记录博客
- 🍖 原作者:K同学啊 | 接辅导、项目定制
前言
在进行进阶阶段的学习过程中发现自己基础不牢固,比如基本的卷积层的设计等,导致后面尝试不同模型结合困难,这周回顾基础,补前面漏学的关键部分。
网络基本情况
下面给出详细推导
根据输入为 3×32×32,可以进一步推导每一层的输出大小:
第一层卷积层 (self.conv1):
输入大小: 3×32×32
输出大小:经过 64 个 3x3 卷积核的卷积操作,不使用填充,步幅为1,输出大小计算为:
因此输出大小为 64×30×30
第一个最大池化层 (self.pool1):
输入大小: 64×30×30
输出大小:对于每个特征图,应用了2x2的最大池化,将每2x2的区域取最大值,输出大小为
15×15,通道数保持不变。
第二个卷积层 (self.conv2):
输入大小:15x15大小的64个通道的特征图
输出大小:经过 64 个 3x3 卷积核的卷积操作,不使用填充,步幅为1,输出大小计算为: 64×13×13。
第二个最大池化层 (self.pool2):
输入大小:64x13x13大小的特征图
输出大小:对于每个特征图,应用了2x2的最大池化,输出大小为6×6,通道数保持不变。
第三个卷积层 (self.conv3):
输入大小:6x6大小的64个通道的特征图
输出大小:经过 128 个 3x3 卷积核的卷积操作,不使用填充,步幅为1,输出大小计算为: 128×4×4。
第三个最大池化层 (self.pool3):
输入大小:128x4x4大小的特征图
输出大小:对于每个特征图,应用了2x2的最大池化,输出大小为2x2 ,通道数保持不变。
Flatten操作:
将 128x2x2 的特征图展平为一维向量,大小为
第一个全连接层 (self.fc1):
输入大小:512
输出大小:256。
第二个全连接层 (self.fc2):
输入大小:256
输出大小:10。
卷积核选取原则
卷积核的个数是卷积神经网络(CNN)中的一个重要超参数,它决定了在每一层中网络能够学习的特征数量。卷积核的个数通常是可以调整的,并且可以根据特定任务和网络结构进行调整。
在选择卷积核数量时,有一些一般性的指导原则和常见做法:
特征复杂度和任务需求:任务越复杂,可能需要更多的卷积核来捕获更多不同类型的特征。例如,对于更复杂的图像分类任务,可能需要更多的卷积核来捕获不同的形状、纹理和模式。
网络深度和层次:随着网络的深度增加,通常会增加卷积核的数量。这是因为在较深的层次中,网络需要更多的特征来表示输入数据的抽象特征。
计算资源:增加卷积核的数量会增加模型的复杂度和计算量。因此,在考虑计算资源限制的情况下,需要权衡模型的性能和计算成本。
常见做法:在一些常见的模型架构中,如VGG、ResNet等,卷积层的卷积核数量经常是以2的倍数递增或递减的,例如,64、128、256、512等。这种增加或减少的方式有助于提高模型的表达能力,并且在实践中已经被证明是有效的。
代码实现
class Model(nn.Module):
def __init__(self):
super().__init__()
# 特征提取网络
self.conv1 = nn.Conv2d(3, 64, kernel_size=3) # 第一层卷积,卷积核大小为3*3
self.pool1 = nn.MaxPool2d(kernel_size=2) # 设置池化层,池化核大小为2*2
self.conv2 = nn.Conv2d(64, 64, kernel_size=3) # 第二层卷积,卷积核大小为3*3
self.pool2 = nn.MaxPool2d(kernel_size=2)
self.conv3 = nn.Conv2d(64, 128, kernel_size=3) # 第二层卷积,卷积核大小为3*3
self.pool3 = nn.MaxPool2d(kernel_size=2)
# 分类网络
self.fc1 = nn.Linear(512, 256)
self.fc2 = nn.Linear(256, num_classes)
# 前向传播
def forward(self, x):
x = self.pool1(F.relu(self.conv1(x)))
x = self.pool2(F.relu(self.conv2(x)))
x = self.pool3(F.relu(self.conv3(x)))
x = torch.flatten(x, start_dim=1)
x = F.relu(self.fc1(x))
x = self.fc2(x)
return x
训练结果
可视化
训练曲线
混淆矩阵
总结
这周主要将卷积神经网络的设计细节和相关公式熟悉了一下,这些东西很基础但是很重要,由于前面只关注代码而忽略了数学推导从而导致在后面的任务受阻,从这次实验结果可以看出对于浅层神经网络其对于大量数据容易出现欠拟合,模型泛化能力远不及深度网络。