深度学习入门必学:Python核心语法与工程实践速通指南
2026/9/11 19:06:13 网站建设 项目流程

很多准备入门深度学习的同学,最开始其实不是被数学公式劝退的,而是被 Python 环境、库安装、代码风格、张量维度这些工程问题磨掉了耐心。网上 Python 教程很多,但大部分是通用编程教程,和深度学习结合的案例比较少,学完之后仍然不知道框架代码为什么那样写。

这篇文章专门为深度学习初学者整理了一条 Python 速通路径。内容不会追求 Python 语法全覆盖,而是聚焦深度学习项目中真正高频使用的部分:环境搭建、核心语法、NumPy 数据操作、图像预处理、训练代码结构拆解,以及最常见的排错经验。学完之后,你至少能看懂 PyTorch / TensorFlow 的官方示例代码,能自己动手读写数据、改模型结构、跑通一个简单的训练流程。

1. 深度学习入门,为什么先学 Python

1.1 Python 在深度学习生态中的位置

深度学习领域的核心框架,比如 PyTorch、TensorFlow、PaddlePaddle,对外暴露的接口基本都是 Python。虽然框架底层是 C++ 和 CUDA 实现的,但日常开发中我们只跟 Python API 打交道。数据加载、模型定义、训练循环、日志打印、结果可视化,这一整套流程全部用 Python 编写。

换句话说,Python 是深度学习开发者的“操作界面”。你可以不了解 C++ 底层实现,但必须能熟练读写 Python 代码,否则连官方示例都跑不起来。

1.2 深度学习需要学的 Python 范围和普通开发不一样

如果你去看传统的 Python 入门教程,会发现大量内容集中在:文件读写、网络爬虫、装饰器、多线程、正则表达式、面向对象高级特性。这些内容对 Web 开发和自动化脚本很重要,但在深度学习入门阶段并不是最紧急的。

深度学习中 Python 的典型使用场景是这样的:

场景使用的 Python 能力
加载数据集文件路径操作、PIL/OpenCV 图像读取、JSON/CSV 解析
数据预处理NumPy 数组操作、归一化、维度变换
定义模型类和继承、__init__方法、forward方法
训练循环for 循环、条件判断、梯度清零、损失计算
结果分析matplotlib 绘图、字典和列表操作

所以本文会更侧重这些和深度学习强相关的 Python 知识点,而不是把所有语法都过一遍。这样可以节省大量时间,让你更快进入深度学习实战阶段。

1.3 零基础直接学框架可以吗

不推荐。

虽然 PyTorch 官方教程写得很友好,但如果完全不懂 Python,连class Net(nn.Module)这种继承写法、super().__init__()的调用逻辑都理解不了,调参时更不知道错误出在哪一行。建议先花一周左右速通 Python,再开始学框架,这样遇到问题能准确区分是“框架问题”还是“Python 语法问题”。

2. Python 开发环境搭建

2.1 Python 版本选择

现在深度学习框架普遍支持 Python 3.8 以上版本。PyTorch 近几个版本已经要求 Python 3.9 起,新版甚至默认推荐 3.11 或 3.12。建议直接安装 Python 3.10 或 3.11,这两个版本对深度学习框架的兼容性比较稳定。

如果不确定当前项目应该用哪个版本,等安装好了 PyTorch 或 TensorFlow 再回头看本文的“常见问题排查”部分,那里有版本匹配的策略。

官方下载地址是python.org,下载安装包时注意选择对应操作系统的版本。Windows 安装时务必勾选Add Python to PATH,否则命令行无法直接使用python命令。

2.2 虚拟环境:每个项目独立环境

深度学习项目依赖繁多,不同项目可能依赖不同版本的 PyTorch、NumPy,直接全局安装很容易出现依赖冲突。虚拟环境可以为每个项目创建独立的 Python 环境。

推荐使用venvcondavenv是 Python 自带的轻量级方案,简单够用;conda适合需要管理 CUDA、Python 版本切换的场景。

创建和激活虚拟环境:

# 创建虚拟环境 python -m venv dl_env # Windows 激活 dl_env\Scripts\activate # Linux / macOS 激活 source dl_env/bin/activate

