、GAN 图像生成与自监督学习)
教程文档深度学习计算机视觉【免费下载链接】cs231n.github.ioPublic facing notes page项目地址https://gitcode.com/gh_mirrors/cs/cs231n.github.io点击查看免费下载CS231n 第三份大作业Assignment 3聚焦于序列建模与生成式模型你将用 PyTorch 实现 Vanilla RNN 与 Transformer 完成 COCO 数据集上的图像描述Image Captioning训练生成对抗网络GAN生成逼真图像并借助自监督预训练提升小样本图像分类性能。本文以 assignments/2023/assignment3.md 的任务说明为骨架结合本仓库的配套课程讲义RNN 讲义、Transformer 讲义、生成模型讲义、CNN 可视化讲义与环境配置文档setup.md完整拆解每个问题Q1Q5、加分题与提交流程帮助你把每个 notebook 从读题、实现到交卷的每一步都做扎实。任务总览与学习目标这份作业Spring 2023 版截止时间为 2023 年 5 月 30 日 11:59pm PST围绕三块核心技术展开理解并实现 RNN 与 Transformer 网络并将其与 CNN 结合完成 COCO 数据集上的图像描述理解并训练 GAN让生成网络产出与训练数据分布相似的图像利用自监督学习从无标签数据中自动学习视觉表征辅助图像分类任务。作业中绝大多数内容使用PyTorch完成。Starter code 以 Colab notebook 形式提供2023 版对应 assignments/2023/assignment3_colab.zip包含六个必须完成的 notebookNetwork_Visualization.ipynb、RNN_Captioning.ipynb、Transformer_Captioning.ipynb、Generative_Adversarial_Networks.ipynb、Self_Supervised_Learning.ipynb以及一个用于收集代码的collect_submission.ipynb另含一个 5 分加分题 notebookLSTM_Captioning.ipynb。更早版本如 assignments/2022/assignment3.md曾给出过各题分值分配RNN 图像描述 30 分、Transformer 图像描述 25 分、GAN 15 分、自监督学习 20 分、LSTM 加分 5 分可作参考2023 版将网络可视化Saliency Maps 等设为 Q1整体难度递进先做梯度可视化理解网络再依次攻克 RNN、Transformer、GAN 与自监督四个硬骨头。环境准备Colab 云端工作流与本地虚拟环境推荐的 Colab 远程工作流本年度官方推荐在 Google Colaboratory 上完成作业详见 setup.md。Colab 本质上是 Jupyter notebook 与 Google Drive 的结合体运行在云端且预装了大量依赖如 PyTorch、Tensorflow所有人都能获得一致的运行环境并免费使用 GPUK80、P100 等与 TPU 硬件加速器——这对本作业尤其重要因为 Q4 GAN 与 Q5 自监督训练的 notebook 开头都明确要求打开 notebook 后先进入Runtime Change runtime type将Hardware accelerator设置为GPU。标准工作流为下载作业提供的 zip 压缩包内含 Colab notebooks 与 Python starter code将文件夹上传到自己的 Google Drive在 Colab 中打开 notebook 完成实现并运行将进度保存回 Drive。配套有一份官方 Colab 演示视频教程与 setup 页面中的一致建议开始前先观看一遍熟悉流程。两条必须养成的习惯定期保存Colab 资源不保证长期在线空闲过久或单次连接超过约 12 小时VM 就会断开未保存的进度将全部丢失。请随时File - Save保存 notebook不要指望自动保存本地兜底虽然官方不正式支持本地开发但作业附带了一份requirements.txt可用它搭建虚拟环境在本地跑通全流程作为云端断连时的备份方案。本地虚拟环境搭建备选方案如需在本地开发setup.md 提供了 Anaconda 与 Pythonvenv两套方案注意需使用 Python 3官方已不再支持 Python 2# 方式一Anaconda 虚拟环境推荐自带 MKL 优化 conda create -n cs231n python3.7 conda activate cs231n # 方式二Python 原生 venv python3.7 -m venv ~/cs231n source ~/cs231n/bin/activate激活环境后进入作业目录安装依赖cd assignment3 # 进入作业目录 pip install -r requirements.txt注意每次开始做作业前都要先重新激活虚拟环境conda activate cs231n或source ~/cs231n/bin/activate并可用which python确认当前 python 二进制确实指向环境内的解释器避免依赖装错环境。Q1网络可视化——Saliency Maps、Class Visualization 与 Fooling ImagesNetwork_Visualization.ipynb是本作业的热身题也是后续所有题目理解梯度的基础。它引入预训练的 SqueezeNet 模型教你把网络的梯度反向传播到输入图像本身并利用这些梯度完成三类可视化Saliency Maps显著图计算分类损失对输入图像的梯度逐像素求绝对值/取最大通道得到图像中哪些区域对该分类结果贡献最大的热力图。这与 understanding-cnn.md 中介绍的Data Gradient技术一脉相承——论文Deep Inside Convolutional Networks: Visualising Image Classification Models and Saliency Maps正是通过梯度可视化揭示模型决策依据Class Visualization类别可视化反过来将输入图像当作可优化变量通过梯度上升让某个类别的得分最大化直观看到网络眼中的某一类长什么样Fooling Images欺骗图像对真实图像施加精心构造的微小扰动使其被网络误分类为完全不同的目标类别——这就是对抗样本的核心思想对应 understanding-cnn.md 中 Fooling ConvNets 一节引用的Explaining and Harnessing Adversarial Examples等工作。从 understanding-cnn.md 可以延伸理解这类可视化的共性原理ConvNet 可以被看作把图像逐步变换到类间线性可分的表示空间而可视化激活Activation Maps、首层卷积核权重Filters、遮挡分析Occlusion等技巧都是在不同粒度上回答同一个问题——网络到底看到了什么。做这道题时建议先想清楚损失对输入求导与损失对权重求导在实现上的区别前者不更新网络参数只更新输入图像以及为什么 Saliency Map 需要对每个像素取梯度的绝对值或通道最大值。Q2基于 Vanilla RNN 的图像描述COCORNN_Captioning.ipynb带你从零实现Vanilla普通RNN并应用到 COCO 数据集上的图像描述任务。图像描述是一个典型的one-to-many序列任务输入是一张定尺寸的图片由 CNN 抽取特征向量输出是一串描述图片内容的单词序列。Vanilla RNN 的核心递推公式RNN 讲义 给出了最简形式网络维护一个隐藏状态 $h$在每一时刻用同一个参数化的函数更新它$$ h_t \tanh(W_{hh} h_{t-1} W_{xh} x_t) $$其中 $W_{hh}$、$W_{xh}$ 分别把上一时刻隐藏状态 $h_{t-1}$ 与当前输入 $x_t$ 投影到隐藏空间并求和再经 $\tanh$ 非线性压缩。预测则是在隐藏状态之上再做一次线性投影$$ y_t W_{hy} h_t $$关键在于同一个 $f_W$ 在每一时刻被重复使用参数共享因此网络可以处理任意长度的序列这正是 RNN 能应对变长输入输出的原因。讲义中的字符级语言模型例子训练序列为 hello词表为 {h, e, l, o}字符用 one-hot 向量编码是理解图像描述训练流程的最佳类比——每一时刻输入一个 token模型输出下一个 token 的 logits 分布用 softmax 分类损失作为监督信号反向传播。实现 notebook 中的rnn_step_forward/rnn_step_backward或对应函数时可对照上述公式逐项实现前向计算 $h_t$ 与 $y_t$反向用链式法则把 $\partial L / \partial h_t$ 通过 $\tanh$ 的导数 $1 - \tanh^2(\cdot)$ 传回 $h_{t-1}$ 与 $x_t$ 路径。若暂时想不清楚梯度流可先看 RNN 讲义 中关于 Vanilla RNN 梯度流的推导由于 $\tanh$ 导数几乎总小于 1跨长序列的反传梯度会连乘衰减导致梯度消失——这正是后面 Q3Transformer与加分题LSTM要解决的问题。Q3基于 Transformer 的图像描述COCOTransformer_Captioning.ipynb让你实现一个Transformer 模型并同样应用于 COCO 图像描述。Transformer 讲义 指出相比 RNNTransformer 的优势在于注意力计算会看向全部输入能天然捕捉长距离依赖借助位置编码可以处理有序序列所有位置的注意力分数可以并行计算训练速度远快于按时刻串行的 RNN/LSTM。多头缩放点积注意力讲义把注意力拆解成三层递进点积注意力Dot-Product Attention给定查询 $q$ 与键 ${k_1,\dots,k_n}$、值 ${v_1,\dots,v_n}$输出是对值向量的加权平均权重来自查询与各键的相似度自注意力Self-Attention值的来源是从输入自身派生的 $V、K、Q$多头缩放点积注意力Multi-Headed Scaled Dot-Product Attention为每个头学习独立的参数矩阵 $V_i, K_i, Q_i$形状 $D \times D$提升模型同时关注输入不同部分的表达力并加入缩放项 $1/\sqrt{d/h}$抑制大数值向量对 softmax 的过度影响。缩放注意力后通常还会施加dropout作用在注意力权重上最后接一层线性变换让模型学习头与头之间的关系。历史版本2022曾专门更新说明MultiHeadAttention类中需要对注意力权重应用 dropout2023 版沿用这一要求实现时不要遗漏。Encoder–Decoder 整体流程讲义给出完整的编码器/解码器块结构Encoder 块输入向量 X → 加位置编码 →多头自注意力每个向量attend所有其他向量→ 残差连接 → Layer Normalization → 逐向量 MLP → 残差连接 → 最终 LayerNorm输出一组上下文向量 C。这里 C 是对输入序列的更高维表示而图像描述场景下输入来自预训练 CNN 抽取的空间特征Decoder 块输入向量 X 与编码器输出的上下文向量 C → 位置编码 →Masked 多头自注意力掩码保证只attend到之前的 token防止偷看未来→ 残差 LayerNorm → 第二个多头注意力层Key 与 Value 来自上下文向量 CQuery 来自上一层输出→ 残差 LayerNorm → 逐向量 MLP → 残差 LayerNorm → 全连接层输出最终序列 Y。两个细节值得注意Layer Normalization沿特征维归一化能抑制梯度消失/爆炸、稳定网络并缩短训练时间逐位置前馈网络形如 $\text{FFN}(x) \max(0, xW_1 b_1)W_2 b_2$对每个位置独立且共享地应用跨层使用不同参数。实现时最易出错的是多头维度的 Permute 与 Reshape先把 $(N \times S \times D)$ reshape 成 $(N \times S \times H \times D//H)$ 再 permute 为 $(N \times H \times S \times D//H)$ 参与注意力计算最后合并多头时必须先把维度从 $(N \times H \times S \times D//H)$ permute 回 $(N \times S \times H \times D//H)$ 再 reshape 成 $(N \times S \times D)$——因为 reshape 不改变数据顺序只有相邻维度才能被正确合并。建议对照讲义中的中间维度变化图见 transformers.md逐行核对张量形状。Q4生成对抗网络GANGenerative_Adversarial_Networks.ipynb让你训练一个 GAN生成与训练数据集分布匹配的图像并进一步探究用 GAN 在大量无标签 少量有标签数据上提升分类器性能。打开 notebook 后第一步Runtime Change runtime type硬件加速器选择GPU。GAN 的最小最大博弈目标生成模型讲义 给出了清晰的框架GAN 不显式建模数据密度 $p(x)$而是训练一个生成器网络把容易采样的简单分布如随机噪声 $z$映射到高维训练数据分布。由于没有 $z \to x$ 的监督对应关系必须引入一个判别器网络做二分类——判断输入图像是来自训练数据还是生成器伪造的判别器网络努力区分真实图像与生成图像生成器网络努力生成足以骗过判别器的看起来真实的图像。训练被形式化为一个两玩家对抗博弈的最小最大优化$$ \min_{\theta_g} \max_{\theta_d} \Big{\mathbb{E}{x \sim p{\mathrm{data}}}\big[\log D_{\theta_d}(x)\big] \mathbb{E}_{z \sim p(z)}\big[\log\big(1 - D_{\theta_d}(G_{\theta_g}(z))\big)\big]\Big} $$内层最大化是判别器目标真实样本得分趋近 1、伪造样本得分趋近 0外层最小化是生成器目标让 $D(G(z))$ 趋近 1即骗过判别器。训练技巧别用最小化判别器正确率一个关键陷阱如果生成器目标直接是 $\min \mathbb{E}[\log(1 - D(G(z)))]$那么在训练初期生成样本明显假、$D(G(z))$ 很小该目标的导数也很小生成器学得极慢反之当样本已经很真实时梯度反而大——这与期望完全相反。因此实际训练时把生成器目标改为最大化判别器被骗的概率$$ \max_{\theta_g} \mathbb{E}_{z \sim p(z)}\big[\log D_{\theta_d}\big(G_{\theta_g}(z)\big)\big] $$目标含义不变但对判别器眼中的假样本提供更强的梯度信号。讲义给出的标准训练循环是每个训练迭代中先从噪声先验 $p(z)$ 与数据分布 $p_{\mathrm{data}}(x)$ 各采一个 minibatch对判别器做 $k$ 步梯度上升更新再采一个噪声 minibatch 对生成器按改进后的目标做梯度上升其中 $k \ge 1$ 是超参数没有唯一最优取值。让 GAN 更稳DCGAN 的架构准则GAN 以训练不稳定著称。讲义总结了 DCGANRadford et al.提出的改进准则可在 notebook 实现中直接套用用带步长的卷积判别器与分数步长卷积生成器替换所有池化层生成器与判别器都使用 Batch Normalization深层架构中去掉全连接隐藏层生成器除输出层用 Tanh 外其余层全部使用 ReLU 激活判别器所有层使用 LeakyReLU 激活。训练完成后推理很简单从噪声先验 $p(z)$ 采样 $z$喂给生成器网络输出即是一张与训练图像相似的图片。作为拓展认知详见 generative-models.md训练好的 GAN 潜在空间里存在可解释结构——对潜在向量做插值会出现平滑的语义渐变对均值向量做向量算术也能产生符合语义的生成结果而同样的算术在像素空间里只会得到噪声叠影这间接说明模型学到了数据的抽象表示而非机械记忆。Q5自监督学习用于图像分类Self_Supervised_Learning.ipynb是本作业最具前沿感的一题。任务目标从 assignments/2023/assignment3.md 描述看是利用自监督预训练在无标签数据上自动学习视觉表征从而在图像分类任务上获得更好的性能。同样地打开 notebook 后需要先设置GPU。自监督学习的核心思想是自己给自己造标签先在大量无标签图像上通过某种代理任务pretext task例如对比学习中的同一张图的不同增强视图应表征相近、不同图的视图应表征远离训练一个特征提取器让它学到通用的视觉表示然后再把学到的表示迁移到下游的分类任务用少量有标签数据做微调。这种先无监督预训练、后有监督微调的范式正是 Q4 中大量无标签 少量有标签数据场景能提升分类性能的原因所在。作业描述强调其价值在于自动学习无标签数据集的视觉表征与作业总目标中利用自监督学习技术辅助图像分类任务互相呼应。实现时建议关注预训练阶段是否需要冻结/解冻骨干网络、下游线性评估linear probing与全量微调fine-tuning的差异以及增强策略crop、flip、color jitter 等对对比学习表征质量的影响。这一题的训练耗时通常较长务必使用 GPU runtime并保持定期保存 notebook 的习惯。加分题基于 LSTM 的图像描述5 分LSTM_Captioning.ipynb让你实现LSTM并再次应用于 COCO 图像描述。为什么值得做RNN 讲义 用一整节回答了这个问题Vanilla RNN 的递推 $h_t \tanh(W_{hh}h_{t-1} W_{xh}x_t)$ 在反向传播时跨时刻梯度是 $\prod_{t} \tanh(z_t)W_{hh}$ 的连乘——$\tanh$ 几乎总小于 1长序列上梯度趋近于零梯度消失若去掉非线性只剩 $W_{hh}$ 连乘则当最大奇异值大于 1 时梯度爆炸实践中表现为 NaN小于 1 时依旧消失。梯度裁剪gradient clipping能缓解爆炸却治不了消失。LSTM 用额外的细胞状态 $c_t$提供一条梯度高速公路$c_t$ 沿时间轴只经历少量线性交互信息可以畅通无阻地流过整条链。其完整递推为$$ \begin{aligned} f_t \sigma(W_{hf} h_{t-1} W_{xf} x_t) \quad \text{(遗忘门决定从 } c_{t-1} \text{ 移除多少信息)}\ i_t \sigma(W_{hi} h_{t-1} W_{xi} x_t) \quad \text{(输入门决定向 } c_t \text{ 添加多少信息)}\ o_t \sigma(W_{ho} h_{t-1} W_{xo} x_t) \quad \text{(输出门决定 } h_t \text{ 展示多少信息)}\ g_t \tanh(W_{hg} h_{t-1} W_{xg} x_t) \quad \text{(候选记忆)}\ c_t f_t \odot c_{t-1} i_t \odot g_t \ h_t o_t \odot \tanh(c_t) \end{aligned} $$其中 $\odot$ 是逐元素的 Hadamard 积三个门因 sigmoid 压缩取值在 01 之间。当遗忘门设为 1、输入门设为 0 时细胞状态可跨很多时刻原样保留——这就是 LSTM 比 Vanilla RNN 更容易学习长距离依赖的机理注意LSTM 并不保证绝对没有梯度问题只是让长期依赖变得更容易学。实现时按上述六个式子逐行编写前向与反向即可反向传播时把梯度分别流经 $f_t, i_t, o_t, g_t$ 四条路径回传。提交作业collect_submission.ipynb 全流程完成除collect_submission.ipynb以外的全部 notebook 后进入提交环节。重要前提提交前请确保所有 notebook 都已运行过、单元格输出cell outputs可见——只填代码不运行、或运行后清空输出都可能导致扣分。提交分两步在 Colab 中打开collect_submission.ipynb并依次执行所有单元格。该 notebook 会自动完成两件事把全部代码.py和.ipynb文件打包成a3_code_submission.zip把所有 notebook 转换合并成一份 PDFa3_inline_submission.pdf。若执行成功控制台会打印如下确认信息### Done! Please submit a3_code_submission.zip and a3_inline_submission.pdf to Gradescope. ###将 PDF 与 zip 提交到 Gradescope课程号 379571。注意先把a3_code_submission.zip和a3_inline_submission.pdf下载到本地再在 Gradescope 页面上传提交——直接引用 Colab 远程文件路径是提交不上去的。通关建议速览顺序做题Q1 的梯度可视化是理解后续对输入/对参数求梯度的铺垫Q2 的 RNN 与 Q3 的 Transformer 可对照 rnn.md、transformers.md 讲义中的公式逐行实现Q4、Q5 理论背景分别对应 generative-models.md 与作业描述中的自监督目标GPU 是刚需Q4、Q5 的 notebook 开头就要求切换 GPU runtime训练耗时长请尽早开始并定期File - Save形状先行Transformer 多头注意力、LSTM 四条梯度路径是最容易出 bug 的地方实现前先在纸上推一遍张量形状与反向梯度链对照讲义中的中间维度图提交留足时间collect_submission.ipynb会生成 zip 与 PDF 两件套务必确认### Done! ... ###提示出现后再下载本地并上传 Gradescope。赞分享教程文档深度学习计算机视觉【免费下载链接】cs231n.github.ioPublic facing notes page项目地址https://gitcode.com/gh_mirrors/cs/cs231n.github.io点击查看免费下载相关推荐Umi-OCR 离线OCR保姆级上手指南10分钟跑通截图、批量与PDF数字化Umi OCR 离线OCR保姆级上手指南10分钟跑通截图、批量与PDF数字化 档案管理员小周往在线识别网站传第一张图时页面弹出免费额度已用完每日限5张教程文档深度学习计算机视觉CS231n 2021 作业三全解RNN/Transformer 图像描述、网络可视化、GAN 与自监督学习实战指南CS231n 2021 作业三全解RNN/Transformer 图像描述、网络可视化、GAN 与自监督学习实战指南 本指南以 2021 春季学期 CS231教程文档深度学习计算机视觉Home Assistant 接入智能门锁远程开锁、临时密码与访问审计实战指南Home Assistant 接入智能门锁远程开锁、临时密码与访问审计实战指南 忘带钥匙在门外干着急或者要临时给维修师傅开一次门把门锁接进 Home As教程文档深度学习计算机视觉上一篇Arcface-PyTorch 快速上手零基础从零训练并评估一个人脸识别模型下一篇SPT存档编辑器快速上手指南十分钟满配换机不丢进度创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考