ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

CS231n Assignment 1 实战指南:用 Colab 从零实现 kNN、SVM、Softmax 与两层神经网络图像分类器

CS231n Assignment 1 实战指南:用 Colab 从零实现 kNN、SVM、Softmax 与两层神经网络图像分类器 教程文档深度学习计算机视觉【免费下载链接】cs231n.github.ioPublic facing notes page项目地址https://gitcode.com/gh_mirrors/cs/cs231n.github.io点击查看免费下载Assignment 1 是斯坦福 CS231nDeep Learning for Computer Vision课程的第一份编程作业要求学员基于 Google Colab 环境、用 numpy 从零实现并训练四种图像分类器k-最近邻kNN、多分类支持向量机SVM、Softmax 分类器以及两层全连接神经网络并通过图像特征颜色直方图、HOG验证高层表示相比原始像素的性能提升。本文以仓库中的 assignments/2021/assignment1.md 为主线结合课程讲义与配套 starter codeassignments/2021/assignment1_colab.zip完整还原作业的目标、五个任务、实现要点与提交流程帮助读者独立完成该作业并理解图像分类流水线的核心原理。任务概览这份作业要做什么本作业原定截止时间为2021 年 4 月 16 日周五PST 23:59全部工作以 Colab notebook 形式完成。作业文件清单如下Q1在knn.ipynb中实现 k-最近邻分类器Q2在svm.ipynb中实现多分类 SVM 分类器Q3在softmax.ipynb中实现 Softmax 分类器Q4在two_layer_net.ipynb中实现两层神经网络分类器Q5在features.ipynb中用高层图像特征而非原始像素训练线性分类器提交运行collect_submission.ipynb生成a1.zip与 PDF 后提交到 Gradescope。starter code 中除 notebook 外还包含完整的cs231nPython 模块数据加载、梯度检查、求解器、损失函数骨架等作业的大部分工作就是在这些骨架代码的TODO处补全实现并通过内置的数值梯度检查与准确率报告验证正确性。环境准备Colab 远程工作流与本地备选方案课程在 setup.md 中明确推荐使用 Google Colaboratory 完成作业它本质上是 Jupyter notebook 与 Google Drive 的结合完全运行在云端预装了 PyTorch、TensorFlow 等常用依赖并对所有学员提供一致的依赖环境还免费提供 GPUK80、P100与 TPU 硬件加速——这对 Assignment 2、3 尤其重要。Colab 准备步骤摘自 setup.md 的 Colab 部分使用带 Google Drive 的 Google 账户登录点击右上角齿轮进入Settings在Manage Apps标签页中选择Connect more apps在 GSuite Marketplace 中搜索Colab并点击Add连接下载作业 starter code zip解压后上传整个assignment1文件夹到 Drive在 Colab 中打开knn.ipynb等 notebook 开始工作进度自动保存回 Drive。两个必须注意的实操要点频繁保存Colab VM 空闲过久或总连接时间超过约 12 小时会被断开未保存的进度会丢失。作业文档特别提示随时执行File - Save保存 notebookGPU 切换需要在Runtime - Change runtime type - Hardware accelerator中选择GPU让实例获得 GPU 计算支持Assignment 1 可选Assignment 3 的 GAN 与自监督学习部分为必须。本地备选方案课程不官方支持本地开发但提供了requirements.txt可用于搭建虚拟环境。推荐使用 Anaconda自带 MKL 优化可显著加速 numpy/scipy 计算也可使用 Python 3.7 自带的venv# Anaconda 方式 conda create -n cs231n python3.7 conda activate cs231n which python # 确认指向 anaconda3/envs/cs231n/bin/python # venv 方式 python3.7 -m venv ~/cs231n source ~/cs231n/bin/activate # 进入作业目录并安装依赖两种方式通用 cd assignment1 pip install -r requirements.txt本地运行 CIFAR-10 数据可通过 starter code 中的assignment1/cs231n/datasets/get_datasets.sh脚本下载。作业目标掌握图像分类流水线在动手前先明确本作业希望达成的能力目标摘自 assignments/2021/assignment1.md 的 Goals 一节理解基本的图像分类流水线与数据驱动方法train/predict 两个阶段理解训练/验证/测试集划分以及使用验证集进行超参数调优的正确方式熟练使用 numpy 编写高效的向量化代码实现并应用kNN、多分类 SVM、Softmax与两层神经网络四种分类器理解这些分类器之间的差异与权衡初步理解使用高层特征表示如颜色直方图、HOG相比原始像素带来的性能提升。课程讲义 classification.md 对上述概念给出了完整的理论铺垫图像分类任务本质上是把一张图片对计算机而言是一个 宽×高×3 的三维数值数组每个像素为 0–255 的整数映射为固定类别集合中的一个标签。与手写规则相反数据驱动方法依赖一个带标签的训练集通过学习training获得模型再在未见过的测试集上评估evaluation用准确率accuracy衡量预测与真实标签ground truth的匹配比例。Q1k-最近邻分类器knn.ipynbkNN 是理解数据驱动方法的入门分类器train阶段不做任何学习只是记住全部训练数据predict阶段把每个测试样本与所有训练样本逐一比较距离取距离最近的 k 个训练样本让它们的标签投票决定预测结果。当 k1 时退化为最近邻分类器。距离度量L1 与 L2讲义 classification.md 给出了两种核心距离度量。L1 距离是像素差绝对值之和$$d_1(I_1, I_2) \sum_p \left| I^p_1 - I^p_2 \right|$$L2 距离则计算像素差的欧氏距离$$d_2(I_1, I_2) \sqrt{\sum_p \left( I^p_1 - I^p_2 \right)^2}$$在 numpy 中L2 距离的实现只需一行替换且由于开根号是单调函数、不改变最近邻的排序实际应用中常省略np.sqrt。从课程数据看最近邻分类器在 CIFAR-10 上用 L1 距离约得 38.6% 准确率用 L2 距离约得 35.4%远高于随机猜测的 10%但远低于人类约 94% 的水平。L2 对向量差异更苛刻它偏好多个中等差异而非一个巨大差异。starter code 中的实现骨架starter codeassignments/2021/assignment1_colab.zip中assignment1/cs231n/classifiers/k_nearest_neighbor.py定义了KNearestNeighbor类其核心接口为train(X, y)直接存储训练数据self.X_train X、self.y_train ypredict(X, k1, num_loops0)按num_loops参数选择三种距离实现——compute_distances_two_loops双重循环、compute_distances_one_loop单循环、compute_distances_no_loops完全向量化输出num_test × num_train的欧氏距离矩阵distspredict_labels(dists, kk)对每个测试样本取距离最小的 k 个训练标签进行投票。作业核心任务就是补全这三种距离计算并比较它们的速度差异——这正是用 numpy 编写高效向量化代码目标的直接训练两层循环版本最慢完全向量化版本最快。完成实现后notebook 会引导在验证集上扫描不同的 k 值如[1, 3, 5, 10, 20, 50, 100]找出验证准确率最高的超参数组合。超参数调优为什么必须用验证集讲义 classification.md 强调了一个关键纪律测试集只能在整个流程的最后使用一次。若反复在测试集上调 k 值或距离类型就相当于把测试集当训练集用得到的性能会过于乐观过拟合测试集。正确做法是把训练数据再切分为训练集 验证集validation set例如 CIFAR-10 的 50,000 张训练图中取 49,000 张训练、1,000 张验证Xval_rows Xtr_rows[:1000, :] # 前 1000 张作验证 Yval Ytr[:1000] Xtr_rows Xtr_rows[1000:, :] # 后 49000 张作训练 Ytr Ytr[1000:] validation_accuracies [] for k in [1, 3, 5, 10, 20, 50, 100]: nn NearestNeighbor() nn.train(Xtr_rows, Ytr) Yval_predict nn.predict(Xval_rows, kk) acc np.mean(Yval_predict Yval) validation_accuracies.append((k, acc))当训练数据较小时可进一步使用交叉验证cross-validation把训练数据切为若干 fold常用 3、5、10 折轮流把其中一折作验证、其余作训练多次评估后取平均从而得到噪声更低的超参数估计。kNN 的优缺点也在此显现训练几乎零成本但测试时须与全部训练样本比较测试开销大且基于像素的距离与感知/语义相似度往往不一致背景与颜色分布主导了相似性这正是后续课程用神经网络解决的核心问题。Q2训练多分类 SVMsvm.ipynbsvm.ipynb要求实现结构化 SVM 的多分类 hinge loss 及其梯度。损失函数对第 i 个样本、类别 j 的边界定义为正确类别得分与其他类别得分的差margin scores[j] - correct_class_score 1即 delta1只有当margin 0时才计入损失。在 starter code 的assignment1/cs231n/classifiers/linear_svm.py中骨架已经给出损失计算的主体逻辑作业需要补全的是梯度def svm_loss_naive(W, X, y, reg): dW np.zeros(W.shape) num_classes W.shape[1] num_train X.shape[0] loss 0.0 for i in range(num_train): scores X[i].dot(W) correct_class_score scores[y[i]] for j in range(num_classes): if j y[i]: continue margin scores[j] - correct_class_score 1 # delta 1 if margin 0: loss margin loss / num_train # 对所有样本求平均 loss reg * np.sum(W * W) # L2 正则化项 # TODO: 计算损失对 W 的梯度并存入 dW return loss, dW代码中的reg是正则化强度损失最终由数据损失平均 hinge loss与正则项reg * Σ W²两部分构成正则项抑制权重过大防止过拟合。Q2 的核心任务是补全svm_loss_naive的梯度计算可在算损失的同时求导实现完全向量化的svm_loss_vectorized用矩阵运算消除循环实现LinearClassifier的train随机梯度下降与predict方法用svm_loss_vectorized计算梯度用验证集扫描学习率learning_rate与正则强度reg的组合网格用 starter code 中的gradient_check.pyassignment1/cs231n/gradient_check.py做数值梯度校验确保解析梯度与数值梯度一致。对 CIFAR-10 数据data_utils.py中的get_CIFAR10_data(num_training49000, num_validation1000, num_test1000, subtract_meanTrue)已经封装了完整的预处理流水线加载原始 CIFAR-10、划分训练/验证/测试子集、可选地减去全数据均值。Q3实现 Softmax 分类器softmax.ipynbsoftmax.ipynb要求实现 Softmax 分类器——它把得分向量转化为类别概率分布损失采用交叉熵。assignment1/cs231n/classifiers/softmax.py提供了softmax_loss_naive与softmax_loss_vectorized两个函数的骨架作业需分别用显式循环与完全向量化方式补全损失与梯度。函数签名统一为(W, X, y, reg)W是形状(D, C)的权重矩阵D 为输入维度C 为类别数X是(N, D)的样本小批量y是形状(N,)的标签reg是正则化强度返回(loss, dW)元组。骨架代码特别提示了一个关键工程细节注意数值稳定性——计算 softmax 概率前应从得分中减去每行最大值log-sum-exp 技巧否则指数运算容易上溢或下溢。SVM 与 Softmax 是线性分类器的两种典型损失SVM 只关心正确类别得分是否比其他类别高出 margin得分本身的意义不参与优化而 Softmax 输出的概率分布对每个类别的得分都敏感因此对得分绝对值的变化更不宽容。讲义 linear-classify.md 对两者的对比有完整讨论。Q4两层神经网络two_layer_net.ipynbtwo_layer_net.ipynb把模型从线性分类器升级为两层全连接神经网络架构为affine - relu - affine - softmax线性变换→ReLU 激活→线性变换→softmax 损失。starter code 的assignment1/cs231n/classifiers/fc_net.py中TwoLayerNet类的构造参数为input_dim输入维度默认3 * 32 * 32 3072CIFAR-10 展平后的像素数hidden_dim隐层神经元数默认100num_classes类别数默认10weight_scale权重随机初始化的标准差高斯分布、均值为 0regL2 正则化强度默认0.0。可学习参数存放在字典self.params中如W1、b1、W2、b2作业任务包括按weight_scale初始化参数、实现loss(X, yNone)中的前向计算数据损失 正则损失与反向传播梯度随后交给独立的Solver对象训练。从 starter code 的模块结构看assignment1/cs231n/目录下的layers.py与layer_utils.py提供仿射层、ReLU 层等模块化实现optim.py提供多种更新规则如 SGD、SGDMomentum、RMSProp、Adamsolver.py中的Solver类负责驱动训练循环前向/反向、更新参数、按周期记录训练与验证损失和准确率。two_layer_net.ipynb会引导用网格搜索同时调优学习率与正则化强度并观察损失曲线与验证准确率随 epoch 的变化。Q4 也是学员第一次亲手实现反向传播可借助gradient_check.py的数值梯度校验来排查实现错误。Q5更高层表示图像特征features.ipynbQ5 不再使用原始像素而是先为每张图片提取高层特征再在这些特征上训练线性分类器SVM/Softmax对比与原始像素方案的准确率差异。作业文档点名了两类特征颜色直方图color histogram与方向梯度直方图 HOGHistogram of Gradient。starter code 的assignment1/cs231n/features.py中extract_features(imgs, feature_fns, verboseFalse)会把若干特征函数依次应用到全部图像上并把每个图像的各特征向量拼接成一行最终输出形状为(N, F_1 ... F_k)的特征矩阵——每个特征函数接收单张H × W × D图像并返回一维特征向量。完成特征提取后复用 Q2/Q3 的线性分类器在特征上训练通常可以获得比原始像素明显更高的准确率从而直观验证高层表示优于原始像素这一贯穿课程的核心理念。提交作业collect_submission.ipynb 与 Gradescope作业文档强调提交前必须确保所有 notebook 都已运行、单元格输出可见。完成 Q1–Q5 的全部 notebookcollect_submission.ipynb除外后按以下流程提交在 Colab 中打开collect_submission.ipynb并运行所有单元格。该 notebook 会把代码.py与.ipynb文件打包为 zip命名为a1.zip把所有 notebook 转换为一个 PDF 文件成功时显示消息### Done! Please submit a1.zip and the pdfs to Gradescope. ###将a1.zip与转换出的assignment.pdf提交到 Gradescope 对应课程提交前记得先把a1.zip和 PDF 下载到本地避免因 Colab VM 断开而丢失成果。starter code 中还附带了collectSubmission.shshell 版打包脚本与makepdf.pynotebook 转 PDF 脚本供本地开发流程使用与 Colab 版collect_submission.ipynb功能对应。仓库中可继续深入的学习资源完成作业后可在本仓库中进一步巩固相关理论classification.md图像分类问题、kNN、验证集与交叉验证的完整讲义linear-classify.md线性分类器、SVM 与 Softmax 的损失函数推导、正则化与最优化neural-networks-1.md 与 neural-networks-2.md神经网络结构、数据预处理与正则化setup.mdColab 与本地环境的完整搭建流程后续作业 assignments/2021/assignment2.md反向传播、Batch Normalization、Dropout、CNN、PyTorch/TensorFlow与 assignments/2021/assignment3.mdRNN/Transformer 图像描述、网络可视化、GAN、自监督学习则在 Q4 的基础上递进到深度学习框架与更复杂的网络结构。完成本作业后你应当已经独立走通数据加载 → 特征/模型 → 训练 → 超参数调优 → 测试评估 → 打包提交的完整图像分类流程并具备用 numpy 手写反向传播与向量化代码的扎实功底——这正是后续 CNN 与 PyTorch 部分的地基。赞分享教程文档深度学习计算机视觉【免费下载链接】cs231n.github.ioPublic facing notes page项目地址https://gitcode.com/gh_mirrors/cs/cs231n.github.io点击查看免费下载相关推荐CS231n 2025 Assignment 1 实战指南从 kNN 到 Softmax、两层网络与图像特征CS231n 2025 Assignment 1 实战指南从 kNN 到 Softmax、两层网络与图像特征 CS231n 课程的第一份作业 assignm教程文档深度学习计算机视觉CS231n 2023 Assignment 1 全攻略从 kNN 到两层神经网络与图像特征分类实战CS231n 2023 Assignment 1 全攻略从 kNN 到两层神经网络与图像特征分类实战 本篇指南以 CS231n 2023 春季学期第一次作业教程文档深度学习计算机视觉MediaCrawler 多平台数据采集保姆级指南小红书抖音B站笔记评论一次拉全MediaCrawler 多平台数据采集保姆级指南小红书抖音B站笔记评论一次拉全 MediaCrawler 是一款多平台数据采集工具输入关键词小红书笔记、教程文档深度学习计算机视觉上一篇使用 aws_imagebuilder_image_recipes 数据源批量查询 EC2 Image Builder 镜像配方下一篇Godot 3D 抗锯齿完全指南基于 godot-demo-projects 的多技术对比与实战调优创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表