《人工智能概论》实验6 知识点复习提纲

《人工智能概论》实验6 复习提纲(新手超详细版)

一、本实验要学什么?

  • 残差块(Residual Block):如何让网络更深而不退化。

  • 批量归一化(BN):加速训练、稳定梯度。

  • 1×1卷积:改变通道数和空间尺寸。

  • 全局平均池化(GAP):替代全连接层,减少参数量。

  • ResNet-18结构:用残差块搭建18层网络。

  • 对比实验:有无残差连接的区别。

二、核心概念详解

2.1 残差块(最重要的概念)

问题 :普通网络堆叠很多层后,训练误差反而变大(退化问题)。

解决 :让网络学习"残差"F(x) = H(x) - x,而不是直接学习H(x)

公式 :输出 = F(x) + x,其中x是输入(恒等映射)。

残差块的结构(以两个3×3卷积为例):

复制代码
输入 x (形状: C_in, H, W)
    |
    +---> 主路径:
    |        Conv2d(C_in, C_out, 3, stride=s, padding=1)
    |        BatchNorm2d
    |        ReLU
    |        Conv2d(C_out, C_out, 3, stride=1, padding=1)
    |        BatchNorm2d
    |
    +---> 捷径(shortcut):
    |       如果 C_in != C_out 或 s != 1:使用 1×1卷积 + stride=s 调整
    |       否则:直接传递 x
    |
    +---> 相加:Y = 主路径输出 + 捷径输出
    |
    ReLU 输出

关键点

  • 只有当主路径输出与捷径输出的形状完全相同时,才能相加。

  • 形状包括:通道数、高、宽。

  • 当需要改变通道数或下采样时,捷径使用1×1卷积且步幅与主路径相同。

2.2 批量归一化(BN)

为什么要BN?

训练时每层输入的分布变化(内部协变量偏移),导致训练慢、梯度不稳定。

BN怎么做?

对每个小批量(batch)的每个通道,计算均值和方差,然后归一化:

最后乘以可学习的gamma(缩放)加beta(偏移):

放在哪里?

卷积/全连接层之后,激活函数(如ReLU)之前。

训练与测试的区别

  • 训练:用当前batch的均值和方差。

  • 测试:用训练过程中记录的滑动平均均值和方差(因为测试时可能只有一个样本)。

2.3 1×1 卷积

作用

  • 改变通道数:例如从64通道变成128通道。

  • 改变空间尺寸 :设stride=2可使高宽减半(类似于降采样)。

  • 增加非线性:1×1卷积后接BN和ReLU,增加网络深度。

2.4 全局平均池化(GAP)

操作AdaptiveAvgPool2d(1) 将每个特征图(通道)的所有像素值取平均,得到一个1×1的值。

输出形状(batch, channels, 1, 1) → 然后用reshape变成(batch, channels)

优势

  • 极大减少参数量(因为不再需要将大特征图展平后接全连接层)。

  • 防止过拟合(参数少)。

  • 空间不变性(平移不影响输出)。

2.5 ResNet-18 结构(以CIFAR-10 32×32输入为例)

操作 输入→输出通道 输出尺寸(高×宽)
b1 Conv7×7, stride=2, pad=3 → BN → ReLU → MaxPool3×3, stride=2, pad=1 3→64 8×8
b2 2个残差块(64→64, stride=1) 64→64 8×8
b3 第一个块:64→128, stride=2;第二个块:128→128, stride=1 64→128 4×4
b4 第一个块:128→256, stride=2;第二个块:256→256, stride=1 128→256 2×2
b5 第一个块:256→512, stride=2;第二个块:512→512, stride=1 256→512 1×1
GAP 全局平均池化 512→512 1×1
FC 全连接 512→10 10

三、为什么残差网络能训练很深?

从梯度传播角度

反向传播时,损失对浅层参数的梯度 = 主路径梯度 + 恒等映射梯度(直接传递)。恒等映射保证了梯度至少可以直接流回浅层,不会因为多层卷积的相乘而消失。所以可以训练上百层。


《人工智能概论》实验6 考试题(新手超详细版)

