news 2026/5/1 0:24:51

深度学习基础概念详解

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
深度学习基础概念详解

1. 模型的本质是什么?

模型 = 一个数学函数 + 一堆参数(权重) 最简单的例子:线性回归 y = w * x + b - w和b就是"参数"(也叫权重) - 训练就是找到最好的w和b,让预测值y尽量接近真实值 神经网络就是把很多这样的函数叠加起来: 第1层: h1 = w1 * x + b1 第2层: h2 = w2 * h1 + b2 第3层: h3 = w3 * h2 + b3 ... 输出层: y = wn * hn-1 + bn

用代码理解:

# 一个最简单的"模型" class SimpleModel: def __init__(self): # 这些就是"参数",初始是随机的 self.w1 = random() # 比如 0.5 self.w2 = random() # 比如 0.3 self.b = random() # 比如 0.1 def forward(self, x): # 这就是"前向传播",用参数计算输出 return self.w1 * x + self.w2 * x**2 + self.b # 模型就是:结构(forward函数)+ 参数(w1, w2, b) # 保存模型 = 保存这些参数的值

2. 训练的本质是什么?

训练 = 不断调整参数,让模型的输出越来越接近正确答案 ┌─────────────────────────────────────────────────────────────┐ │ 第1步:随机初始化参数 │ │ w = 0.5, b = 0.1(瞎猜的) │ └─────────────────────────────────────────────────────────────┘ ↓ ┌─────────────────────────────────────────────────────────────┐ │ 第2步:前向传播(用当前参数计算预测值) │ │ 输入x=2,预测 y_pred = 0.5*2 + 0.1 = 1.1 │ │ 真实答案 y_true = 3.0 │ └─────────────────────────────────────────────────────────────┘ ↓ ┌─────────────────────────────────────────────────────────────┐ │ 第3步:计算损失(预测值和真实值差多远) │ │ loss = (y_pred - y_true)² = (1.1 - 3.0)² = 3.61 │ │ loss越大,说明预测越差 │ └─────────────────────────────────────────────────────────────┘ ↓ ┌─────────────────────────────────────────────────────────────┐ │ 第4步:反向传播(计算每个参数对loss的影响) │ │ 求导:∂loss/∂w = ? ∂loss/∂b = ? │ │ 这一步是PyTorch/TensorFlow自动帮你算的 │ └─────────────────────────────────────────────────────────────┘ ↓ ┌─────────────────────────────────────────────────────────────┐ │ 第5步:更新参数(让loss变小) │ │ w_new = w_old - learning_rate * ∂loss/∂w │ │ b_new = b_old - learning_rate * ∂loss/∂b │ │ 这就是"梯度下降" │ └─────────────────────────────────────────────────────────────┘ ↓ 重复第2-5步,直到loss足够小

用代码理解:

# 完整的训练循环 model = SimpleModel() optimizer = SGD(model.parameters(), lr=0.01) # 优化器,lr就是learning_rate for epoch in range(100): # 训练100轮 for x, y_true in training_data: # 第2步:前向传播 y_pred = model.forward(x) # 第3步:计算损失 loss = (y_pred - y_true) ** 2 # 第4步:反向传播(PyTorch自动算梯度) loss.backward() # 第5步:更新参数 optimizer.step() optimizer.zero_grad() print(f"Epoch {epoch}, Loss: {loss}") # Loss会越来越小:3.61 → 2.1 → 0.8 → 0.2 → 0.05 → ...

3. ResNet-50是什么?

ResNet-50 = 一个有50层的神经网络结构 "结构"是什么意思?就是定义了: - 有多少层 - 每层有多少个神经元 - 层与层之间怎么连接 ResNet的特点是有"残差连接"(跳跃连接),解决深层网络难训练的问题 ┌─────┐ ┌─────┐ ┌─────┐ │第1层│ ──→ │第2层│ ──→ │第3层│ ──→ ... └─────┘ └─────┘ └─────┘ ↑ │ └────────────┘ ← 这就是"残差连接",让梯度能直接传过去

ResNet-50的参数量:约2500万个参数

# ResNet-50的结构(简化版) class ResNet50: def __init__(self): self.conv1 = Conv2d(...) # 第1层,有若干参数 self.conv2 = Conv2d(...) # 第2层 self.conv3 = Conv2d(...) # 第3层 # ... 一共50层 self.fc = Linear(2048, 1000) # 最后一层,输出1000类 # 总共约2500万个参数(w和b)

4. 预训练权重是什么?

预训练权重 = 别人已经训练好的参数值 ImageNet是一个超大数据集: - 1400万张图片 - 1000个类别(猫、狗、汽车、飞机...) 有人(Google/Facebook)用这个数据集训练了ResNet-50: - 花了几周时间 - 用了几十张GPU - 得到了一组很好的参数值 这组参数就是"预训练权重",可以下载使用