激活后命令行会显示(dl_env)前缀,表示当前处于虚拟环境中。后续安装的包都只会出现在这个环境里。

2.3 IDE 与 Notebook 工具

深度学习开发中有两类工具互补:

  • IDE:推荐 VS Code 或 PyCharm。VS Code 轻量、插件丰富,配合 Python 插件可以获得代码补全和调试能力;PyCharm 社区版免费,对 Python 项目结构支持更完善,适合刚开始接触工程项目时使用。
  • Jupyter Notebook:特别适合做数据探索和实验记录。你可以分单元格执行代码,实时看到每一段数据的形状和值。入门阶段建议两个都装,写正式代码用 IDE,做数据处理和可视化验证用 Notebook。

如果使用 VS Code,可以在扩展市场搜索 “Python” 安装微软官方扩展,然后选择前面创建好的虚拟环境解释器。

2.4 安装深度学习基础库

进入虚拟环境后,用 pip 安装常用科学计算库:

pip install numpy pip install pillow pip install matplotlib

验证安装是否成功:

import numpy as np import PIL import matplotlib print(np.__version__) print(PIL.__version__)

如果输出没有报错,说明环境已经可以支撑后续的深度学习 Python 学习。

3. Python 核心语法速通

3.1 变量与基础数据类型

Python 是动态类型语言,不需要声明变量类型。

# 数值 a = 10 b = 3.14 # 字符串 name = "深度学习" # 布尔值 is_training = True # 打印 print(f"a 的值是 {a}, b 的值是 {b}")

深度学习代码中,数值类型需要注意区分整数和浮点数。很多计算错误就来自类型不匹配,比如整数除法与浮点数除法的差异:

x = 5 y = 2 print(x / y) # 2.5,除法结果是浮点数 print(x // y) # 2,整除 print(x % y) # 1,取余

在 PyTorch 中处理张量时,经常需要把整数转成浮点数,这时可以用float()

epoch = 10 print(float(epoch)) # 10.0

3.2 列表、元组、字典

list是最常用的容器类型,支持增删改查:

# 列表 losses = [0.5, 0.4, 0.3] losses.append(0.2) print(losses[0]) # 第一个元素 print(losses[-1]) # 最后一个元素 print(len(losses)) # 长度

列表推导式在数据处理中非常常用,可以一行代码生成新列表:

# 原始写法 new_losses = [] for x in losses: new_losses.append(x * 2) # 推导式写法 new_losses = [x * 2 for x in losses] print(new_losses)

dict字典用键值对存储数据,深度学习配置信息经常用字典管理:

config = { "learning_rate": 0.001, "batch_size": 32, "epochs": 50 } print(config["learning_rate"]) config["epochs"] = 100 print(config)

遍历字典时可以使用items()

for key, value in config.items(): print(f"配置项 {key} 的值是 {value}")

3.3 条件与循环

深度学习训练循环是一个典型的嵌套循环结构:外层遍历训练轮数,内层遍历批次数据。

epochs = 3 batches_per_epoch = 4 for epoch in range(epochs): for batch in range(batches_per_epoch): loss = (epoch + 1) * 0.1 + batch * 0.01 print(f"Epoch {epoch}, Batch {batch}, Loss {loss:.4f}")

range(start, stop, step)的用法要熟悉:

print(list(range(5))) # [0, 1, 2, 3, 4] print(list(range(1, 10, 2))) # [1, 3, 5, 7, 9]

条件判断用于控制训练流程,例如判断损失值是否足够小:

loss = 0.05 if loss < 0.1: print("模型已收敛") elif loss < 0.5: print("继续训练") else: print("损失较大,建议调整学习率")

3.4 函数与模块化

函数能把重复代码封装起来。深度学习中最典型的函数是训练函数和评估函数。

def compute_accuracy(correct, total): """计算准确率并返回百分比。""" if total == 0: return 0.0 return correct / total * 100 acc = compute_accuracy(85, 100) print(f"准确率: {acc:.2f}%")

函数支持默认参数和关键字参数:

def create_optimizer(model_name, lr=0.001, weight_decay=0.0): print(f"模型: {model_name}, 学习率: {lr}, 权重衰减: {weight_decay}") # 调用方式 create_optimizer("resnet18") create_optimizer("vit", lr=0.0001, weight_decay=0.01)

把相关函数拆分到不同.py文件中,用import导入,是工程化的第一步。

3.5 类与对象

深度学习模型定义使用类的写法。PyTorch 中每个模型都是一个继承自nn.Module的类,所以理解类的机制非常关键。

class Dog: def __init__(self, name, age): self.name = name self.age = age def bark(self): print(f"{self.name} 正在叫") def get_age(self): return self.age dog = Dog("旺财", 3) dog.bark() print(dog.get_age())

__init__方法是构造函数,在创建对象时自动调用。self代表实例本身,所有实例方法都通过self访问实例属性。

类支持继承,深度学习模型经常继承基类并重写关键方法:

class Animal: def __init__(self, name): self.name = name def speak(self): raise NotImplementedError("子类需要实现 speak 方法") class Cat(Animal): def speak(self): print(f"{self.name} 说喵喵") cat = Cat("咪咪") cat.speak()

这种“基类定义接口,子类实现细节”的思想,正是深度学习框架中自定义模型的基本模式。

4. NumPy:深度学习数据操作的核心

4.1 为什么必须学 NumPy

深度学习中的数据,本质上都是多维数组。一张彩色图片可以表示为(高度, 宽度, 通道数)的三维数组;一批图片则是四维数组(批次大小, 高度, 宽度, 通道数)。NumPy 提供了高效的多维数组对象ndarray,是深度学习中数据预处理最基础的工具。

4.2 创建 ndarray

import numpy as np # 从列表创建 data = np.array([1, 2, 3, 4, 5]) print(data) print(data.shape) # (5,) # 二维数组 matrix = np.array([[1, 2, 3], [4, 5, 6]]) print(matrix.shape) # (2, 3) # 全零数组 zeros = np.zeros((2, 3)) print(zeros) # 全一数组 ones = np.ones((2, 3)) print(ones) # 随机数组 random_data = np.random.randn(2, 3) print(random_data)

shape属性返回数组的维度信息,这是深度学习调试中出现频率最高的属性之一,看到张量数据第一件事就是打印它的shape

4.3 形状变换与广播机制

data = np.array([[1, 2, 3], [4, 5, 6]]) print(data.shape) # (2, 3) # reshape 改变形状 reshaped = data.reshape(3, 2) print(reshaped) # flatten 展平 flattened = data.flatten() print(flattened) # [1 2 3 4 5 6]

广播机制允许不同形状的数组执行运算:

a = np.array([1, 2, 3]) b = 2 print(a + b) # [3 4 5] matrix = np.array([[1, 2, 3], [4, 5, 6]]) row_mean = matrix.mean(axis=1, keepdims=True) print(matrix - row_mean) # 每行减去该行均值

4.4 索引与切片

data = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) # 取第一行 print(data[0]) # [1 2 3] # 取第一列 print(data[:, 0]) # [1 4 7] # 取子矩阵 print(data[0:2, 1:3]) # 前两行、第1到第2列

理解切片语法[行, 列]是图像裁剪、数据增强等操作的基础。

4.5 常用数学运算

a = np.array([1, 2, 3]) b = np.array([4, 5, 6]) print(a + b) # 逐元素加 print(a * b) # 逐元素乘 print(np.sum(a)) # 求和 print(np.mean(b)) # 求均值 print(np.max(a)) # 求最大值 print(np.sqrt(a)) # 开方

归一化是深度学习中最常见的数据预处理操作,直接把像素值从[0, 255]缩放到[0, 1]

pixels = np.array([255, 128, 64, 0]) normalized = pixels / 255.0 print(normalized)

5. 实战案例:用 Python 完成图像数据预处理

有了前面的基础,我们做一个完整的深度学习场景演练:读取图片、调整大小、归一化、构建批次数据。这个流程对应实际项目中数据加载模块的核心逻辑。

5.1 准备图片数据

首先创建项目目录:

dl_python_demo/ ├── data/ │ ├── cat_001.jpg │ ├── cat_002.jpg │ ├── dog_001.jpg │ └── dog_002.jpg ├── preprocess.py └── train_demo.py