一、单选题(每题3分,共15分)

  1. 残差块中的跳跃连接主要作用是( )

    A. 增加模型参数量

    B. 提供恒等映射,缓解梯度消失

    C. 替换激活函数

    D. 降低计算复杂度

  2. 关于批量归一化(BN),下列说法正确的是( )

    A. BN在训练和测试时行为完全相同

    B. BN的γ和β是不可学习的固定参数

    C. BN通常放在激活函数之后

    D. BN可以加速训练并允许使用更大的学习率

  3. 下列哪个操作可以实现同时改变通道数空间尺寸减半 ?( )

    A. 3×3卷积,stride=1,padding=1

    B. 1×1卷积,stride=1

    C. 3×3卷积,stride=2,padding=1

    D. 最大池化,kernel=2,stride=2

  4. 在ResNet-18中,全局平均池化层(GAP)的输出形状是( )

    A. (batch, 512, 1, 1)

    B. (batch, 512)

    C. (batch, 512, 7, 7)

    D. (batch, 10)

  5. 以下关于1×1卷积的描述,错误 的是( )

    A. 可以改变特征图的通道数

    B. 1×1卷积不能改变特征图的空间尺寸

    C. 可以增加非线性(配合激活函数)

    D. 它的感受野是1×1


二、填空题(每空2分,共20分)

  1. 实验准备中,device = torch.device(______ if torch.cuda.is_available() else ______),第一个空应该填 ______,第二个空填 ______。

  2. 残差块中,当需要调整输入形状时,捷径(shortcut)使用的是 ______ × ______ 卷积,其作用是调整输入的 ______(填"通道数"或"空间尺寸"或"两者")。

  3. 残差块中,两个 3×3 卷积的 kernel_size 应设为 ______。

  4. 当需要降采样且改变通道数时,残差块的 use_1x1conv 应设为 ______,strides 应设为 ______。

  5. 批量归一化中的可学习参数是 ______ 和 ______。

  6. 全局平均池化使用 nn.AdaptiveAvgPool2d(______) 实现输出形状为 (batch, channels, 1, 1)


三、判断题(正确打"√",错误打"×",每题2分,共10分)

  1. ( )残差网络可以训练到上百层而不会出现梯度消失,完全归功于批量归一化。

  2. ( )1×1卷积不能改变特征图的高和宽,只能改变通道数。

  3. ( )在训练阶段,BN使用的是当前batch的均值和方差;在测试阶段,使用的是训练阶段记录的滑动平均均值和方差。

  4. ( )全局平均池化会增加模型参数量,因为它引入了额外的全连接层。

  5. ( )残差块的输出是 Y = F(X) + X,其中 F(X) 必须和 X 形状相同,否则不能相加。


四、简答题(共30分)

简答题1(4分) 为什么要对图像数据进行 Normalize 操作?CIFAR-10的均值和标准差是如何确定的?

简答题2(4分) 在残差块中,当 use_1x1conv=True 时,conv3stride 应该设为什么?为什么?

简答题3(4分) 批量归一化(BN)在残差块中放在什么位置?它的主要作用是什么?

简答题4(4分) BN中的 gammabeta 代表什么?初始值通常设为多少?

简答题5(4分) 什么是全局平均池化(GAP)?它与 Flatten 后接全连接层相比有什么优势?

简答题6(4分) 残差网络为什么能训练到上百层而普通网络不行?从梯度传播角度解释。

简答题7(6分) 对比 ResNet18 和 PlainNet18(无残差连接)的训练过程,残差连接带来了哪些优势?从收敛速度和最终准确率两方面回答。


五、计算题(15分)

5.1 残差块输出维度计算(6分)

假设输入特征图形状为 (batch, 64, 32, 32),经过以下残差块:

Residual(64, 128, use_1x1conv=True, strides=2)

请写出输出形状,并详细说明计算过程(包括主路径和捷径的尺寸变化)。

5.2 ResNet-18 输出尺寸推导(9分)

输入为 3×32×32 的CIFAR-10图像,计算经过以下各层后的输出形状,填写下表:

操作 输出形状(batch, 通道, 高, 宽)
b1 Conv2d(3→64, 7×7, stride=2, padding=3) + BN + ReLU + MaxPool2d(3×3, stride=2, padding=1) ______
b2 2个残差块(64→64, stride=1) ______
b3 2个残差块(64→128, 第一个stride=2) ______
b4 2个残差块(128→256, 第一个stride=2) ______
b5 2个残差块(256→512, 第一个stride=2) ______
GAP 全局平均池化 ______
FC 全连接层(512→10) ______

六、代码填空题(每空2分,共10分)

代码填空1(设备与数据加载)

python 复制代码
import torch
import torchvision
import torchvision.transforms as transforms
from torch.utils.data import DataLoader

