一、卷积神经网络核心概念1. 卷积操作卷积核在输入图像上滑动计算对应位置元素相乘再求和得到输出特征图的一个像素。卷积核大小kernel_size通常是奇数如 3×3、5×5。2. 填充Padding在输入边界周围补充像素通常补0作用控制输出尺寸保护边缘信息。padding1表示上下左右各补1行/列0。Same paddingpadding (kernel_size - 1) // 2当 stride1 时输出尺寸等于输入尺寸。3. 步幅Stride卷积核每次滑动的步长。步幅越大输出尺寸越小。4. 卷积输出尺寸计算公式必考宽度同理5. 池化层Pooling最大池化取窗口内的最大值。平均池化取窗口内的平均值。池化层参数kernel_size窗口大小、stride步幅。输出尺寸公式(H_in - kernel_size) // stride 1池化层作用降维、减少计算量、增强平移不变性。6. 多输入 / 多输出通道输入通道in_channels彩色图像为3RGB灰度图为1。输出通道out_channels每个输出通道对应一组独立的卷积核提取不同特征。卷积层构造参数nn.Conv2d(in_channels, out_channels, kernel_size, ...)卷积核权重张量的形状通过conv.weight.shape查看(out_channels, in_channels, kernel_height, kernel_width)注意第一个维度是输出通道数第二个是输入通道数。例如Conv2d(3, 16, 3)的权重形状为(16, 3, 3, 3)。7. 感受野Receptive Field定义某一层的一个神经元在原始输入图像上所能看到的区域大小。计算公式从最后一层向前递推初始 RF 1从后向前遍历每一层RF (RF - 1) * stride kernel_size作用感受野越大能捕捉越全局的信息。8. 数据增强对训练图像进行随机变换旋转、翻转、缩放等增加样本多样性防止过拟合。测试集不使用数据增强以保持评估的公平性。二、LeNet 网络结构适配MNIST 28×28层参数输入形状输出形状conv11→6, k5, s1, p01×28×286×24×24pool12×2, s26×24×246×12×12conv26→16, k5, s1, p06×12×1216×8×8pool22×2, s216×8×816×4×4flattenview(x.size(0), -1)16×4×4256fc1256→120256120fc2120→8412084fc384→108410x.view(x.size(0), -1)的作用将每个样本的特征图展平成一维向量以输入全连接层。三、PyTorch 中维度操作unsqueeze(dim)在指定位置增加一个大小为1的维度。squeeze()移除所有大小为1的维度或指定维度。池化和卷积层要求输入为4维(batch, channels, height, width)。《人工智能概论》实验5 考试题一、单选题每题3分给定输入尺寸28×28卷积核大小5×5步幅1填充0卷积输出尺寸是 A. 24×24B. 28×28C. 26×26D. 20×20关于填充padding的说法正确的是 A. 填充只能在输入四周补0B. 填充会降低输出特征图的分辨率C.padding1表示上下左右各补1圈D. 填充不影响感受野大小最大池化层MaxPool2d(kernel_size2, stride2)对4×4特征图池化后输出尺寸为 A. 2×2B. 3×3C. 4×4D. 1×1在LeNet中x.view(x.size(0), -1)的作用是 A. 增加一个维度B. 将多维特征图展平成一维向量保留batch维度C. 转置特征图D. 复制特征图数据增强通常只应用于 A. 训练集B. 测试集C. 验证集D. 所有数据集二、填空题每空2分卷积输出尺寸计算公式为一个Conv2d(3, 16, kernel_size3, stride1, padding1)层的卷积核形状是(16, _, _, _)。感受野计算函数中从最后一层向前递推rf rf (k - 1) * s。若两层卷积核均为3步幅第一层2、第二层1则最终感受野大小为 ____。LeNet中第二个池化层pool2的输入通道数是 ____输出通道数不变。池化层不会改变通道数。在PyTorch中unsqueeze(0)是在第0维增加一个维度squeeze()用于移除维度大小为 ____ 的维度。三、判断题正确打“√”错误打“×”每题2分 卷积核的数量决定输出特征图的通道数。 池化层具有可训练参数。 感受野只与卷积核大小有关与步幅无关。 数据增强可以帮助提高模型泛化能力。 在LeNet的forward中x x.view(x.size(0), -1)之前不需要展平因为全连接层会自动处理。四、简答题将原实验中的思考题整合共35分简答题13分来自3.1(1)写出卷积输出尺寸的计算公式。简答题24分来自3.1(3)使用给定参数stride1,padding0写出输出的第2行第1个数是如何计算出来的可参考代码中的输入和卷积核。简答题34分来自3.2(3)当padding (kernel_size - 1) // 2且 stride1 时输出尺寸等于什么这种填充方式叫什么简答题44分来自3.2(4)在nn.Conv2d中可以直接使用paddingsame参数实现相同效果吗为什么简答题53分来自3.3(5)代码中的unsqueeze和squeeze分别做了什么为什么池化前需要增加维度简答题64分来自3.3(6)最大池化和平均池化的输出结果分别是什么针对给定的4×4特征图池化层的主要作用是什么简答题73分来自3.4(7)为什么感受野很重要如果网络更深感受野会如何变化简答题84分来自3.5(8)卷积核的形状(16, 3, 3, 3)四个数字分别代表什么简答题93分来自4.1(9)数据增强的作用是什么为什么测试集不使用数据增强简答题103分来自4.2(11)x.view(x.size(0), -1)这一步的作用是什么五、计算题20分5.1 特征图尺寸计算8分完成下表每空2分输入操作输出尺寸32×32×3Conv2d(3,16,3,stride1,padding0)______30×30×16MaxPool2d(2,stride2)______32×32×3Conv2d(3,16,5,stride2,padding1)______28×28×6Conv2d(6,16,5,stride1,padding0)______5.2 感受野计算6分一个三层卷积网络第一层 kernel3, stride2第二层 kernel3, stride1第三层 kernel3, stride1。请计算第三层最后一层特征图上每个神经元相对于原始输入的感受野大小。5.3 LeNet特征图尺寸填空6分补全LeNet各层输出形状已知输入1×28×28层输出形状conv1 (k5,s1,p0, 1→6)______pool1 (2×2,s2)______conv2 (k5,s1,p0, 6→16)______pool2 (2×2,s2)______flatten后______六、代码填空题每空2分卷积层定义import torch import torch.nn as nn # 定义卷积层输入通道1输出通道6卷积核5×5步幅1填充0 conv1 nn.Conv2d(in_channels______, out_channels______, kernel_size______, stride1, padding0) # 创建一个模拟输入 (batch1, channel1, height28, width28) x torch.randn(1, 1, 28, 28) out conv1(x) print(输出形状:, out.shape) # 期望输出: torch.Size([1, 6, 24, 24])池化层# 定义最大池化层核大小2×2步幅2 pool nn.MaxPool2d(kernel_size______, stride______) # 对上面卷积的输出进行池化 pooled pool(out) print(池化后形状:, pooled.shape) # 期望输出: torch.Size([1, 6, 12, 12])感受野函数def receptive_field(kernel_sizes, strides): 计算输出层相对于原始输入的感受野大小 kernel_sizes: 各层卷积核大小列表从输入层到输出层顺序 strides: 各层步幅列表从输入层到输出层顺序 rf 1 # 从最后一层向第一层遍历 for k, s in zip(reversed(kernel_sizes), reversed(strides)): rf rf (______ - 1) * ______ return rf # 示例两层卷积核大小均为3步幅分别为2和1 rf receptive_field([3, 3], [2, 1]) print(感受野大小:, rf) # 期望输出: 7LeNet 展平class LeNet(nn.Module): def __init__(self): super().__init__() self.conv1 nn.Conv2d(1, 6, 5) # 输入1→6通道核5 self.pool1 nn.MaxPool2d(2, 2) # 2×2池化步幅2 self.conv2 nn.Conv2d(6, 16, 5) # 输入6→16通道核5 self.pool2 nn.MaxPool2d(2, 2) # 2×2池化步幅2 self.fc1 nn.Linear(16 * 4 * 4, 120) # 全连接层 self.fc2 nn.Linear(120, 84) self.fc3 nn.Linear(84, 10) def forward(self, x): x self.pool1(torch.relu(self.conv1(x))) # 输出形状: (batch, 6, 12, 12) x self.pool2(torch.relu(self.conv2(x))) # 输出形状: (batch, 16, 4, 4) x x.______(x.size(0), -1) # 展平操作 x torch.relu(self.fc1(x)) x torch.relu(self.fc2(x)) x self.fc3(x) return x # 测试模型 model LeNet() dummy torch.randn(1, 1, 28, 28) output model(dummy) print(输出形状:, output.shape) # 期望: torch.Size([1, 10])数据增强旋转角度from torchvision import transforms train_transform transforms.Compose([ transforms.RandomRotation(______), # 随机旋转 ±10度 transforms.RandomHorizontalFlip(), # 随机水平翻转 transforms.ToTensor(), transforms.Normalize((0.1307,), (0.3081,)) # MNIST归一化参数 ]) # 测试一下变换假设有一张PIL图像 # from PIL import Image # img Image.open(test.png) # img_tensor train_transform(img)参考答案与超详细解析小白版一、单选题第1题题目给定输入尺寸 28×28卷积核大小 5×5步幅 1填充 0卷积输出尺寸是 A. 24×24B. 28×28C. 26×26D. 20×20答案A详细解析首先回忆卷积输出尺寸公式输出尺寸 (输入尺寸 2×填充 - 卷积核大小) ÷ 步幅 1这里所有数字都是整数除法是整数除法向下取整。代入数字输入28填充0核5步幅1。计算括号内28 0 - 5 23。除以步幅123 ÷ 1 23。加123 1 24。所以输出是 24×24。为什么不是 28因为卷积核滑动的过程中边缘的像素只能被卷积核覆盖一部分每滑动一步输出尺寸就会减少 (核尺寸-1)这里 5-1428-424。第2题题目关于填充padding的说法正确的是 A. 填充只能在输入四周补0B. 填充会降低输出特征图的分辨率C.padding1表示上下左右各补1行/列0D. 填充不影响感受野大小答案C详细解析A选项填充通常使用0但不是“只能”。PyTorch 的卷积层nn.Conv2d的padding参数默认是补0但也可以使用其他填充模式如反射、重复等。而且padding只是一个数值表示补多少圈0但如果你用torch.nn.functional.pad可以指定不同的填充值。所以“只能”这个词太绝对错误。B选项填充是增加输出尺寸的。如果填充足够大可以让输出尺寸等于输入尺寸same padding。即使填充很小输出尺寸也比不填充时要大或相等。例如输入5×5核3步幅1无填充输出3×3加上1圈填充变成7×7输出5×5。所以填充不会降低分辨率反而可能维持或增大。C选项padding1表示在输入的四周各补1行/列通常补0。对于二维图像上下各补1行左右各补1列所以总高度增加2总宽度增加2。这个说法是正确的。D选项填充会影响感受野。因为填充相当于扩展了输入的有效范围使得卷积核可以覆盖到原来边界的区域从而影响后续层神经元能看到的原始输入范围。所以感受野会变化。因此只有 C 正确。第3题题目最大池化层MaxPool2d(kernel_size2, stride2)对4×4特征图池化后输出尺寸为 A. 2×2B. 3×3C. 4×4D. 1×1答案A详细解析池化层输出尺寸公式与卷积类似输出尺寸 (输入尺寸 - 核尺寸) ÷ 步幅 1除法是整数除法向下取整输入4核2步幅2。(4 - 2) ÷ 2 2 ÷ 2 1再加1得2。或者直观理解2×2的窗口步长2刚好不重叠地滑过4×4区域可以分成2行2列窗口所以输出2×2。最大池化取每个窗口的最大值所以输出四个值排成2×2。第4题题目在LeNet中x.view(x.size(0), -1)的作用是 A. 增加一个维度B. 将多维特征图展平成一维向量保留batch维度C. 转置特征图D. 复制特征图答案B详细解析x的形状通常是(batch, channels, height, width)比如(64, 16, 4, 4)。x.size(0)是 batch 大小64。view(64, -1)表示将每个样本每个64中的一行的所有元素排成一列-1表示自动计算该维度大小。因为原本每个样本有16*4*4256个元素所以输出形状为(64, 256)。这样就将卷积层输出的特征图“展平”成二维矩阵每一行对应一个样本的特征向量以便输入全连接层。A错不是增加维度而是合并后面的维度。C错不是转置。D错不是复制。第5题题目数据增强通常只应用于 A. 训练集B. 测试集C. 验证集D. 所有数据集答案A详细解析数据增强是为了增加训练样本的多样性防止过拟合提升泛化能力。测试集必须保持原始、未经修改的状态因为我们要评估模型在真实数据上的表现。如果对测试集也做随机变换那么评估结果就不稳定且不公平。验证集同理一般不使用数据增强以保证其能真实反映模型性能。所以只用于训练集。二、填空题第6题题目卷积输出尺寸计算公式为Hout(____2×padding−kernel_size)//____1Hout(____2×padding−kernel_size)//____1。答案H_instride详细解析标准公式中的分子部分是H_in 2*padding - kernel_size分母是stride然后向下取整再加1。这里//表示整数除法向下取整。第7题题目一个Conv2d(3, 16, kernel_size3, stride1, padding1)层的卷积核形状是(16, _, _, _)。答案333详细解析nn.Conv2d的卷积核形状为(out_channels, in_channels, kernel_height, kernel_width)。这里 out_channels16in_channels3输入是RGB图像3通道kernel_size3正方形所以高3宽3。因此形状是(16, 3, 3, 3)。注意顺序不能写错第一个数是输出通道第二个是输入通道。第8题题目感受野计算函数中从最后一层向前递推rf rf (k - 1) * s。若两层卷积核均为3步幅第一层2、第二层1则最终感受野大小为 ______。答案7详细解析感受野计算需要从最后一层往输入层方向递推。初始rf 1最后一层的输出神经元。考虑最后一层第二层因为它是最靠近输出的一层通常我们说的“第一层”是靠近输入。题目说“两层卷积核均为3步幅第一层2、第二层1”意思是第一层靠近输入stride2第二层靠近输出stride1。我们从最后一层第二层开始向前推处理第二层从后往前第一个卷积层k3s1 →rf 1 (3-1)*1 1 2 3再往前处理第一层k3s2 →rf 3 (3-1)*2 3 4 7所以感受野大小为 7×7。注意如果题目说的是两层顺序是输入→第一层(3×3, stride2)→第二层(3×3, stride1)→输出。那么计算正确。第9题题目LeNet中第二个池化层pool2的输入通道数是 ______输出通道数不变。答案16详细解析LeNet 中conv2的输出通道是16然后pool2紧接着conv2所以pool2的输入通道数就是16。池化层不会改变通道数只改变空间尺寸。第10题题目在PyTorch中unsqueeze(0)是在第0维增加一个维度squeeze()用于移除维度大小为 ______ 的维度。答案1详细解析squeeze()默认移除所有长度为1的维度。例如形状(1, 3, 1, 5)经过squeeze()后变成(3, 5)。若指定squeeze(dim)则只移除该维度前提是它长度为1。所以填空填1。三、判断题第11题题目卷积核的数量决定输出特征图的通道数。答案√详细解析卷积层中每个输出通道对应一个独立的卷积核一组权重。out_channels参数就是卷积核的数量输出特征图的通道数等于out_channels。第12题题目池化层具有可训练参数。答案×详细解析池化层最大池化、平均池化没有权重和偏置只是固定操作取最大值或平均值不参与梯度更新。因此没有可训练参数。第13题题目感受野只与卷积核大小有关与步幅无关。答案×详细解析感受野与卷积核大小和步幅都有关。步幅越大每层向前跳跃的步长越大感受野增长越快。例如单层卷积核3步幅1感受野3步幅2感受野3这里单层感受野就是核大小步幅不影响单层的感受野但影响多层叠加后的感受野。对多层网络步幅会放大感受野。第14题题目数据增强可以帮助提高模型泛化能力。答案√详细解析数据增强通过对训练图像进行随机变换旋转、翻转、缩放等创建更多样化的样本使模型学习到更鲁棒的特征从而减少过拟合提高泛化能力。第15题题目在LeNet的forward中x x.view(x.size(0), -1)之前不需要展平因为全连接层会自动处理。答案×详细解析nn.Linear层的输入要求是二维(batch, features)。卷积层输出的特征是四维(batch, channels, height, width)必须手动展平成二维否则Linear会报错或产生错误结果。因此展平是必要的。四、简答题仅选部分详细展开由于篇幅限制这里只展示简答题1、2、3的超详细解析其余同理。简答题1题目写出卷积输出尺寸的计算公式。答案其中H_in是输入高度padding是填充的圈数kernel_size是卷积核高度stride是步幅。宽度相同公式。简答题2题目使用给定参数stride1,padding0写出输出的第2行第1个数是如何计算出来的可参考代码中的输入和卷积核。详细答案输入是一个5×5矩阵值1到25卷积核是3×3值 [[1,0,-1],[1,0,-1],[1,0,-1]]。输出第2行第1个数对应卷积核中心与输入的第2行第1列对齐此时卷积核覆盖输入的区域是输入的行索引1~3列索引0~2从0开始。这些位置的值为[ [6,7,8],[11,12,13],[16,17,18] ]与卷积核逐元素相乘再求和(6×1)(7×0)(8×(-1)) (11×1)(12×0)(13×(-1)) (16×1)(17×0)(18×(-1)) (6 -8) (11-13) (16-18) (-2) (-2) (-2) -6因此程序输出的该位置值为 -6。简答题3题目当padding (kernel_size - 1) // 2且 stride1 时输出尺寸等于什么这种填充方式叫什么答案代入公式H_out (H_in 2*((k-1)//2) - k) // 1 1如果 k 是奇数(k-1)//2 (k-1)/2则分子H_in (k-1) - k H_in -1除以1得H_in -1再加1得H_in。所以输出尺寸等于输入尺寸。这种填充方式称为Same Padding或保形填充。五、计算题详细步骤5.1 特征图尺寸计算每题2分输入32×32×3Conv2d(3,16,3, stride1, padding0)公式(32 0 - 3)/1 1 30 →30×30通道数16不变但题目只要求尺寸答30×30输入30×30×16MaxPool2d(2, stride2)公式(30 - 2)/2 1 28/214 115 →15×15通道数16不变输入32×32×3Conv2d(3,16,5, stride2, padding1)公式(32 2×1 - 5)/2 1 (322-5)2929÷214整数除法115 →15×15输入28×28×6Conv2d(6,16,5, stride1, padding0)(28 0 - 5)/1 1 24 →24×24注意题目中要求输出尺寸不需要写通道数只写高×宽。5.2 感受野计算6分题目三层卷积网络第一层 kernel3, stride2第二层 kernel3, stride1第三层 kernel3, stride1。求第三层特征图上每个神经元相对于原始输入的感受野。步骤从最后一层第三层开始向前计算。初始 RF 1第三层输出神经元。处理第三层这是反向第一层即从后往前第一个卷积层k3, s1RF 1 (3-1)*1 3处理第二层k3, s1RF 3 (3-1)*1 5处理第一层k3, s2RF 5 (3-1)*2 5 4 9所以感受野大小为9×9。解析为什么这样算因为感受野的计算可以理解为当前层的神经元在上一层的输入区域大小是(RF_prev - 1)*stride kernel从后向前递推。实验代码中的函数receptive_field正是这样实现的。5.3 LeNet特征图填空6分已知输入 1×28×28层计算过程输出形状conv1 (k5,s1,p0, 1→6)(28-5)/11246×24×24pool1 (2×2,s2)24/2126×12×12conv2 (k5,s1,p0, 6→16)(12-5)/11816×8×8pool2 (2×2,s2)8/2416×4×4flatten16×4×4256256一维六、代码填空题答案1in_channels6out_channels5kernel_size2kernel_size2strideksview10旋转 ±10 度解析空1、空2、空3分别填1、6、5。详细解析空1in_channels输入通道数。MNIST数据集的图像是灰度图只有一个颜色通道所以in_channels1。空2out_channels输出通道数也等于卷积核的个数。这里我们希望输出6个特征图原LeNet设计所以填6。空3kernel_size卷积核大小。LeNet中第一个卷积核是5×5所以填5。为什么输出形状是 (1,6,24,24)使用公式H_out (H_in 2*padding - kernel_size) // stride 1代入H_in28, padding0, kernel_size5, stride1→(280-5)//1 1 23124。输出通道数等于out_channels6batch1所以形状(1,6,24,24)。空4、空5分别填2、2。详细解析池化层的kernel_size2表示池化窗口是 2×2stride2表示窗口每次滑动2步不重叠。输入特征图尺寸是 24×24池化后尺寸减半24//212。通道数不变仍为6所以输出(1,6,12,12)。公式验证(24 - 2)//2 1 22//2111112。正确。空6、空7分别填k、s。详细解析感受野递推公式从最后一层向第一层RF_prev (RF_cur - 1) * stride kernel_size在循环中k是当前层的卷积核大小s是当前层的步幅。公式写成增量形式RF_new RF_old (k - 1) * s所以(______ - 1)应该填入k* ______应该填入s。如果填其他数字计算结果就会错误。空8填view。详细解析经过两个卷积-池化块后x的形状是(batch, 16, 4, 4)。全连接层nn.Linear要求输入是二维(batch, features)。x.size(0)是 batch 大小-1表示自动计算剩下的维度总数16*4*4256。view(x.size(0), -1)将每个样本的特征图拉直成一维得到(batch, 256)。PyTorch 中改变形状用view不能用reshape吗也可以但 LeNet 经典写法用view。题目填view是正确的。空9填10。详细解析RandomRotation(degrees)中degrees表示旋转角度的范围。如果填10表示在[-10, 10]度之间随机旋转。实验要求“随机旋转 ±10度”所以填10。如果填20就变成 ±20 度会旋转过大可能影响识别。
《人工智能概论》实验5 知识点复习提纲
一、卷积神经网络核心概念1. 卷积操作卷积核在输入图像上滑动计算对应位置元素相乘再求和得到输出特征图的一个像素。卷积核大小kernel_size通常是奇数如 3×3、5×5。2. 填充Padding在输入边界周围补充像素通常补0作用控制输出尺寸保护边缘信息。padding1表示上下左右各补1行/列0。Same paddingpadding (kernel_size - 1) // 2当 stride1 时输出尺寸等于输入尺寸。3. 步幅Stride卷积核每次滑动的步长。步幅越大输出尺寸越小。4. 卷积输出尺寸计算公式必考宽度同理5. 池化层Pooling最大池化取窗口内的最大值。平均池化取窗口内的平均值。池化层参数kernel_size窗口大小、stride步幅。输出尺寸公式(H_in - kernel_size) // stride 1池化层作用降维、减少计算量、增强平移不变性。6. 多输入 / 多输出通道输入通道in_channels彩色图像为3RGB灰度图为1。输出通道out_channels每个输出通道对应一组独立的卷积核提取不同特征。卷积层构造参数nn.Conv2d(in_channels, out_channels, kernel_size, ...)卷积核权重张量的形状通过conv.weight.shape查看(out_channels, in_channels, kernel_height, kernel_width)注意第一个维度是输出通道数第二个是输入通道数。例如Conv2d(3, 16, 3)的权重形状为(16, 3, 3, 3)。7. 感受野Receptive Field定义某一层的一个神经元在原始输入图像上所能看到的区域大小。计算公式从最后一层向前递推初始 RF 1从后向前遍历每一层RF (RF - 1) * stride kernel_size作用感受野越大能捕捉越全局的信息。8. 数据增强对训练图像进行随机变换旋转、翻转、缩放等增加样本多样性防止过拟合。测试集不使用数据增强以保持评估的公平性。二、LeNet 网络结构适配MNIST 28×28层参数输入形状输出形状conv11→6, k5, s1, p01×28×286×24×24pool12×2, s26×24×246×12×12conv26→16, k5, s1, p06×12×1216×8×8pool22×2, s216×8×816×4×4flattenview(x.size(0), -1)16×4×4256fc1256→120256120fc2120→8412084fc384→108410x.view(x.size(0), -1)的作用将每个样本的特征图展平成一维向量以输入全连接层。三、PyTorch 中维度操作unsqueeze(dim)在指定位置增加一个大小为1的维度。squeeze()移除所有大小为1的维度或指定维度。池化和卷积层要求输入为4维(batch, channels, height, width)。《人工智能概论》实验5 考试题一、单选题每题3分给定输入尺寸28×28卷积核大小5×5步幅1填充0卷积输出尺寸是 A. 24×24B. 28×28C. 26×26D. 20×20关于填充padding的说法正确的是 A. 填充只能在输入四周补0B. 填充会降低输出特征图的分辨率C.padding1表示上下左右各补1圈D. 填充不影响感受野大小最大池化层MaxPool2d(kernel_size2, stride2)对4×4特征图池化后输出尺寸为 A. 2×2B. 3×3C. 4×4D. 1×1在LeNet中x.view(x.size(0), -1)的作用是 A. 增加一个维度B. 将多维特征图展平成一维向量保留batch维度C. 转置特征图D. 复制特征图数据增强通常只应用于 A. 训练集B. 测试集C. 验证集D. 所有数据集二、填空题每空2分卷积输出尺寸计算公式为一个Conv2d(3, 16, kernel_size3, stride1, padding1)层的卷积核形状是(16, _, _, _)。感受野计算函数中从最后一层向前递推rf rf (k - 1) * s。若两层卷积核均为3步幅第一层2、第二层1则最终感受野大小为 ____。LeNet中第二个池化层pool2的输入通道数是 ____输出通道数不变。池化层不会改变通道数。在PyTorch中unsqueeze(0)是在第0维增加一个维度squeeze()用于移除维度大小为 ____ 的维度。三、判断题正确打“√”错误打“×”每题2分 卷积核的数量决定输出特征图的通道数。 池化层具有可训练参数。 感受野只与卷积核大小有关与步幅无关。 数据增强可以帮助提高模型泛化能力。 在LeNet的forward中x x.view(x.size(0), -1)之前不需要展平因为全连接层会自动处理。四、简答题将原实验中的思考题整合共35分简答题13分来自3.1(1)写出卷积输出尺寸的计算公式。简答题24分来自3.1(3)使用给定参数stride1,padding0写出输出的第2行第1个数是如何计算出来的可参考代码中的输入和卷积核。简答题34分来自3.2(3)当padding (kernel_size - 1) // 2且 stride1 时输出尺寸等于什么这种填充方式叫什么简答题44分来自3.2(4)在nn.Conv2d中可以直接使用paddingsame参数实现相同效果吗为什么简答题53分来自3.3(5)代码中的unsqueeze和squeeze分别做了什么为什么池化前需要增加维度简答题64分来自3.3(6)最大池化和平均池化的输出结果分别是什么针对给定的4×4特征图池化层的主要作用是什么简答题73分来自3.4(7)为什么感受野很重要如果网络更深感受野会如何变化简答题84分来自3.5(8)卷积核的形状(16, 3, 3, 3)四个数字分别代表什么简答题93分来自4.1(9)数据增强的作用是什么为什么测试集不使用数据增强简答题103分来自4.2(11)x.view(x.size(0), -1)这一步的作用是什么五、计算题20分5.1 特征图尺寸计算8分完成下表每空2分输入操作输出尺寸32×32×3Conv2d(3,16,3,stride1,padding0)______30×30×16MaxPool2d(2,stride2)______32×32×3Conv2d(3,16,5,stride2,padding1)______28×28×6Conv2d(6,16,5,stride1,padding0)______5.2 感受野计算6分一个三层卷积网络第一层 kernel3, stride2第二层 kernel3, stride1第三层 kernel3, stride1。请计算第三层最后一层特征图上每个神经元相对于原始输入的感受野大小。5.3 LeNet特征图尺寸填空6分补全LeNet各层输出形状已知输入1×28×28层输出形状conv1 (k5,s1,p0, 1→6)______pool1 (2×2,s2)______conv2 (k5,s1,p0, 6→16)______pool2 (2×2,s2)______flatten后______六、代码填空题每空2分卷积层定义import torch import torch.nn as nn # 定义卷积层输入通道1输出通道6卷积核5×5步幅1填充0 conv1 nn.Conv2d(in_channels______, out_channels______, kernel_size______, stride1, padding0) # 创建一个模拟输入 (batch1, channel1, height28, width28) x torch.randn(1, 1, 28, 28) out conv1(x) print(输出形状:, out.shape) # 期望输出: torch.Size([1, 6, 24, 24])池化层# 定义最大池化层核大小2×2步幅2 pool nn.MaxPool2d(kernel_size______, stride______) # 对上面卷积的输出进行池化 pooled pool(out) print(池化后形状:, pooled.shape) # 期望输出: torch.Size([1, 6, 12, 12])感受野函数def receptive_field(kernel_sizes, strides): 计算输出层相对于原始输入的感受野大小 kernel_sizes: 各层卷积核大小列表从输入层到输出层顺序 strides: 各层步幅列表从输入层到输出层顺序 rf 1 # 从最后一层向第一层遍历 for k, s in zip(reversed(kernel_sizes), reversed(strides)): rf rf (______ - 1) * ______ return rf # 示例两层卷积核大小均为3步幅分别为2和1 rf receptive_field([3, 3], [2, 1]) print(感受野大小:, rf) # 期望输出: 7LeNet 展平class LeNet(nn.Module): def __init__(self): super().__init__() self.conv1 nn.Conv2d(1, 6, 5) # 输入1→6通道核5 self.pool1 nn.MaxPool2d(2, 2) # 2×2池化步幅2 self.conv2 nn.Conv2d(6, 16, 5) # 输入6→16通道核5 self.pool2 nn.MaxPool2d(2, 2) # 2×2池化步幅2 self.fc1 nn.Linear(16 * 4 * 4, 120) # 全连接层 self.fc2 nn.Linear(120, 84) self.fc3 nn.Linear(84, 10) def forward(self, x): x self.pool1(torch.relu(self.conv1(x))) # 输出形状: (batch, 6, 12, 12) x self.pool2(torch.relu(self.conv2(x))) # 输出形状: (batch, 16, 4, 4) x x.______(x.size(0), -1) # 展平操作 x torch.relu(self.fc1(x)) x torch.relu(self.fc2(x)) x self.fc3(x) return x # 测试模型 model LeNet() dummy torch.randn(1, 1, 28, 28) output model(dummy) print(输出形状:, output.shape) # 期望: torch.Size([1, 10])数据增强旋转角度from torchvision import transforms train_transform transforms.Compose([ transforms.RandomRotation(______), # 随机旋转 ±10度 transforms.RandomHorizontalFlip(), # 随机水平翻转 transforms.ToTensor(), transforms.Normalize((0.1307,), (0.3081,)) # MNIST归一化参数 ]) # 测试一下变换假设有一张PIL图像 # from PIL import Image # img Image.open(test.png) # img_tensor train_transform(img)参考答案与超详细解析小白版一、单选题第1题题目给定输入尺寸 28×28卷积核大小 5×5步幅 1填充 0卷积输出尺寸是 A. 24×24B. 28×28C. 26×26D. 20×20答案A详细解析首先回忆卷积输出尺寸公式输出尺寸 (输入尺寸 2×填充 - 卷积核大小) ÷ 步幅 1这里所有数字都是整数除法是整数除法向下取整。代入数字输入28填充0核5步幅1。计算括号内28 0 - 5 23。除以步幅123 ÷ 1 23。加123 1 24。所以输出是 24×24。为什么不是 28因为卷积核滑动的过程中边缘的像素只能被卷积核覆盖一部分每滑动一步输出尺寸就会减少 (核尺寸-1)这里 5-1428-424。第2题题目关于填充padding的说法正确的是 A. 填充只能在输入四周补0B. 填充会降低输出特征图的分辨率C.padding1表示上下左右各补1行/列0D. 填充不影响感受野大小答案C详细解析A选项填充通常使用0但不是“只能”。PyTorch 的卷积层nn.Conv2d的padding参数默认是补0但也可以使用其他填充模式如反射、重复等。而且padding只是一个数值表示补多少圈0但如果你用torch.nn.functional.pad可以指定不同的填充值。所以“只能”这个词太绝对错误。B选项填充是增加输出尺寸的。如果填充足够大可以让输出尺寸等于输入尺寸same padding。即使填充很小输出尺寸也比不填充时要大或相等。例如输入5×5核3步幅1无填充输出3×3加上1圈填充变成7×7输出5×5。所以填充不会降低分辨率反而可能维持或增大。C选项padding1表示在输入的四周各补1行/列通常补0。对于二维图像上下各补1行左右各补1列所以总高度增加2总宽度增加2。这个说法是正确的。D选项填充会影响感受野。因为填充相当于扩展了输入的有效范围使得卷积核可以覆盖到原来边界的区域从而影响后续层神经元能看到的原始输入范围。所以感受野会变化。因此只有 C 正确。第3题题目最大池化层MaxPool2d(kernel_size2, stride2)对4×4特征图池化后输出尺寸为 A. 2×2B. 3×3C. 4×4D. 1×1答案A详细解析池化层输出尺寸公式与卷积类似输出尺寸 (输入尺寸 - 核尺寸) ÷ 步幅 1除法是整数除法向下取整输入4核2步幅2。(4 - 2) ÷ 2 2 ÷ 2 1再加1得2。或者直观理解2×2的窗口步长2刚好不重叠地滑过4×4区域可以分成2行2列窗口所以输出2×2。最大池化取每个窗口的最大值所以输出四个值排成2×2。第4题题目在LeNet中x.view(x.size(0), -1)的作用是 A. 增加一个维度B. 将多维特征图展平成一维向量保留batch维度C. 转置特征图D. 复制特征图答案B详细解析x的形状通常是(batch, channels, height, width)比如(64, 16, 4, 4)。x.size(0)是 batch 大小64。view(64, -1)表示将每个样本每个64中的一行的所有元素排成一列-1表示自动计算该维度大小。因为原本每个样本有16*4*4256个元素所以输出形状为(64, 256)。这样就将卷积层输出的特征图“展平”成二维矩阵每一行对应一个样本的特征向量以便输入全连接层。A错不是增加维度而是合并后面的维度。C错不是转置。D错不是复制。第5题题目数据增强通常只应用于 A. 训练集B. 测试集C. 验证集D. 所有数据集答案A详细解析数据增强是为了增加训练样本的多样性防止过拟合提升泛化能力。测试集必须保持原始、未经修改的状态因为我们要评估模型在真实数据上的表现。如果对测试集也做随机变换那么评估结果就不稳定且不公平。验证集同理一般不使用数据增强以保证其能真实反映模型性能。所以只用于训练集。二、填空题第6题题目卷积输出尺寸计算公式为Hout(____2×padding−kernel_size)//____1Hout(____2×padding−kernel_size)//____1。答案H_instride详细解析标准公式中的分子部分是H_in 2*padding - kernel_size分母是stride然后向下取整再加1。这里//表示整数除法向下取整。第7题题目一个Conv2d(3, 16, kernel_size3, stride1, padding1)层的卷积核形状是(16, _, _, _)。答案333详细解析nn.Conv2d的卷积核形状为(out_channels, in_channels, kernel_height, kernel_width)。这里 out_channels16in_channels3输入是RGB图像3通道kernel_size3正方形所以高3宽3。因此形状是(16, 3, 3, 3)。注意顺序不能写错第一个数是输出通道第二个是输入通道。第8题题目感受野计算函数中从最后一层向前递推rf rf (k - 1) * s。若两层卷积核均为3步幅第一层2、第二层1则最终感受野大小为 ______。答案7详细解析感受野计算需要从最后一层往输入层方向递推。初始rf 1最后一层的输出神经元。考虑最后一层第二层因为它是最靠近输出的一层通常我们说的“第一层”是靠近输入。题目说“两层卷积核均为3步幅第一层2、第二层1”意思是第一层靠近输入stride2第二层靠近输出stride1。我们从最后一层第二层开始向前推处理第二层从后往前第一个卷积层k3s1 →rf 1 (3-1)*1 1 2 3再往前处理第一层k3s2 →rf 3 (3-1)*2 3 4 7所以感受野大小为 7×7。注意如果题目说的是两层顺序是输入→第一层(3×3, stride2)→第二层(3×3, stride1)→输出。那么计算正确。第9题题目LeNet中第二个池化层pool2的输入通道数是 ______输出通道数不变。答案16详细解析LeNet 中conv2的输出通道是16然后pool2紧接着conv2所以pool2的输入通道数就是16。池化层不会改变通道数只改变空间尺寸。第10题题目在PyTorch中unsqueeze(0)是在第0维增加一个维度squeeze()用于移除维度大小为 ______ 的维度。答案1详细解析squeeze()默认移除所有长度为1的维度。例如形状(1, 3, 1, 5)经过squeeze()后变成(3, 5)。若指定squeeze(dim)则只移除该维度前提是它长度为1。所以填空填1。三、判断题第11题题目卷积核的数量决定输出特征图的通道数。答案√详细解析卷积层中每个输出通道对应一个独立的卷积核一组权重。out_channels参数就是卷积核的数量输出特征图的通道数等于out_channels。第12题题目池化层具有可训练参数。答案×详细解析池化层最大池化、平均池化没有权重和偏置只是固定操作取最大值或平均值不参与梯度更新。因此没有可训练参数。第13题题目感受野只与卷积核大小有关与步幅无关。答案×详细解析感受野与卷积核大小和步幅都有关。步幅越大每层向前跳跃的步长越大感受野增长越快。例如单层卷积核3步幅1感受野3步幅2感受野3这里单层感受野就是核大小步幅不影响单层的感受野但影响多层叠加后的感受野。对多层网络步幅会放大感受野。第14题题目数据增强可以帮助提高模型泛化能力。答案√详细解析数据增强通过对训练图像进行随机变换旋转、翻转、缩放等创建更多样化的样本使模型学习到更鲁棒的特征从而减少过拟合提高泛化能力。第15题题目在LeNet的forward中x x.view(x.size(0), -1)之前不需要展平因为全连接层会自动处理。答案×详细解析nn.Linear层的输入要求是二维(batch, features)。卷积层输出的特征是四维(batch, channels, height, width)必须手动展平成二维否则Linear会报错或产生错误结果。因此展平是必要的。四、简答题仅选部分详细展开由于篇幅限制这里只展示简答题1、2、3的超详细解析其余同理。简答题1题目写出卷积输出尺寸的计算公式。答案其中H_in是输入高度padding是填充的圈数kernel_size是卷积核高度stride是步幅。宽度相同公式。简答题2题目使用给定参数stride1,padding0写出输出的第2行第1个数是如何计算出来的可参考代码中的输入和卷积核。详细答案输入是一个5×5矩阵值1到25卷积核是3×3值 [[1,0,-1],[1,0,-1],[1,0,-1]]。输出第2行第1个数对应卷积核中心与输入的第2行第1列对齐此时卷积核覆盖输入的区域是输入的行索引1~3列索引0~2从0开始。这些位置的值为[ [6,7,8],[11,12,13],[16,17,18] ]与卷积核逐元素相乘再求和(6×1)(7×0)(8×(-1)) (11×1)(12×0)(13×(-1)) (16×1)(17×0)(18×(-1)) (6 -8) (11-13) (16-18) (-2) (-2) (-2) -6因此程序输出的该位置值为 -6。简答题3题目当padding (kernel_size - 1) // 2且 stride1 时输出尺寸等于什么这种填充方式叫什么答案代入公式H_out (H_in 2*((k-1)//2) - k) // 1 1如果 k 是奇数(k-1)//2 (k-1)/2则分子H_in (k-1) - k H_in -1除以1得H_in -1再加1得H_in。所以输出尺寸等于输入尺寸。这种填充方式称为Same Padding或保形填充。五、计算题详细步骤5.1 特征图尺寸计算每题2分输入32×32×3Conv2d(3,16,3, stride1, padding0)公式(32 0 - 3)/1 1 30 →30×30通道数16不变但题目只要求尺寸答30×30输入30×30×16MaxPool2d(2, stride2)公式(30 - 2)/2 1 28/214 115 →15×15通道数16不变输入32×32×3Conv2d(3,16,5, stride2, padding1)公式(32 2×1 - 5)/2 1 (322-5)2929÷214整数除法115 →15×15输入28×28×6Conv2d(6,16,5, stride1, padding0)(28 0 - 5)/1 1 24 →24×24注意题目中要求输出尺寸不需要写通道数只写高×宽。5.2 感受野计算6分题目三层卷积网络第一层 kernel3, stride2第二层 kernel3, stride1第三层 kernel3, stride1。求第三层特征图上每个神经元相对于原始输入的感受野。步骤从最后一层第三层开始向前计算。初始 RF 1第三层输出神经元。处理第三层这是反向第一层即从后往前第一个卷积层k3, s1RF 1 (3-1)*1 3处理第二层k3, s1RF 3 (3-1)*1 5处理第一层k3, s2RF 5 (3-1)*2 5 4 9所以感受野大小为9×9。解析为什么这样算因为感受野的计算可以理解为当前层的神经元在上一层的输入区域大小是(RF_prev - 1)*stride kernel从后向前递推。实验代码中的函数receptive_field正是这样实现的。5.3 LeNet特征图填空6分已知输入 1×28×28层计算过程输出形状conv1 (k5,s1,p0, 1→6)(28-5)/11246×24×24pool1 (2×2,s2)24/2126×12×12conv2 (k5,s1,p0, 6→16)(12-5)/11816×8×8pool2 (2×2,s2)8/2416×4×4flatten16×4×4256256一维六、代码填空题答案1in_channels6out_channels5kernel_size2kernel_size2strideksview10旋转 ±10 度解析空1、空2、空3分别填1、6、5。详细解析空1in_channels输入通道数。MNIST数据集的图像是灰度图只有一个颜色通道所以in_channels1。空2out_channels输出通道数也等于卷积核的个数。这里我们希望输出6个特征图原LeNet设计所以填6。空3kernel_size卷积核大小。LeNet中第一个卷积核是5×5所以填5。为什么输出形状是 (1,6,24,24)使用公式H_out (H_in 2*padding - kernel_size) // stride 1代入H_in28, padding0, kernel_size5, stride1→(280-5)//1 1 23124。输出通道数等于out_channels6batch1所以形状(1,6,24,24)。空4、空5分别填2、2。详细解析池化层的kernel_size2表示池化窗口是 2×2stride2表示窗口每次滑动2步不重叠。输入特征图尺寸是 24×24池化后尺寸减半24//212。通道数不变仍为6所以输出(1,6,12,12)。公式验证(24 - 2)//2 1 22//2111112。正确。空6、空7分别填k、s。详细解析感受野递推公式从最后一层向第一层RF_prev (RF_cur - 1) * stride kernel_size在循环中k是当前层的卷积核大小s是当前层的步幅。公式写成增量形式RF_new RF_old (k - 1) * s所以(______ - 1)应该填入k* ______应该填入s。如果填其他数字计算结果就会错误。空8填view。详细解析经过两个卷积-池化块后x的形状是(batch, 16, 4, 4)。全连接层nn.Linear要求输入是二维(batch, features)。x.size(0)是 batch 大小-1表示自动计算剩下的维度总数16*4*4256。view(x.size(0), -1)将每个样本的特征图拉直成一维得到(batch, 256)。PyTorch 中改变形状用view不能用reshape吗也可以但 LeNet 经典写法用view。题目填view是正确的。空9填10。详细解析RandomRotation(degrees)中degrees表示旋转角度的范围。如果填10表示在[-10, 10]度之间随机旋转。实验要求“随机旋转 ±10度”所以填10。如果填20就变成 ±20 度会旋转过大可能影响识别。