在实际项目中,图片数据来自公开数据集或业务采集。这里重点是代码逻辑,所以假设data目录下已经有了图片文件。如果没有图片,可以先任意准备两张 jpg 图片放到对应目录中。

5.2 读取图像并查看基本信息

使用 Pillow 库读取图片:

# 文件路径:preprocess.py from PIL import Image import numpy as np img = Image.open("data/cat_001.jpg") print(img.size) # (宽, 高) print(img.mode) # RGB / L / RGBA # 转成 NumPy 数组 img_array = np.array(img) print(img_array.shape) # (高, 宽, 通道数)

这里需要记住:Image.size返回的是(宽, 高),而np.array(img).shape返回的是(高, 宽, 通道数)。这两个顺序刚好相反,是初学者最容易踩的坑。

5.3 Resize 与归一化

大部分深度学习模型要求输入尺寸固定,比如224x224,并且像素值通常要归一化到[0, 1]或按均值和标准差标准化。

# 文件路径:preprocess.py from PIL import Image import numpy as np def load_and_preprocess(image_path, target_size=(224, 224)): # 读取图片 img = Image.open(image_path).convert("RGB") # 调整大小 img = img.resize(target_size) # 转数组 img_array = np.array(img).astype(np.float32) # 归一化到 [0, 1] img_array = img_array / 255.0 # 调整形状为 (通道数, 高, 宽) # PyTorch 约定输入格式为 (C, H, W) img_array = img_array.transpose(2, 0, 1) return img_array result = load_and_preprocess("data/cat_001.jpg") print(result.shape) # (3, 224, 224) print(result.dtype) # float32 print(result.min(), result.max()) # 0.0, 1.0

5.4 批量构建输入数据

实际训练时不会一次只喂一张图,而是把多张图组合成一个批次。

# 继续在 preprocess.py 中追加 import os import glob image_files = glob.glob("data/*.jpg") print(f"找到 {len(image_files)} 张图片") batch_images = [] for image_file in image_files: processed = load_and_preprocess(image_file) batch_images.append(processed) # 把列表转成批次数组 (批次大小, 3, 224, 224) batch = np.stack(batch_images, axis=0) print(batch.shape) # (N, 3, 224, 224)

np.stack可以把一组形状相同的数组堆叠成新维度,这是组装批次数据最常用的手段。

5.5 简易训练循环示例

下面模拟一个深度学习训练循环,帮助你理解 Python 语法在真实框架中如何组合:

# 文件路径:train_demo.py import numpy as np class SimpleModel: """一个非常简单的线性模型,用来演示训练循环结构。""" def __init__(self, input_dim, output_dim): # 随机初始化权重 self.w = np.random.randn(input_dim, output_dim) * 0.01 self.b = np.zeros(output_dim) def forward(self, x): """前向传播:计算预测值。""" return np.dot(x, self.w) + self.b def compute_loss(pred, target): """均方误差损失。""" return np.mean((pred - target) ** 2) def train_one_epoch(model, x, y, learning_rate): # 前向传播 pred = model.forward(x) # 计算损失 loss = compute_loss(pred, y) # 计算梯度(演示用简化写法) grad_pred = 2 * (pred - y) / len(y) grad_w = np.dot(x.T, grad_pred) grad_b = np.sum(grad_pred, axis=0) # 梯度下降更新参数 model.w -= learning_rate * grad_w model.b -= learning_rate * grad_b return loss # 生成模拟数据:x 是 100 个样本,每个样本 10 维 np.random.seed(42) x_data = np.random.randn(100, 10) y_data = np.random.randn(100, 1) model = SimpleModel(input_dim=10, output_dim=1) epochs = 200 learning_rate = 0.01 for epoch in range(epochs): loss = train_one_epoch(model, x_data, y_data, learning_rate) if (epoch + 1) % 20 == 0: print(f"Epoch {epoch + 1}/{epochs}, Loss: {loss:.6f}")

运行这个脚本:

python train_demo.py

预期输出类似:

