完整项目和代码本教程是AI 入门 30 天挑战系列的一部分GitHub 仓库: https://github.com/Lee985-cmd/AI-30-Day-ChallengeCSDN 专栏: https://blog.csdn.net/m0_67081842?typeblog⭐欢迎 Star 支持今天学习经典 CNN 架构站在巨人的肩膀上每个概念都解释每行代码都说明白预计时间2.5-3.5 小时含费曼输出练习 第 1 步快速复习昨天的内容25 分钟费曼输出 #0考考你合上教程尝试回答□ 为什么 CNN 比普通全连接网络更适合图像处理用至少 2 个理由说明 □ 卷积层和池化层各有什么作用用生活例子解释 □ 卷积核是怎么学会识别特征的描述学习过程 □ 为什么要用多个卷积层而不是一个大卷积核 □ CNN 的完整数据流是怎样的从输入到输出的每一步⏰ 时间20 分钟如果能答出 80% 以上我们开始今天的深度学习革命之旅如果不够花 5 分钟翻一下 Day11 的笔记。 第 2 步深度学习发展史40 分钟故事时间 想象 AI 发展就像手机进化史1950s-1980s: 功能机时代机器学习萌芽 - 感知机发明像大哥大 - 但技术不成熟 - 没人看好觉得没用 1990s-2000s: 山寨机时代传统方法主导 - LeNet-5 出现第一个成功的 CNN - 但还是用 SIFT、HOG 等传统方法 - 神经网络被冷落 2012 年iPhone 4 时代AlexNet 横空出世 - AlexNet 一鸣惊人 - ImageNet 竞赛碾压第二名84.6% vs 73.8% - 所有人都震惊了 - 从此改变世界 2014 年智能手机普及VGG、GoogLeNet - 各种好架构涌现 - VGG16简洁优雅 - GoogLeNetInception 模块 - 越来越深效果越好 2015 年至今全面屏时代ResNet 等 - ResNet 解决梯度消失 - 可以训练 100 层的网络 - DenseNet、EfficientNet... - 百花齐放关键里程碑LeNet-5 (1998): ✓ 第一个成功的 CNN ✓ 用于手写数字识别 ✓ 证明 CNN 可行 ✗ 计算能力有限没火起来 AlexNet (2012): ✓ 深度学习革命的起点 ✓ GPU 加速训练 ✓ ReLU 激活函数 ✓ Dropout 防止过拟合 ✓ 让全世界关注深度学习 VGG (2014): ✓ 简洁优雅的设计 ✓ 全部用 3×3 小卷积核 ✓ 越深越好的思想 ✓ 至今还在用 ResNet (2015): ✓ 残差连接跳跃连接 ✓ 解决梯度消失问题 ✓ 可以训练很深很深的网络 ✓ 现在的标准配置 费曼输出 #1解释深度学习发展史任务 1向小学生解释场景有个小朋友问你AI 是怎么发展起来的要求不用梯度消失、反向传播、架构这些专业术语用成长、学习、进步等生活场景比喻让小学生能听懂参考模板AI 的发展就像______一样。 一开始它______ 就像小宝宝______。 后来它______ 就像你上学______。 再后来______ 就像______。 现在 AI 已经______ 可以______⏰ 时间15 分钟 卡壳检查点如果你在解释时卡住了□ 我说不清楚为什么 AlexNet 这么重要 □ 我不知道如何解释越深越好的思想 □ 我只能说更先进但不能说明为什么先进这很正常标记下来回去再看上面的内容然后重新尝试解释提示LeNet 第一个吃螃蟹的人AlexNet 一炮而红VGG 简洁就是美ResNet 修高速公路️ 第 3 步详解经典架构70 分钟AlexNet2012 年 - 深度学习革命AlexNet 的故事背景 2012 年之前 - 大家用传统方法SIFT、HOG 特征 - 神经网络被认为没用太慢、效果一般 - 学术界不看好 2012 年 ImageNet 竞赛 - 一个叫 Alex Krizhevsky 的人参赛 - 用了一个很深的神经网络当时看来 - 结果准确率 84.6% - 第二名只有 73.8% - 领先 10.8%碾压 从此 - 深度学习火了 - 大家都开始研究神经网络 - AI 进入新时代AlexNet 的架构简化版输入227×227 彩色图片 ↓ Conv196 个卷积核11×11步长 4→ ReLU → MaxPool ↓ Conv2256 个卷积核5×5→ ReLU → MaxPool ↓ Conv3384 个卷积核3×3→ ReLU ↓ Conv4384 个卷积核3×3→ ReLU ↓ Conv5256 个卷积核3×3→ ReLU → MaxPool ↓ 全连接层4096 个神经元→ ReLU → Dropout ↓ 全连接层4096 个神经元→ ReLU → Dropout ↓ 输出层1000 类Softmax 特点 ✓ 5 个卷积层 3 个全连接层 ✓ ReLU 激活当时是创新 ✓ Dropout防止过拟合 ✓ GPU 加速也是创新 ✓ 数据增强翻转、裁剪VGG2014 年 - 越深越好VGG 的思想探索一个问题多深才够深 VGG 的实验 - 全部用 3×3 小卷积核 - 一层一层叠起来 - 看看到底多深效果好 发现 ✓ 层数越深效果越好 ✓ 但有上限太深会梯度消失 ✓ VGG1616 层是个很好的平衡点 ✓ VGG1919 层更好一点为什么都用 3×3原因 1参数少 1 个 7×7 卷积 49 个参数 2 个 3×3 卷积 18 个参数 但感受野一样都能看到7×7 的区域 省了近 3 倍参数 原因 2更多非线性 多层小卷积核 更多 ReLU 激活 更强的表达能力 能学习更复杂的模式 原因 3模块化 像搭积木一样 3×3 是标准模块 容易设计和实现 容易理解和调试VGG16 架构输入224×224 图片 ↓ [Conv(3×3) × 2] MaxPool # 第 1 块64 通道 ↓ [Conv(3×3) × 2] MaxPool # 第 2 块128 通道 ↓ [Conv(3×3) × 3] MaxPool # 第 3 块256 通道 ↓ [Conv(3×3) × 3] MaxPool # 第 4 块512 通道 ↓ [Conv(3×3) × 3] MaxPool # 第 5 块512 通道 ↓ 全连接层4096 ↓ 全连接层4096 ↓ 输出层1000 类 总共13 个卷积层 3 个全连接层 16 层 特点结构规整像俄罗斯套娃 第 4 步ResNet2015 年 - 残差网络50 分钟ResNet 解决的问题问题梯度消失/退化当网络很深时 层数多了 → 前面的层学不到东西 → 效果反而变差 ❌ 就像传话游戏 第 1 个人说今天天气很好 传到第 10 个人变成好像要下雨 传到第 100 个人变成不知道说什么了 信息丢失了 实验现象 56 层的网络 训练误差 20 层的网络 这不科学啊应该更深更好才对 原因 不是过拟合 而是深层网络难以训练 梯度传不回去ResNet 的创新跳跃连接普通网络 vs ResNet普通网络 输入 → [层 1] → [层 2] → [层 3] → 输出 信息一层层传可能丢失 ResNet有跳跃连接: 输入 ────────────────┐ ↓ │ [层 1] → [层 2] → ⊕ → 输出 ↑ 直接相加 数学表达 普通y F(x) ResNet: y F(x) x ← 多了个恒等映射 好处 ✓ 信息可以直接传到后面走高速 ✓ 不会丢失 ✓ 梯度可以顺利回传 ✓ 可以训练很深的网络100 层生活中的例子抄近道你要从 A 到 B 普通路 A → 绕路 1 → 绕路 2 → 绕路 3 → B 可能迷路可能累倒 ResNet 的路 A → 绕路 1 → 绕路 2 → 绕路 3 → B └────────────────────────────↑ 高速公路直达 累了就走高速 不耽误时间 还能到达目的地 这就是残差连接的思想残差块Residual Block基本的残差块 输入 x ↓ [Conv 3×3] → BatchNorm → ReLU ↓ [Conv 3×3] → BatchNorm ↓ ⊕ (加上输入 x) ↓ ReLU ↓ 输出 关键 输出 F(x) x F(x) 是卷积的结果 x 是直接传过来的 如果 F(x) 学得不好 至少还有 x 保底 不会更差 费曼输出 #2深入理解经典架构任务 1对比四大架构场景向朋友介绍这四个网络用比喻说明各自特点LeNet-5: → 先驱者第一个吃螃蟹 → 就像莱特兄弟的飞机 AlexNet: → 革命者改变世界 → 就像 iPhone 4 VGG: → 艺术家追求简洁美 → 就像苹果设计 ResNet: → 工程师解决问题 → 就像立交桥任务 2解释为什么 ResNet 能解决梯度消失思考题1. 什么是梯度消失为什么会消失 2. 跳跃连接是怎么帮助梯度回传的 3. 为什么可以训练更深的网络 4. 残差块中的残差是什么意思⏰ 时间25 分钟 卡壳检查点□ 我解释不清梯度消失的本质 □ 我说不明白跳跃连接的数学原理 □ 我不能用生活中的例子说明提示梯度消失 信号传不远跳跃连接 修高速公路残差 学习和改进的部分恒等映射 保底选项 第 5 步用 PyTorch 实现经典架构70 分钟完整代码实现import torch import torch.nn as nn import torchvision.models as models import torchvision.transforms as transforms from PIL import Image import matplotlib.pyplot as plt import numpy as np print( * 50) print( 经典 CNN 架构详解) print( * 50) # # 第 1 步使用预训练模型 # print(\n【1. 加载预训练模型】) # 加载预训练的模型 print(正在加载模型...) # AlexNet alexnet models.alexnet(pretrainedTrue) print(✓ AlexNet 加载完成) # VGG16 vgg16 models.vgg16(pretrainedTrue) print(✓ VGG16 加载完成) # ResNet18 resnet18 models.resnet18(pretrainedTrue) print(✓ ResNet18 加载完成) print(\n 为什么要用预训练模型) print(- 别人已经训练好了在 ImageNet 上) print(- 可以直接用或者微调) print(- 节省大量时间和算力) print(- 效果通常很好) # # 第 2 步对比不同架构的特点 # print(\n * 50) print(【2. 对比不同架构】) print( * 50) models_info { AlexNet: { year: 2012, layers: 8, params: 60M, top1_acc: 57.1%, 特点: ReLU、Dropout、GPU 加速 }, VGG16: { year: 2014, layers: 16, params: 138M, top1_acc: 73.4%, 特点: 全部 3×3 卷积、结构规整 }, ResNet18: { year: 2015, layers: 18, params: 11.7M, top1_acc: 70.3%, 特点: 残差连接、解决梯度消失 } } print(\n架构对比表) print(f{模型:12} {年份:8} {层数:8} {参数量:10} {准确率:12} {特点}) print(- * 80) for name, info in models_info.items(): print(f{name:12} {info[year]:8} {info[layers]:8} {info[params]:10} {info[top1_acc]:12} {info[特点]}) print(\n 发现) print(- VGG 参数最多138M但效果不是最好) print(- ResNet 参数少11.7M但解决了深层训练问题) print(- 不是越深越好要巧妙设计) # # 第 3 步可视化架构对比 # print(\n * 50) print( 可视化架构对比) print( * 50) fig, axes plt.subplots(1, 3, figsize(18, 6)) # 图 1深度对比 ax1 axes[0] network_names [AlexNet, VGG16, ResNet18] depths [8, 16, 18] colors [#FF6B6B, #4ECDC4, #45B7D1] bars ax1.bar(network_names, depths, colorcolors, alpha0.7) ax1.set_title(网络深度对比, fontsize14) ax1.set_ylabel(层数) ax1.grid(True, alpha0.3, axisy) for bar, depth in zip(bars, depths): ax1.text(bar.get_x() bar.get_width()/2., depth 0.5, f{depth}层, hacenter, vabottom, fontsize12, fontweightbold) # 图 2参数量对比 ax2 axes[1] params [60, 138, 11.7] # 单位百万 bars ax2.bar(network_names, params, colorcolors, alpha0.7) ax2.set_title(参数量对比百万, fontsize14) ax2.set_ylabel(参数量M) ax2.grid(True, alpha0.3, axisy) for bar, param in zip(bars, params): ax2.text(bar.get_x() bar.get_width()/2., param 2, f{param}M, hacenter, vabottom, fontsize12, fontweightbold) # 图 3准确率对比 ax3 axes[2] accuracies [57.1, 73.4, 70.3] bars ax3.bar(network_names, accuracies, colorcolors, alpha0.7) ax3.set_title(ImageNet Top-1 准确率, fontsize14) ax3.set_ylabel(准确率%) ax3.set_ylim(0, 100) ax3.grid(True, alpha0.3, axisy) for bar, acc in zip(bars, accuracies): ax3.text(bar.get_x() bar.get_width()/2., acc 1, f{acc}%, hacenter, vabottom, fontsize12, fontweightbold) plt.tight_layout() plt.show() print(\n✅ 架构对比完成) # # 第 4 步实战 - 迁移学习 # print(\n * 50) print(【4. 迁移学习实战】) print( * 50) print(\n什么是迁移学习) print(→ 用在大数据集ImageNet上预训练的模型) print(→ 在小数据集上微调) print(→ 就像站在巨人肩膀上) print(\n好处) print(✓ 不需要大量数据) print(✓ 训练速度快) print(✓ 效果好) # 示例修改 ResNet 用于新的分类任务 print(\n示例用 ResNet18 识别猫狗) # 加载预训练模型 model models.resnet18(pretrainedTrue) # 冻结前面的层不更新权重 for param in model.parameters(): param.requires_grad False # 修改最后的完全连接层 # ResNet18 的 fc 层输入是 512 num_features model.fc.in_features model.fc nn.Linear(num_features, 2) # 改成 2 类猫/狗 print(f✓ 模型已修改) print(f - 冻结了前 {sum(1 for p in model.parameters() if not p.requires_grad)} 个参数) print(f - 只训练最后的全连接层) print(f - 输出类别2 类猫/狗) print(\n训练策略) print(1. 先用小学习率训练新层) print(2. 如果需要解冻部分层微调) print(3. 监控验证集防止过拟合) print(\n 恭喜你了解了经典 CNN 架构) print( * 50) # # 第 5 步费曼输出练习 # print(\n * 50) print( 费曼输出练习) print( * 50) print(\n任务向朋友解释经典 CNN 架构) print(\n要覆盖的内容) print(1. AlexNet 为什么重要至少 2 个理由) print(2. VGG 的设计思想是什么) print(3. ResNet 解决了什么问题怎么解决的) print(4. 你会选择哪个架构用于实际项目为什么) print(\n方式) print(□ 写一篇 800 字左右的文章) print(□ 录一段 10-15 分钟的视频) print(□ 找个朋友给他讲一遍) print(\n 提示) print(- 用至少 3 个比喻) print(- 展示架构图或对比表) print(- 回答可能的疑问) # # 第 6 步今日费曼总结 # print(\n * 50) print( 今日费曼总结) print( * 50) print(\n【回顾今天的内容】5 分钟) print(□ 深度学习发展史) print(□ AlexNet 的革命性意义) print(□ VGG 的简洁设计思想) print(□ ResNet 的残差连接) print(\n【完整教授】15 分钟⭐) print(任务假装你在给一个完全不懂的人上第十二堂课) print(\n要覆盖) print(1. 为什么 AlexNet 是里程碑至少 2 个例子) print(2. VGG 的设计哲学是什么) print(3. ResNet 如何解决梯度消失用生活例子) print(4. 如何选择适合的架构) print(\n方式) print(□ 写一篇 800 字左右的文章) print(□ 录一段 10-15 分钟的视频) print(□ 找个朋友给他讲一遍) print(\n【标记卡壳点】5 分钟) print(我今天卡壳的地方) print(□ _________________________________) print(□ _________________________________) print(□ _________________________________) print(\n【针对性复习】5 分钟) print(回到教程中卡壳的地方重新学习然后再次尝试解释) print(\n * 50) print( 费曼学习笔记模板) print( * 50) print( ╔═══════════════════════════════════════════════════╗ ║ Day 12 费曼学习笔记 ║ ╠═══════════════════════════════════════════════════╣ ║ 日期__________ ║ ║ 学习时长__________ ║ ╠═══════════════════════════════════════════════════╣ ║ ║ ║ 1. 我向小白解释了 ║ ║ _______________________________________________ ║ ║ _______________________________________________ ║ ║ ║ ║ 2. 我卡壳的地方 ║ ║ □ _____________________________________________ ║ ║ □ _____________________________________________ ║ ║ ║ ║ 3. 我的通俗比喻 ║ ║ • AlexNet 就像 ______ ║ ║ • VGG 就像 ______ ║ ║ • ResNet 就像 ______ ║ ║ • 迁移学习就像 ______ ║ ║ ║ ║ 4. 我还想知道 ║ ║ _______________________________________________ ║ ║ ║ ╚═══════════════════════════════════════════════════╝ ) print(\n * 50) print( 今日总结) print( * 50) print(\n✅ 你今天学到了) print(\n1. 深度学习发展史) print( - LeNet-5先驱) print( - AlexNet革命) print( - VGG简洁) print( - ResNet突破) print(\n2. 各架构的特点) print( - AlexNetReLU、Dropout、GPU 加速) print( - VGG全部 3×3 卷积、结构规整) print( - ResNet残差连接、解决梯度消失) print(\n3. 实践能力) print( - 加载预训练模型) print( - 对比不同架构) print( - 迁移学习应用) print(\n4. 费曼输出能力 ⭐) print( - 能用比喻解释架构演进) print( - 能向小白说明残差连接) print( - 能对比不同架构的优劣) print(\n * 50) print( 明日预告) print( * 50) print( 明天你将学习 主题RNN 和 LSTM 内容 ✓ 为什么需要处理序列数据 ✓ RNN 的基本原理 ✓ LSTM 的门控机制 ✓ GRU 简化版 ✓ 实战情感分析 需要准备 ✓ 复习今天的 CNN 知识 ✓ 了解时间序列的概念 ✓ 保持好奇心 ) print(\n * 50) print( 常见问题) print( * 50) print(\nQ1: 为什么要学习这些经典架构) print( 答案 ✓ 站在巨人肩膀上不用重复造轮子 ✓ 理解设计思想可以灵活运用 ✓ 知道何时用哪个实际问题选择 ✓ 面试必备大厂常考 就像学武术 先学经典招式 再融会贯通 最后自创一派 ) print(\nQ2: 实际项目中应该选哪个架构) print( 建议 简单任务 → ResNet18/34快且好 中等任务 → ResNet50/VGG16平衡 复杂任务 → ResNet101/EfficientNet最强 资源有限 → MobileNet/ShuffleNet轻量级 原则 - 先用预训练模型迁移学习 - 从小模型开始快速迭代 - 根据需要调整性能 vs 速度 ) print(\nQ3: 迁移学习和从头训练有什么区别) print( 迁移学习 ✓ 用别人训练好的模型 ✓ 在自己的数据上微调 ✓ 节省时间和算力 ✓ 小数据也能有好效果 ✗ 受限于预训练模型 从头训练 ✓ 完全定制 ✓ 适合特殊任务 ✓ 需要大量数据 ✓ 需要大量算力 ✗ 风险大时间长 推荐 99% 的情况用迁移学习 只有特殊需求才从头训练 ) print(\n * 50) print( 最后的鼓励) print( * 50) print( 第十二天完成了 你已经掌握了 ✓ CNN 基础 ✓ 经典架构 ✓ 迁移学习 ✓ 架构对比 这是质的飞跃 从今天起 ✓ 你能选择合适的架构了 ✓ 你能用预训练模型了 ✓ 你能解释发展历程了 ✓ 你能创造生动的比喻了 记住这个成就感 每天都在进步 每天都在变强 继续加油明天学习 RNN 记住 经典是经过时间考验的智慧 你现在掌握了这些智慧 可以用它们解决实际问题了 加油我相信你一定可以的✨ ) print(\n * 50) print( 打卡模板) print( * 50) print( 日期___________ 学习时长_______ 小时 费曼输出次数_______ 次 今天学会了 遇到的卡壳点 如何用比喻解释的 明天的目标 ) print(\n明天见继续加油 ✨) --- ## 相关链接 ### 项目资源 - **GitHub 仓库**: [https://github.com/Lee985-cmd/AI-30-Day-Challenge](https://github.com/Lee985-cmd/AI-30-Day-Challenge) - **CSDN 专栏**: [https://blog.csdn.net/m0_67081842?typeblog](https://blog.csdn.net/m0_67081842?typeblog) - ⭐ **如果觉得有帮助请给 GitHub 仓库 Star 支持** ### 学习路径 - [← Day11](../Day11/README.md) - [→ Day13](../Day13/README.md) --- *本教程属于 [AI 入门 30 天挑战](https://github.com/Lee985-cmd/AI-30-Day-Challenge) 系列* --- ## 恭喜你完成今天的学习 ### 学习路径导航 | 上一篇 | 当前 | 下一篇 | |--------|------|--------| | [Day 11](../Day11/README.md) | **Day 12** | [[Day 13](../Day13/README.md)] | ### 资源汇总 - **完整 30 天教程**[CSDN 专栏 - AI 入门 30 天挑战](https://blog.csdn.net/m0_67081842?typeblog) - **完整代码 项目实战**[GitHub 仓库](https://github.com/Lee985-cmd/AI-30-Day-Challenge) ⭐欢迎 Star - ❓ **遇到问题**[GitHub Issues](https://github.com/Lee985-cmd/AI-30-Day-Challenge/issues) 提问 ### 互动时间 **思考题**今天的知识点中哪个让你印象最深刻为什么 欢迎在评论区分享你的想法或疑问 ### ❤️ 如果有帮助 - **点赞**让更多人看到这篇教程 - ⭐ **Star GitHub**获取完整代码和项目 - ➕ **关注专栏**不错过后续更新 - **分享给朋友**一起学习进步 **明天见继续 Day 13 的学习~** --- ## 关于作者 获取更多资源 本教程由 **Lee职场宝爸** 创建记录从零基础到独立完成 AI 项目的真实历程。 ### 关注公众号获取独家内容 **公众号名称Lee 的成长日记** 微信搜索关注获取 - ✅ **AI 学习路线规划**零基础如何系统学习 AI - ✅ **项目实战源码**完整可运行的项目代码 - ✅ **深度技术解析**前沿技术原理 手写代码实现 - ✅ **职场成长心得**一个宝爸的 AI 逆袭之路 **关注福利** - 回复「**路线**」→ 获取 30 天 AI 学习计划表 - 回复「**项目**」→ 获取 GitHub 项目源码合集 - 回复「**资料**」→ 获取零基础学习资源推荐 **扫码关注公众号**  ### 其他平台 - **GitHub**https://github.com/Lee985-cmd/AI-30Days-Challenge - **CSDN 博客**https://blog.csdn.net/m0_67081842 - **公众号**微信搜索「Lee 的成长日记」 --- **学习建议** 如果本篇教程对你有帮助欢迎 1. **Star GitHub 项目**https://github.com/Lee985-cmd/AI-30Days-Challenge 2. **关注公众号**获取更多独家内容 3. **留言交流**你的学习困惑 **一起学习一起进步**