# 设置设备:如果有GPU就用cuda,否则用cpu
device = torch.device(______ if torch.cuda.is_available() else ______)
print("使用设备:", device)

# 图像预处理:转换为张量 + 归一化
transform = transforms.Compose([
    transforms.ToTensor(),
    transforms.Normalize((0.4914, 0.4822, 0.4465), (0.2023, 0.1994, 0.2010))
])

# 加载CIFAR-10训练集(需要下载)
trainset = torchvision.datasets.CIFAR10(root='./data', train=______, download=True, transform=transform)
# 加载CIFAR-10测试集
testset = torchvision.datasets.CIFAR10(root='./data', train=______, download=True, transform=transform)

# 创建数据加载器
trainloader = DataLoader(trainset, batch_size=128, shuffle=______)   # 训练集需要打乱顺序
testloader = DataLoader(testset, batch_size=128, shuffle=______)     # 测试集不需要打乱
复制代码

代码填空2(残差块中的残差连接)

python 复制代码
import torch.nn as nn
import torch.nn.functional as F

class Residual(nn.Module):
    def __init__(self, input_channels, num_channels, use_1x1conv=False, strides=1):
        super().__init__()
        # 第一个卷积层:3x3卷积,填充1保持尺寸(如果步幅为1),步幅由参数决定
        self.conv1 = nn.Conv2d(input_channels, num_channels, kernel_size=3, padding=1, stride=strides)
        # 第二个卷积层:3x3卷积,步幅固定为1
        self.conv2 = nn.Conv2d(num_channels, num_channels, kernel_size=3, padding=1)
        # 批量归一化层
        self.bn1 = nn.BatchNorm2d(num_channels)
        self.bn2 = nn.BatchNorm2d(num_channels)
        # 捷径:如果需要改变通道数或下采样,则使用1x1卷积
        if use_1x1conv:
            self.conv3 = nn.Conv2d(input_channels, num_channels, kernel_size=1, stride=strides)
        else:
            self.conv3 = None

    def forward(self, X):
        # 主路径:卷积 -> BN -> ReLU -> 卷积 -> BN
        Y = F.relu(self.bn1(self.conv1(X)))
        Y = self.bn2(self.conv2(Y))
        # 捷径:如果需要,则调整X的形状
        if self.conv3:
            X = self.conv3(X)
        # 残差连接:将主路径输出与捷径输出相加
        Y = Y ______ X   # 填空:这里应该用什么运算符?
        # 最后经过ReLU激活
        return F.relu(Y)
复制代码

参考答案与超详细解析(新手必读)

一、单选题

1. B

解析 :跳跃连接就是恒等映射 +X。没有它时,深层网络梯度反向传播要经过很多层,每层梯度都小于1,乘积后梯度消失。有了恒等映射,梯度可以直接从输出传到输入,不会消失。

2. D

解析:A错:训练用batch统计量,测试用滑动平均;B错:γ和β可学习;C错:BN放在卷积/线性层之后、激活之前;D正确。

3. C

解析 :3×3卷积,stride=2,padding=1,输出尺寸减半,且可设置out_channels改变通道数。B选项(1×1卷积,stride=1)不能改变尺寸。D选项只改变尺寸不改变通道数。A选项尺寸不变。所以选C。

4. A

解析AdaptiveAvgPool2d(1)输出形状为(batch, channels, 1, 1)。ResNet-18最后通道512,所以是(batch,512,1,1)

5. B

解析:1×1卷积设stride>1可以改变空间尺寸,所以B说法错误,是本题要选的错误选项。A、C、D正确。


二、填空题

第6题答案

  • 空1'cuda'

  • 空2'cpu'

超详细解析

  • torch.cuda.is_available() 会检测当前环境是否有可用的 NVIDIA GPU。如果有,返回 True,否则 False

  • 如果为 True,则 'cuda' if True else 'cpu' 结果为 'cuda',表示将模型和数据放到 GPU 上运行,可以大幅加速训练。

  • 如果为 False,则结果为 'cpu',所有计算在 CPU 上完成。

  • 注意'cuda''cpu' 都是字符串,必须加引号。


第7题答案