预训练权重文件长什么样?

# 预训练权重就是一个字典,存储每一层的参数值 pretrained_weights = { "conv1.weight": [[0.23, 0.45, ...], [0.12, 0.67, ...], ...], # 第1层的w "conv1.bias": [0.01, 0.02, ...], # 第1层的b "conv2.weight": [[...], [...], ...], # 第2层的w "conv2.bias": [...], # 第2层的b # ... 所有层的参数 } # 保存成文件:resnet50-imagenet.pth(约100MB)

5. 迁移学习是什么意思?

迁移学习 = 借用别人训练好的参数,在自己的数据上微调 为什么能迁移? - 神经网络的前面几层学到的是"通用特征":边缘、纹理、形状 - 这些特征对所有图像任务都有用 - 只需要调整最后几层,适应你的具体任务 打个比方: - 预训练 = 学会了"看图的基本能力"(识别边缘、颜色、形状) - 迁移学习 = 用这个能力去做"垃圾分类"这个具体任务

迁移学习的代码:

from torchvision.models import resnet50, ResNet50_Weights # ========== 方法1:从头训练(不用预训练权重)========== model = resnet50(weights=None) # 随机初始化参数 # 需要大量数据 + 很长时间才能训练好 # ========== 方法2:迁移学习(用预训练权重)========== # 第1步:加载预训练权重 model = resnet50(weights=ResNet50_Weights.IMAGENET1K_V1) # 现在model的参数已经是ImageNet上训练好的值了 # 第2步:冻结前面的层(不训练,保持原样) for param in model.parameters(): param.requires_grad = False # 冻结,不更新 # 第3步:替换最后一层(适应你的任务) # 原来:输出1000类(ImageNet的类别数) # 现在:输出4类(垃圾分类:可回收、有害、厨余、其他) model.fc = nn.Linear(2048, 4) # 只有这一层需要训练 # 第4步:只训练最后一层 optimizer = SGD(model.fc.parameters(), lr=0.001) # 只优化fc层 # 这样训练很快,因为只需要调整最后一层的参数!

迁移学习的效果对比:

方法需要数据量训练时间准确率
从头训练100万+几天可能很差
迁移学习几万几小时很好

6. 训练集、验证集、测试集是干嘛的?

这是防止"作弊"的机制 想象一个学生准备考试: - 训练集 = 平时做的练习题(可以反复做,知道答案) - 验证集 = 模拟考试(检验学习效果,调整学习方法) - 测试集 = 正式考试(最终评估,只考一次) 如果用练习题的成绩来评价学生,不公平! 因为他可能把题目背下来了,但不会举一反三

具体作用:

# 数据划分:80%训练,10%验证,10%测试 all_data = load_data() # 2.9万张图片 train_data = all_data[:23200] # 训练集:2.32万 val_data = all_data[23200:26100] # 验证集:0.29万 test_data = all_data[26100:] # 测试集:0.29万 # 训练过程 for epoch in range(50): # 1. 在训练集上训练 model.train() for x, y in train_data: loss = compute_loss(model(x), y) loss.backward() optimizer.step() # 2. 在验证集上评估(不训练,只看效果) model.eval() val_accuracy = evaluate(model, val_data) print(f"Epoch {epoch}, 验证集准确率: {val_accuracy}") # 3. 根据验证集效果调整策略 if val_accuracy < last_accuracy: # 验证集效果变差了,可能过拟合了 # 可以早停、调学习率、加正则化等 learning_rate *= 0.1 # 训练完成后,在测试集上最终评估 test_accuracy = evaluate(model, test_data) print(f"最终测试集准确率: {test_accuracy}") # 这个数字才能对外说

为什么要分开?

问题:过拟合 = 模型把训练数据"背下来"了,但不会泛化 例子: 训练集准确率: 99%(练习题全对) 测试集准确率: 60%(考试不及格) 这说明模型没有真正"学会",只是记住了训练数据 验证集的作用: 在训练过程中监控模型的"泛化能力" 如果验证集准确率开始下降,就该停止训练了(早停) 测试集的作用: 最终评估模型效果,这个数字才能写进论文/简历 注意:测试集只能用一次!不能用它来调参数

7. 保存模型保存的是什么?

保存模型 = 保存所有参数的值 模型文件里存的就是一个字典: { "layer1.weight": tensor([[0.23, 0.45, ...], ...]), "layer1.bias": tensor([0.01, 0.02, ...]), "layer2.weight": tensor([[...], ...]), ... } 这些数字就是训练完成后每个参数的最优值