Epoch 20/200, Loss: 0.712345 Epoch 40/200, Loss: 0.456789 Epoch 60/200, Loss: 0.289012 ...

这里没有引入任何深度学习框架,只是用 NumPy 实现了一个简化版训练循环。你会发现 PyTorch 的训练循环代码结构与此非常相似,区别只是把数组换成了张量、把手动计算梯度换成了自动求导。

6. 从 Python 到 PyTorch:读得懂框架代码

6.1 PyTorch 模型代码拆解

PyTorch 官方示例里的模型定义,本质上就是 Python 类继承:

import torch.nn as nn import torch.nn.functional as F class Net(nn.Module): def __init__(self): super().__init__() self.conv1 = nn.Conv2d(3, 6, 5) self.pool = nn.MaxPool2d(2, 2) self.fc1 = nn.Linear(6 * 54 * 54, 120) self.fc2 = nn.Linear(120, 10) def forward(self, x): x = self.pool(F.relu(self.conv1(x))) x = x.view(-1, 6 * 54 * 54) x = F.relu(self.fc1(x)) x = self.fc2(x) return x

这段代码里用到的 Python 知识点包括:

  • class Net(nn.Module):继承 PyTorch 的基类。
  • super().__init__():调用父类构造函数,初始化内部模块状态。
  • self.conv1 = ...:在构造函数里创建子模块并保存为实例属性。
  • forward(self, x):定义前向传播逻辑,调用 PyTorch 提供的卷积、池化、线性层接口。
  • x.view(-1, ...):改变张量形状,-1表示自动推断维度。

如果前面的类和对象掌握得好,看懂这段代码就不会有障碍。

6.2 Dataset 类与数据流

PyTorch 中自定义数据集需要继承torch.utils.data.Dataset,并实现__len____getitem__两个方法:

from torch.utils.data import Dataset class ImageDataset(Dataset): def __init__(self, file_list, labels): self.file_list = file_list self.labels = labels def __len__(self): return len(self.file_list) def __getitem__(self, idx): image = load_and_preprocess(self.file_list[idx]) label = self.labels[idx] return image, label

这对应我们之前在preprocess.py中写的单张图片处理逻辑。框架负责管理批次采样、数据打乱、多进程加载,我们只需要告诉它“如何取出一条数据”。

6.3 训练循环对比

PyTorch 的训练循环比纯 NumPy 版本多了一些框架调用,但结构基本相同:

for epoch in range(epochs): running_loss = 0.0 for images, labels in train_loader: # 梯度清零 optimizer.zero_grad() # 前向传播 outputs = model(images) # 计算损失 loss = criterion(outputs, labels) # 反向传播 loss.backward() # 更新参数 optimizer.step() running_loss += loss.item()

对照第 5.5 节中的 NumPy 训练循环,你会发现就是一个“前向计算、计算损失、更新参数”的循环,只是loss.backward()把手动梯度计算替换成了自动求导。

7. 常见问题与排查思路

7.1 pip 安装库很慢或超时

问题现象常见原因解决思路
pip install 长时间卡住默认源在国外,网络不稳定临时使用国内镜像源
提示 Read timed out网络波动导致下载中断增加超时时间并重试

解决方案:

pip install numpy -i https://pypi.tuna.tsinghua.edu.cn/simple pip install --timeout 120 numpy

如果希望全局生效,可以修改 pip 配置。Windows 下在用户目录创建pip.ini,Linux 下创建pip.conf,写入:

[global] index-url = https://pypi.tuna.tsinghua.edu.cn/simple timeout = 120

7.2 安装 PyTorch 后 import 报错

错误信息通常以DLL load failedNo module named 'torch'出现。

排查步骤:

  1. 确认当前虚拟环境是否激活。
  2. 确认 Python 版本是否满足 PyTorch 要求。
  3. 确认安装的 PyTorch 版本与 CUDA 是否匹配。
  4. CPU 环境下安装 CPU 版本,不要强行装 CUDA 版本。

CPU 版本安装命令示例:

pip install torch torchvision torchaudio

如果机器有 NVIDIA 显卡,需要先查看显卡驱动支持的最高 CUDA 版本,再到 PyTorch 官网用对应的配置命令安装。

