跳转至

第08章 · 计算机视觉 · 阶段测试题答案


一 · 单选 (8 题)

1.1 B - 1×1 卷积用于通道调整和特征融合。

1.2 A - ReLU: max(0, x), 解决梯度消失。

1.3 C - YOLO 是单阶段实时检测。

1.4 B - 感受野 = 卷积核累积覆盖区域。

1.5 A - ViT 把图像分成 16×16 patch。

1.6 B - U-Net 用于医学图像分割。

1.7 C - Diffusion 通过去噪过程生成。

1.8 A - NeRF 用 2D 图像生成 3D。


二 · 多选 (4 题)

2.1 ABD - 都是经典 CNN 架构。

2.2 ABC - 图像增强方法。

2.3 ABD - C 错: Dropout 在推理时关闭。

2.4 ABC - 都是 CV 子任务。


三 · 简答 (5 题)

3.1 卷积 vs 全连接

维度 全连接 卷积
连接 全部 局部
参数 巨大 少(权重共享)
平移不变性 ❌ ✅
空间结构 丢失 保留

3.2 ResNet 残差连接

核心: y = F(x) + x 作用: - 解决梯度消失, 可训练 1000+ 层 - 学习"残差"比学"完整映射"容易 - 加法不增加参数

3.3 目标检测两阶段 vs 单阶段

两阶段: R-CNN / Fast R-CNN / Faster R-CNN - 先生成候选区域(Region Proposal) - 再分类 + 回归 - 精度高, 速度慢

单阶段: YOLO / SSD / RetinaNet - 端到端, 直接预测 - 速度快, 实时应用 - 精度略低(但已经追上)

3.4 ViT vs CNN

ViT: - Patch (16×16) → Embedding → Transformer Encoder - 缺少归纳偏置 (无平移不变性) - 大数据集 (ImageNet-21k, JFT) 上超 CNN - 小数据集需要强数据增强

CNN: - 局部性 + 平移不变性 - 数据效率高, 小数据集也行 - 主流仍是 EfficientNet / ConvNeXt

3.5 Diffusion 原理

前向: x₀ → x₁ → ... → x_T (逐步加噪) 反向: x_T → x_{T-1} → ... → x₀ (逐步去噪, 由模型学) 训练: 预测每步噪声 ε(xₜ, t) 采样: 从 x_T ~ N(0, I) 开始反向迭代

代表: DDPM / Stable Diffusion / DiT / Sora


四 · 编程 (2 题)

4.1 CNN 图像分类

import torch
import torch.nn as nn

class SimpleCNN(nn.Module):
    def __init__(self, num_classes=10):
        super().__init__()
        self.features = nn.Sequential(
            nn.Conv2d(3, 32, 3, padding=1), nn.ReLU(),
            nn.MaxPool2d(2),  # 32x32
            nn.Conv2d(32, 64, 3, padding=1), nn.ReLU(),
            nn.MaxPool2d(2),  # 16x16
            nn.Conv2d(64, 128, 3, padding=1), nn.ReLU(),
            nn.AdaptiveAvgPool2d(1),  # 1x1
        )
        self.classifier = nn.Linear(128, num_classes)

    def forward(self, x):
        return self.classifier(self.features(x).flatten(1))

4.2 Diffusion 简化

import torch

def add_noise(x0, t, noise):
    """x_t = sqrt(alpha_bar_t) * x_0 + sqrt(1 - alpha_bar_t) * noise"""
    alpha_bar_t = 0.99 ** t
    return torch.sqrt(alpha_bar_t) * x0 + torch.sqrt(1 - alpha_bar_t) * noise