0%

PyTorch训练全流程:从微分原理到梯度下降的完整实现

深度学习模型的训练过程,本质上是一个不断自我修正的闭环系统。在这个系统中,权重和偏置是模型需要学习的核心参数,损失函数是衡量模型表现的标尺,而反向传播与梯度下降则是驱动模型优化的引擎。理解这些组件如何协同工作,是掌握PyTorch的关键。

模型参数:权重与偏置的数学本质

在神经网络中,权重和偏置是模型内部的可学习参数,它们决定了输入数据如何被变换以产生预测结果。

权重是连接神经元之间的参数,本质上是输入特征对输出结果的贡献系数。在全连接层中,若输入特征为x,权重为w,则权重决定了输入信号在传递到下一层时的缩放比例。权重矩阵的数值大小和分布直接影响模型的表达能力和复杂度。

偏置是每个神经元自带的可学习参数,用于在加权求和后提供线性偏移量。其数学表达式为z = w^T x + b,其中b的存在使得激活函数可以在非原点位置产生响应。合理的偏置初始化可以使神经元在训练初期保持活跃状态。

在PyTorch中,这些参数被封装在nn.Module的子类中,通过model.parameters()可以获取所有需要训练的权重和偏置。

训练数据:训练值与目标值的角色

训练过程依赖于成对的数据:训练值和目标值。

训练值是模型的输入数据,通常表示为X。在图像分类任务中,训练值可能是像素矩阵;在回归任务中,可能是特征向量。训练值经过模型的前向传播,产生预测结果。

目标值是训练数据对应的真实标签,通常表示为y。它是模型学习的”标准答案”,用于与模型的预测结果进行比较。目标值的质量直接决定了模型学习的方向。

在训练循环中,训练值和目标值通常以批次(batch)的形式被加载到内存中,以便进行高效的并行计算。

阅读全文 »

Python单元测试:告别“手动点点点”的自动化之道

在Python开发的世界里,我们常常陷入一种循环:写代码 -> 运行 -> 发现Bug -> 修Bug -> 运行 -> 发现新Bug。如果你的测试方式还停留在写几个 print() 或者在浏览器里手动点击按钮,那么当项目代码量超过几千行时,这种“手工测试”将成为你最大的噩梦。

单元测试,就是拯救你于水火之中的“自动化疫苗”。我们来聊聊如何用 Python 的测试工具,构建坚不可摧的代码防线。


为什么你需要单元测试?

想象一下,你正在开发一个电商系统。你刚修复了“购物车结算”的一个小错误,结果上线后发现“用户登录”功能挂了。这就是典型的回归错误

单元测试的核心价值在于:

  • 快速反馈:代码写完即测,不用等到上线。
  • 重构的安全网:想优化代码结构?只要测试全过,你就知道没把核心逻辑改坏。
  • 活文档:测试用例就是最好的API说明书,告诉你这个函数该怎么用。

两大门派:unittest 与 pytest

Python 的测试生态主要由两位“大佬”把持:内置的 unittest 和第三方霸主 pytest

unittest:学院派的老大哥

它是 Python 的标准库,无需安装。它的风格比较“Java风”,需要写类、继承 unittest.TestCase,代码结构严谨但略显繁琐。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 传统的 unittest 风格
import unittest

class TestMath(unittest.TestCase):
# unittest会自动查找 test_ 前缀的方法,然后进行执行
def test_add(self):
self.assertEqual(1 + 1, 2) # 必须用特定的断言方法
# 初始化数据或清理资源。unittest 提供了 setUp() 和 tearDown() 方法
def setUp(self):
# 在每个 test_ 方法执行前运行
print("连接数据库...")
self.connection = "mock_db_connection"

def tearDown(self):
# 在每个 test_ 方法执行后运行
print("关闭数据库连接...")
self.connection = None

if __name__ == '__main__':
unittest.main()
阅读全文 »

Python虚拟环境:告别依赖冲突的终极指南

在Python开发的旅途中,你是否遇到过这样的窘境:项目A需要Django 2.0,而项目B必须运行在Django 4.0上?当你升级了全局的库,旧项目突然报错,新环境也无法搭建。

这就是“依赖地狱”。我们来探讨 Python 开发的最佳实践——虚拟环境,看看它如何像“独立小房间”一样,让你的每个项目都井井有条。


为什么我们需要虚拟环境?