超详细解析

  • 第一空:1

  • 第二空:1

  • 第三空:两者(或"通道数和空间尺寸")

  • 在残差块中,当输入输出通道数不同或需要下采样(空间尺寸减半)时,捷径(shortcut)会使用 1×1 卷积 来调整 X 的形状。

  • 1×1 卷积可以改变通道数(通过设置不同的 out_channels),也可以通过设置 stride>1 来改变空间尺寸(高和宽减半)。

  • Residual 类的 __init__ 中,conv3 = nn.Conv2d(input_channels, num_channels, kernel_size=1, stride=strides)。当 strides=2num_channelsinput_channels 不同时,它同时改变了通道数和空间尺寸。

  • 因此,填空应写 1×1 卷积,作用是调整 两者(通道数和空间尺寸)。


第8题答案

  • 答案3

超详细解析

  • 标准残差块(如 ResNet-18 中使用的)由两个 3×3 卷积组成。

  • 卷积核大小(kernel_size)设置为 3,表示滤波器是 3 行 3 列。

  • 使用 3×3 卷积是因为它能够捕捉局部特征,且参数量适中。

  • 如果填 5 或 7,参数量会变大,且不是经典设计。


第9题答案

  • 答案True2

超详细解析

  • 当需要降采样 (使特征图高宽减半)并且改变通道数 (例如从 64 通道变为 128 通道)时,主路径的第一个卷积会设置 stride=2

  • 此时捷径也必须调整输入 X 的形状,使其与主路径输出形状一致。

  • 调整方法:使用 1×1 卷积 ,并且步幅也设为 2,这样输出尺寸也会减半。

  • use_1x1conv=True 表示启用捷径上的 1×1 卷积;strides=2 让该卷积也进行下采样。


第10题答案

  • 答案gammabeta

超详细解析

  • 批量归一化(BN)的公式:y = gamma * (x - mean)/sqrt(var + eps) + beta

  • gamma缩放参数(scale),初始值通常为 1,可学习。

  • beta偏移参数(shift),初始值通常为 0,可学习。

  • 这两个参数让网络可以恢复或调整归一化后的分布,增加表达能力。

  • 注意:meanvar 不是可学习的,它们是统计量。


第11题答案

  • 答案1

超详细解析

  • nn.AdaptiveAvgPool2d(output_size) 会将每个特征图的空间尺寸(高和宽)自适应地池化到指定的 output_size

  • output_size=1 时,无论输入是多大(如 7×7 或 8×8),输出都会是 1×1。

  • 因此输出形状为 (batch, channels, 1, 1)

  • 后续通常使用 x = x.view(x.size(0), -1) 将其展平为 (batch, channels),再送入全连接层。

  • 这样做极大减少了参数量,且实现了全局感受野。


三、判断题

  1. ×(残差连接才是关键,BN辅助但不是根本原因)

  2. ×(1×1卷积设stride>1可改变尺寸)

  3. ×(GAP大幅减少参数量)

  4. (形状必须相同才能相加)


四、简答题(超详细)

简答题1

为什么要Normalize? 神经网络训练时,希望输入数据均值为0、方差为1,这样梯度在不同维度上尺度一致,训练更稳定、收敛更快。

均值和标准差怎么来的? 预先在整个CIFAR-10训练集上,对每个颜色通道(R,G,B)分别计算所有像素值的均值和标准差,然后固定使用。

简答题2

stride应设为主路径的stride(这里是2)

原因:主路径的第一个卷积可能设置了stride=2(为了降采样),导致其输出空间尺寸减半;捷径也必须以相同的stride进行1×1卷积,才能让输出尺寸与主路径匹配,从而相加。

简答题3

位置 :每个卷积层之后、ReLU激活函数之前。

主要作用:加速训练(允许更大学习率)、缓解梯度消失、减少过拟合。

简答题4

  • gamma:缩放因子,初始为1。

  • beta:偏移量,初始为0。

    它们可学习,让网络能够恢复或调整归一化后的分布。

简答题5

GAP :对每个特征图的所有像素取平均值,得到一个1×1的值。

优势

  • 参数极大减少(原来展平后可能有成千上万个输入到全连接层,现在直接是通道数)。

  • 降低过拟合风险。

  • 具有空间平移不变性。

简答题6

梯度传播角度 :普通网络的梯度反向传播时,每层都要乘以该层的导数(通常<1),多层累乘后梯度消失。

残差网络中,梯度可以通过恒等映射直接传到浅层,不受卷积层导数影响,因此能保持梯度不消失,可以训练上百层。

简答题7

  • 收敛速度:ResNet更快,因为梯度直接流动,优化容易。

  • 最终准确率:ResNet更高,因为可以训练更深而不退化,而PlainNet加深后准确率反而下降。


