🌟 完整项目和代码
本教程是AI 入门 30 天挑战系列的一部分!
- 💻GitHub 仓库: https://github.com/Lee985-cmd/AI-30-Day-Challenge
- 📖CSDN 专栏: https://blog.csdn.net/m0_67081842?type=blog
- ⭐欢迎 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(简洁优雅) - GoogLeNet(Inception 模块) - 越来越深,效果越好 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 分钟)
AlexNet(2012 年 - 深度学习革命)
AlexNet 的故事:
背景: 2012 年之前: - 大家用传统方法(SIFT、HOG 特征) - 神经网络被认为没用(太慢、效果一般) - 学术界不看好 2012 年 ImageNet 竞赛: - 一个叫 Alex Krizhevsky 的人参赛 - 用了一个很深的神经网络(当时看来) - 结果:准确率 84.6% - 第二名只有 73.8% - 领先 10.8%!碾压! 从此: - 深度学习火了 🔥 - 大家都开始研究神经网络 - AI 进入新时代!AlexNet 的架构(简化版):
输入(227×227 彩色图片) ↓ Conv1(96 个卷积核,11×11,步长 4)→ ReLU → MaxPool ↓ Conv2(256 个卷积核,5×5)→ ReLU → MaxPool ↓ Conv3(384 个卷积核,3×3)→ ReLU ↓ Conv4(384 个卷积核,3×3)→ ReLU ↓ Conv5(256 个卷积核,3×3)→ ReLU → MaxPool ↓ 全连接层(4096 个神经元)→ ReLU → Dropout ↓ 全连接层(4096 个神经元)→ ReLU → Dropout ↓ 输出层(1000 类,Softmax) 特点: ✓ 5 个卷积层 + 3 个全连接层 ✓ ReLU 激活(当时是创新) ✓ Dropout(防止过拟合) ✓ GPU 加速(也是创新) ✓ 数据增强(翻转、裁剪)VGG(2014 年 - 越深越好)
VGG 的思想:
探索一个问题:多深才够深? VGG 的实验: - 全部用 3×3 小卷积核 - 一层一层叠起来 - 看看到底多深效果好 发现: ✓ 层数越深,效果越好 ✓ 但有上限(太深会梯度消失) ✓ VGG16(16 层)是个很好的平衡点 ✓ VGG19(19 层)更好一点为什么都用 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 步:ResNet(2015 年 - 残差网络)(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(pretrained=True) print("✓ AlexNet 加载完成") # VGG16 vgg16 = models.vgg16(pretrained=True) print("✓ VGG16 加载完成") # ResNet18 resnet18 = models.resnet18(pretrained=True) 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, color=colors, alpha=0.7) ax1.set_title('网络深度对比', fontsize=14) ax1.set_ylabel('层数') ax1.grid(True, alpha=0.3, axis='y') for bar, depth in zip(bars, depths): ax1.text(bar.get_x() + bar.get_width()/2., depth + 0.5, f'{depth}层', ha='center', va='bottom', fontsize=12, fontweight='bold') # 图 2:参数量对比 ax2 = axes[1] params = [60, 138, 11.7] # 单位:百万 bars = ax2.bar(network_names, params, color=colors, alpha=0.7) ax2.set_title('参数量对比(百万)', fontsize=14) ax2.set_ylabel('参数量(M)') ax2.grid(True, alpha=0.3, axis='y') for bar, param in zip(bars, params): ax2.text(bar.get_x() + bar.get_width()/2., param + 2, f'{param}M', ha='center', va='bottom', fontsize=12, fontweight='bold') # 图 3:准确率对比 ax3 = axes[2] accuracies = [57.1, 73.4, 70.3] bars = ax3.bar(network_names, accuracies, color=colors, alpha=0.7) ax3.set_title('ImageNet Top-1 准确率', fontsize=14) ax3.set_ylabel('准确率(%)') ax3.set_ylim(0, 100) ax3.grid(True, alpha=0.3, axis='y') for bar, acc in zip(bars, accuracies): ax3.text(bar.get_x() + bar.get_width()/2., acc + 1, f'{acc}%', ha='center', va='bottom', fontsize=12, fontweight='bold') 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(pretrained=True) # 冻结前面的层(不更新权重) 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(" - AlexNet:ReLU、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?type=blog](https://blog.csdn.net/m0_67081842?type=blog) - ⭐ **如果觉得有帮助,请给 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?type=blog) - 💻 **完整代码 + 项目实战**:[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. **留言交流**你的学习困惑 > > **一起学习,一起进步!** 🤝