7.3 NumPy 版本与 PyTorch 冲突

问题现象常见原因解决思路
升级 PyTorch 后 NumPy 报错版本兼容性变化根据 PyTorch 版本要求调整 NumPy
np.boolnp.int不存在新版 NumPy 移除了旧别名改用boolint64等新写法

遇到版本冲突时,优先重新创建虚拟环境,在干净环境里安装匹配版本,避免多个项目共享依赖。

7.4 形状不匹配错误

size mismatch是深度学习初学者最常见的报错。根本原因通常是输入数据形状与模型期望的形状不一致。

排查思路:

  1. 打印输入张量的shapeprint(x.shape)
  2. 查看模型第一个线性层或卷积层定义的输入维度。
  3. 确认是否执行了transposereshape操作改变维度顺序。
  4. 确认批次维度是否存在,例如单张图片需要加批次维度:x = x.unsqueeze(0)

8. Python 速通后的最佳实践与工程建议

8.1 项目结构规范

入门阶段就要养成整理项目结构的习惯。推荐按以下方式组织:

project/ ├── data/ # 原始数据 ├── checkpoints/ # 模型权重 ├── logs/ # 日志输出 ├── src/ │ ├── data.py # 数据加载与预处理 │ ├── model.py # 模型定义 │ ├── train.py # 训练逻辑 │ └── utils.py # 工具函数 └── requirements.txt # 依赖列表

每个脚本只负责一个明确功能,避免把数据处理、模型定义、训练逻辑全部堆在一个文件里。

8.2 配置与硬编码分离

学习率、批次大小、训练轮数这些超参数不要直接写在代码里维护,建议集中管理:

config = { "learning_rate": 0.001, "batch_size": 32, "epochs": 50, "num_classes": 10, "model_name": "resnet18" }

或者使用配置文件。这样调参时只需要改配置,不需要动核心逻辑代码。

8.3 代码可复现性

训练深度学习模型时,随机性会影响结果。为了保证实验可复现,在代码开头固定随机种子:

import random import numpy as np import torch def set_seed(seed=42): random.seed(seed) np.random.seed(seed) torch.manual_seed(seed) torch.cuda.manual_seed_all(seed)

同时记录每个实验的 Python 版本、框架版本、数据集版本和配置信息。

8.4 日志与断点调试

不要依赖print排查所有问题。学会使用 Python 的logging模块记录训练过程,以及使用 IDE 的断点调试功能逐步查看变量值。

import logging logging.basicConfig(level=logging.INFO) logger = logging.getLogger(__name__) logger.info("开始加载数据...") logger.info("训练集大小: %d", len(train_dataset))

8.5 数据处理安全边界

数据加载模块需要考虑文件不存在、格式异常、标签缺失等边界情况:

def safe_load_image(path): if not os.path.exists(path): raise FileNotFoundError(f"图片文件不存在: {path}") try: img = Image.open(path).convert("RGB") except Exception as e: raise ValueError(f"图片格式无法解析: {path}, 原始错误: {e}") return img

生产环境或大规模训练时,更推荐在数据处理阶段提前清洗数据,而不是在训练过程中才暴露错误。

9. 下一步学习路线

完成 Python 速通后,可以按以下顺序继续深入:

  1. NumPy 高级操作:广播机制、矩阵运算、批量索引,这部分是张量操作的基础。
  2. PyTorch 官方教程:从60分钟入门开始,跟着敲完基础示例。
  3. 数据加载与增强:学习torchvision.transforms的常见操作。
  4. 经典模型复现:尝试自己实现一个简单的卷积神经网络,在公开数据集上跑通完整的训练和评估流程。
  5. 项目实践:选一个小型数据集,从数据清洗到模型部署完整走一遍。

Python 在深度学习中的作用是“连接想法和实现”。你不需要成为 Python 专家,但需要把最核心的语法、数据操作和类与对象机制练熟。把本文的代码逐行敲一遍,弄懂每一行的含义,再去看 PyTorch 官方示例会轻松很多。遇到报错时,先定位是 Python 层面、数据层面还是框架层面的问题,按这个思路排查,你的工程能力会提升得很快。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询