想象一下,你的电脑是一个巨大的公共图书馆(全局环境)。如果所有项目都共用这一套书(第三方库),一旦有人把《Python教程》从第2版换成了第3版,那些依赖第2版的项目就会因为“找不到章节”而崩溃。

虚拟环境的作用,就是给每个项目分配一个独立的书架。

  • 隔离性:项目A的库不会干扰项目B。
  • 纯净性:保持系统全局Python环境的整洁,避免系统工具出错。
  • 可移植性:轻松将环境迁移到另一台电脑或分享给同事。

核心工具:venv

Python 3.3+ 版本已经内置了 venv 模块,无需额外安装,它是目前最轻量、最通用的选择。

1. 创建环境

打开终端,进入你的项目目录,运行以下命令:

1
2
# 创建一个名为 .venv 的虚拟环境
python -m venv .venv

注:.venv 是常见的命名习惯,表示这是一个隐藏的环境文件夹。

2. 激活环境

创建好后,你必须“激活”它,才能进入这个独立空间。

  • Windows (CMD): .venv\Scripts\activate.bat
  • Windows (PowerShell): .venv\Scripts\Activate.ps1
  • macOS / Linux: source .venv/bin/activate

成功标志:命令行提示符前会出现 (.venv) 字样。此时,你安装的包只会存在于这个文件夹内。

3. 退出环境

阅读全文 »

深度学习与机器学习区别

深度学习是机器学习的一个子集。你可以将它们的关系理解为:人工智能 > 机器学习 > 深度学习

它们最核心的区别在于处理数据的方式,尤其是在“特征工程”这个环节。

核心区别:特征工程

  • 机器学习 (Machine Learning):通常需要人工特征工程。这意味着需要领域专家手动从原始数据中提取和选择对任务有用的特征,然后喂给算法进行训练。
    • 例如:要训练一个模型识别猫的图片,你可能需要手动定义并提取“有尖耳朵”、“有胡须”、“有尾巴”等特征。
  • 深度学习 (Deep Learning):能够自动进行特征工程。它通过多层神经网络结构,直接从原始数据(如图像的像素)中学习从低级到高级的复杂特征,无需人工干预。
    • 例如:将大量猫和狗的图片直接输入深度学习模型,它自己会学习到边缘、形状、纹理等特征,并最终学会区分猫和狗。

多维度对比

为了更清晰地理解它们的差异,可以参考下表:

对比维度 机器学习 (ML) 深度学习 (DL)
数据需求 在中小型数据集上表现良好。 需要海量数据才能发挥优势。
硬件依赖 对计算能力要求相对较低,普通CPU即可。 高度依赖强大的计算能力,通常需要GPU。
训练时间 训练时间较短,从几秒到几小时不等。 训练时间很长,可能从几小时到几周。
可解释性 模型相对简单,结果较易解释(如决策树)。 模型如同“黑匣子”,决策过程难以解释。
适用任务 更适合处理结构化数据(如数据库表格)。 擅长处理非结构化数据(如图像、文本、音频)。
阅读全文 »

张量

张量(Tensor)是深度学习中最基本的数据结构,你可以把它理解为一个多维数组。在 Python 中,我们通常使用 PyTorch 或 TensorFlow 等库来操作张量。

下面将以 PyTorch 为例,介绍张量的核心概念和常用操作。

什么是张量?

张量是标量、向量、矩阵的泛化,是 AI 中统一的数据格式。它的“阶”(Rank)或“维度”(Dimensions)决定了它的结构。

阶 (Rank) 名称 示例 形状 (Shape)
0 标量 (Scalar) 一个数字,如 5 ()
1 向量 (Vector) 一维数组,如 [1, 2, 3] (3,)
2 矩阵 (Matrix) 二维表格,如 [[1, 2], [3, 4]] (2, 2)
3 3阶张量 三维数组,如一张彩色图片 (高, 宽, 通道) (224, 224, 3)
n n阶张量 n维数组,如一批图片 (批次, 高, 宽, 通道) (32, 224, 224, 3)

每个张量都有三个核心属性:

  • 形状 (shape): 描述张量在每个维度上的大小。
  • 数据类型 (dtype): 张量中元素的类型,如 torch.float32
  • 设备 (device): 张量存储的位置,如 CPU 或 GPU。

Python中的张量操作 (基于PyTorch)

1. 创建张量

阅读全文 »