五、计算题

5.1 残差块输出形状

已知 :输入 (batch, 64, 32, 32),残差块:Residual(64, 128, use_1x1conv=True, strides=2)

主路径

  • 第一个卷积:输入64通道,输出128通道,kernel=3,stride=2,padding=1

    输出高宽 = (32 + 2*1 - 3)//2 + 1 = (32+2-3)//2+1 = 31//2+1 = 15+1=16

    输出形状 (batch, 128, 16, 16)

  • 第二个卷积:输入128,输出128,kernel=3,stride=1,padding=1

    尺寸不变,仍16×16。

捷径 :1×1卷积,输入64→128,stride=2

输出高宽 = (32 + 2*0 - 1)//2 + 1 = (32-1)//2+1 = 31//2+1 = 15+1=16

形状 (batch, 128, 16, 16)

相加 后形状相同:(batch, 128, 16, 16)

5.2 ResNet-18各层输出形状

计算步骤(逐层手算):

计算过程 输出形状
b1 Conv: (32+6-7)//2+1=16 → MaxPool: (16+2-3)//2+1=8 (batch, 64, 8, 8)
b2 stride=1,尺寸不变 (batch, 64, 8, 8)
b3 第一个块 stride=2: (8+2-3)//2+1=4 (batch, 128, 4, 4)
b4 第一个块 stride=2: (4+2-3)//2+1=2 (batch, 256, 2, 2)
b5 第一个块 stride=2: (2+2-3)//2+1=1 (batch, 512, 1, 1)
GAP 自适应平均池化 (batch, 512, 1, 1)
FC 全连接层 (batch, 10)

六、代码填空题答案

代码填空1 答案解析

空1'cuda'

空2'cpu'

解析torch.device('cuda' if torch.cuda.is_available() else 'cpu') 的意思是:如果检测到GPU可用,就用'cuda',否则用'cpu'。这样模型和数据会自动运行在GPU上(如果有),否则退化为CPU。

空3True

空4False

解析train=True 表示加载训练集(50000张),train=False 表示加载测试集(10000张)。

空5True

空6False

解析shuffle=True 会在每个epoch打乱训练集顺序,避免模型记住顺序,提高泛化能力。测试集不需要打乱(shuffle=False),因为评估时顺序无关紧要,且打乱会浪费计算。


代码填空2 答案解析

空7+(加法运算符)

解析 :残差网络的核心思想就是将主路径的输出与捷径(恒等映射)的输出相加 。所以 Y = Y + X。如果写成 Y = Y - XY = Y * X,就完全改变了残差块的定义。加法是唯一正确的运算符。

为什么是加法?

残差块公式:H(x) = F(x) + x,其中 F(x) 是两个卷积层的输出。让网络学习残差 F(x) = H(x) - x 比直接学习 H(x) 更容易优化。所以代码中必须用加法。

相关推荐
林间码客1 小时前
《人工智能概论》实验3 知识点复习提纲
人工智能
科技圈快迅1 小时前
商业旅拍后期修图软件实测:像素蛋糕功能与应用分析
人工智能
无忧智库1 小时前
某矿山井下人员精准定位与AI行为安全识别管控系统建设方案(WORD)
人工智能·安全
湘美书院--湘美谈教育2 小时前
湘美谈教育AI经验集锦:有些东西,它们很难蒸馏
大数据·人工智能·深度学习·机器学习
HyperAI超神经2 小时前
深度估计准确率冲上0.9,Meta提出VLM³,论证视觉模型天生会学3D,以Qwen3-VL-4B为基础实现多任务的统一建模
人工智能·3d·大模型·多模态·空间推理·3d感知·3d理解
Hello:CodeWorld2 小时前
Dify 从入门到实战:部署、模型对接与企业级 AI 应用开发全教程
人工智能·python·架构·ai编程
AllData公司负责人2 小时前
大模型赋能AllData数据中台,系列升级|通过联合智谱大模型与Chat2DB开源项目,建设Text2SQL生产场景全新体验的数据源平台!
数据库·人工智能·text2sql·数据中台·数据源·chat2db·智谱大模型
xinlianyq2 小时前
2026 电商视觉红海突围:核心 AI 视频与海报创作工具实战选型指南
人工智能·aigc
Deepoch2 小时前
Deepoc VLA开发板:除草机器人的持续学习与协同作业系统
人工智能·学习·机器人·开发板·具身模型·deepoc