代码演示:

# ========== 保存模型 ========== # 方法1:只保存参数(推荐) torch.save(model.state_dict(), "model_weights.pth") # 文件大小约100MB(取决于模型参数量) # 方法2:保存整个模型(包括结构和参数) torch.save(model, "model_full.pth") # ========== 加载模型 ========== # 方法1:先定义结构,再加载参数 model = ResNet50() # 先创建模型结构 model.load_state_dict(torch.load("model_weights.pth")) # 再加载参数 # 现在model的参数就是训练好的值了 # 方法2:直接加载整个模型 model = torch.load("model_full.pth") # ========== 使用模型 ========== model.eval() # 切换到评估模式 image = load_image("垃圾.jpg") prediction = model(image) # 输出:[0.1, 0.8, 0.05, 0.05] → 有害垃圾

8. 参数为什么有用?

参数 = 模型从数据中学到的"知识" 训练前: 参数是随机的 → 输入垃圾图片 → 输出随机猜测 训练后: 参数被调整过 → 输入垃圾图片 → 输出正确分类 参数的值"编码"了: - 什么样的边缘特征代表塑料瓶 - 什么样的颜色特征代表厨余垃圾 - 什么样的形状特征代表电池 这些知识就存储在那2500万个参数里

直观理解:

想象参数是"决策规则": if 参数w1 > 0.5 and 边缘特征 == 圆形: 可能是塑料瓶 if 参数w2 > 0.3 and 颜色特征 == 绿色: 可能是厨余垃圾 ... 实际的神经网络更复杂,但本质就是用参数组合特征做决策 训练就是找到最好的参数组合
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/23 20:26:29

如何在GitHub上部署Qwen-Image-Edit-2509实现高效图像编辑?

如何在GitHub上部署Qwen-Image-Edit-2509实现高效图像编辑&#xff1f; 在电商运营、社交媒体内容生产和数字创意设计的日常工作中&#xff0c;频繁修改图片已成为常态。然而&#xff0c;依赖Photoshop等专业工具进行手动调整不仅耗时费力&#xff0c;还对操作者的技术水平有较…

作者头像 李华
网站建设 2026/4/27 4:23:50

SLAM文献之A micro Lie theory for state estimation in robotic(1)

摘要 李群&#xff08;Lie group&#xff09;是一种历史悠久的数学抽象对象&#xff0c;其理论可追溯到19世纪&#xff0c;当时数学家 Sophus Lie 奠定了连续变换群理论的基础。此后多年&#xff0c;李群的影响逐渐扩展到科学与技术的诸多领域。近年来&#xff0c;在机器人领域…

作者头像 李华
网站建设 2026/4/26 23:42:51

wiliwili客户端全面故障排查指南:从入门到精通的手柄控制解决方案

大家好&#xff01;作为一款专为手柄控制设计的跨平台B站客户端&#xff0c;wiliwili确实给我们带来了全新的观影体验。但有时候&#xff0c;各种小问题也会让我们头疼不已。别担心&#xff0c;今天我就为大家带来一份超详细的wiliwili故障排查指南&#xff0c;让你轻松解决99%…

作者头像 李华
网站建设 2026/4/22 2:27:05

Live2D智能助手:3步打造网站AI虚拟角色完整指南

Live2D智能助手&#xff1a;3步打造网站AI虚拟角色完整指南 【免费下载链接】live2d_ai 基于live2d.js实现的动画小人ai&#xff0c;拥有聊天功能&#xff0c;还有图片识别功能&#xff0c;可以嵌入到网页里 项目地址: https://gitcode.com/gh_mirrors/li/live2d_ai 想要…

作者头像 李华
网站建设 2026/4/29 14:47:14

火山引擎AI大模型服务为何选择vLLM作为底层引擎?

火山引擎AI大模型服务为何选择vLLM作为底层引擎&#xff1f; 在大模型落地的浪潮中&#xff0c;推理性能已成为决定企业能否将先进AI能力真正转化为生产力的关键瓶颈。尽管许多团队已经成功训练或微调出高质量的语言模型&#xff0c;但在实际部署时却常常遭遇“跑不快、撑不住、…

作者头像 李华
网站建设 2026/5/1 5:42:18

LangChain Expression Language重构Qwen3-VL-30B链式逻辑

LangChain Expression Language重构Qwen3-VL-30B链式逻辑 在智能文档理解、医疗影像分析和自动驾驶感知系统日益复杂的今天&#xff0c;如何高效调度大型视觉语言模型&#xff08;VLM&#xff09;的推理流程&#xff0c;已成为AI工程落地的核心瓶颈。传统的串行调用方式难以应对…

作者头像 李华