
先说结论Python 不用全部学完再进深度学习掌握变量、容器、循环、函数、类、文件操作和 NumPy 这些核心内容就可以开始跑 PyTorch 代码了。很多初学者把 Python 当成一门“要啃完语法书”的语言结果在环境安装和语法细节里消耗了几个星期最后连一个神经网络都没跑起来。这其实是学习路径出了问题。这篇博客就是为深度学习零基础读者准备的 Python 速通指南。目标很明确用最少的时间把深度学习代码里最常见的 Python 写法讲清楚并且现场示范从环境搭建到训练一个简单模型的完整过程。文章会覆盖 Python 安装、conda 虚拟环境、NumPy 数据操作、PyTorch 张量和训练循环最后用一个小项目把整个流程串起来。如果你是下面这类读者这篇文章可以直接收藏想入门深度学习但没系统学过 Python装好了 Python 却不知道下一步干什么看 PyTorch 官方教程时被torch.no_grad()、reshape、backward()这些写法卡住或者想用自己的电脑跑通第一个小模型但不确定环境怎么配。以下是正文。1. 核心能力速览能力项说明面向人群深度学习零基础、Python 零基础或基础薄弱者核心内容Python 变量、容器、流程控制、函数、类、文件操作、NumPy 数据操作、PyTorch 训练循环环境要求操作系统 Windows / Linux / macOS 均可CPU 电脑也能完成入门有 NVIDIA 显卡可体验 GPU 加速需要安装Python 3.10、Miniconda可选、VSCode 或 PyCharm、PyTorch学习节奏7 到 14 天即可进入深度学习实战最终产出用 PyTorch 训练一个简单分类/回归模型并学会批量处理数据不包含内容Python 高级特性、爬虫、Web 开发、Qt 界面、算法竞赛级优化适合后续学习深度学习理论、CNN/RNN/Transformer、模型部署、批量图像处理这里先说清楚一个边界这篇博客不讲深度学习理论只解决“代码能不能写出来”的问题。理论可以后面结合课程补但代码手感必须先行。2. 深度学习入门为什么先补 Python深度学习生态里Python 是绝对的主语言。PyTorch、TensorFlow、Hugging Face Transformers、Diffusers 这些主流工具的首选接口都是 Python。你后面要学图像分类、目标检测、语音识别、大模型微调几乎都要从 Python 代码开始。但要注意深度学习中用到的 Python 只占 Python 全部语法的一小部分。实际项目里高频出现的是这些变量和基础数据类型int、float、str、bool容器list、tuple、dict、set流程控制if、for、while函数定义与调用类与对象的基础用法文件读取与保存第三方库导入import numpy as np、import torch列表推导式、enumerate、zip这类常用技巧很多 Python 教程会花大量篇幅讲装饰器、生成器、元类、并发编程这些对深度学习入门来说不是最紧急的。我不是说它们不重要而是说初学者不应该被这些高级概念挡住去路。先把最常用的 20% 语法练熟能读能写然后立刻进入 NumPy 和 PyTorch在实战中补漏效率会高很多。下面按“环境准备 - 基础语法 - NumPy - PyTorch - 实战项目”的顺序拆开讲。3. Python 开发环境准备3.1 安装 Python深度学习入门阶段建议直接安装 Python 3.10 或更高版本。去 Python 官网下载对应系统的安装包即可也可以使用 Anaconda 或 Miniconda 统一管理。在 Windows 上安装时有一个关键步骤安装界面底部记得勾选Add Python to PATH否则后面在命令行运行python会提示找不到命令。很多初学者第一次卡住就是这里。安装完成后打开命令行Windows 上是 CMD 或 PowerShellmacOS/Linux 上是 Terminal运行python --version如果输出类似Python 3.12.x说明安装成功。如果提示找不到命令先检查 PATH 环境变量或者重新运行安装包并勾选 Add to PATH。3.2 使用 conda 管理虚拟环境深度学习项目依赖版本经常冲突比如项目 A 需要 PyTorch 2.x项目 B 可能锁定在 PyTorch 1.13。用 conda 为每个项目创建独立虚拟环境是最稳妥的做法。推荐安装 Miniconda体积比 Anaconda 小很多。安装后在命令行创建新环境conda create -n dl python3.10创建完成后激活环境conda activate dl之后安装的所有 Python 包都会进入这个环境不会污染系统 Python。命令行前面的(dl)提示符表明当前在dl环境中。这里补充一个常见问题国内访问 conda 默认源可能很慢可以配置国内镜像源。但镜像源地址后续可能变化建议以 conda 官方文档或你所在地区可用的稳定源为准安装失败时优先看报错内容不要盲目更换源。3.3 安装 PyTorchPyTorch 是深度学习入门最友好的框架之一。CPU 版本安装很简单pip install torch torchvision如果电脑有 NVIDIA 显卡想用 GPU 加速需要先安装与显卡驱动匹配的 CUDA 版本。具体怎么配要看你机器上的 NVIDIA 驱动版本建议去 PyTorch 官网首页通过版本选择器生成对应安装命令。你可以先安装 CPU 版本跑通流程之后再考虑 GPU 加速。GPU 环境验证代码import torch # 输出 PyTorch 版本 print(torch.__version__) # 查看 CUDA 是否可用 print(torch.cuda.is_available()) # 查看 GPU 数量 print(torch.cuda.device_count())最后一步的torch.cuda.is_available()如果输出True说明 GPU 可用输出False不代表代码不能跑只是会走 CPU 推理。3.4 安装 IDE 或编辑器新手推荐 VSCode免费、插件多、调试方便。也可以选 PyCharm Community 版或者直接使用 Jupyter Notebook / Jupyter Lab适合做实验和画图展示。VSCode 装好后装 Python 扩展即可。写代码时先新建.py文件然后选择 Python 解释器为dl环境里的那个。否则可能出现“命令行能运行但编辑器里报错导入失败”的问题。4. Python 基础语法速通这一节把深度学习中最高频的 Python 语法过一遍。建议每段代码都在自己电脑上敲一遍不要只看。4.1 变量与数据类型Python 不需要声明变量类型直接赋值即可。# 数值类型 epochs 10 learning_rate 0.001 loss 1.2345 # 字符串 model_name resnet18 # 布尔值 use_gpu True print(epochs, learning_rate, loss, model_name, use_gpu)这里几个变量名是刻意选的。epochs、learning_rate是深度学习代码里的常见参数写多了以后你会非常眼熟。4.2 列表和字典list和dict是最常用的两个容器。列表用方括号字典用花括号。# 列表有序、可重复 batch_sizes [16, 32, 64, 128] first batch_sizes[0] # 从 0 开始索引 last batch_sizes[-1] # 负索引从末尾取 # 遍历列表 for bs in batch_sizes: print(bs) # 字典键值对 config { model: resnet18, batch_size: 32, lr: 0.001, epochs: 10 } # 取值 print(config[model]) # 遍历字典项 for key, value in config.items(): print(key, value)深度学习代码里字典经常用来存配置参数。你后面会看到很多config {...}这样的写法config[batch_size]就是在取配置项。4.3 流程控制if和for是最常用的。# if 判断 gpu_count 1 if gpu_count 0: print(使用 GPU 训练) elif gpu_count 0: print(使用 CPU 训练) else: print(GPU 数量异常) # for 循环 range for epoch in range(5): print(epoch:, epoch) # enumerate同时取索引和值 classes [cat, dog, bird] for idx, cls_name in enumerate(classes): print(idx, cls_name)enumerate在深度学习训练代码里很常见因为经常要同时知道“这是第几个 batch”和“这个 batch 的数据”。range(5)生成 0 到 4 的整数序列是控制轮数的标准写法。4.4 函数定义函数是组织代码的基本单元。深度学习代码里数据加载、模型创建、训练函数、评估函数经常被拆成一个个def。def train_one_epoch(model, data_loader, optimizer, epoch): 模拟一个训练轮次的函数 total_loss 0.0 for batch_idx, (inputs, labels) in enumerate(data_loader): # 这里只做示例实际训练在后面章节展开 total_loss 0.1 return total_loss def compute_accuracy(preds, targets): correct (preds targets).sum().item() total targets.size(0) return correct / total注意 Python 函数用缩进表示代码块不要混用空格和 Tab。def后面需要缩进 4 个空格。4.5 类与对象PyTorch 中定义模型基本都用类。所以类的语法必须会一点。class SimpleModel: def __init__(self, in_features, out_features): self.in_features in_features self.out_features out_features # 实际会在这里初始化神经网络层 def forward(self, x): # 前向传播逻辑 return x__init__是构造函数在创建对象时自动调用。self表示实例本身。后面写 PyTorch 模型时你看到的class MyModel(nn.Module)就是这种写法的升级版。4.6 文件操作读取文件、保存文件是数据处理的日常操作。# 读取文本文件 with open(config.txt, r, encodingutf-8) as f: content f.read() print(content) # 写入文本文件 with open(output.txt, w, encodingutf-8) as f: f.write(hello deep learning)with open(...)写法会在代码块结束后自动关闭文件不需要手动f.close()。这个写法几乎在所有的数据处理脚本里都会出现。4.7 列表推导式列表推导式写法简洁能替代很多for循环。# 普通写法 squares [] for i in range(10): squares.append(i * i) # 列表推导式 squares [i * i for i in range(10)] # 带条件的列表推导式 even_squares [i * i for i in range(10) if i % 2 0]在读别人的代码时列表推导式出现频率相当高建议直接背下这个写法。5. NumPy深度学习中的数据操作基础进入深度学习前先花一个下午熟悉 NumPy。PyTorch 的张量Tensor操作和 NumPy 非常相似学完 NumPy再切换到 PyTorch 会非常顺。5.1 NumPy 数组创建import numpy as np # 一维数组 a np.array([1, 2, 3, 4]) # 二维数组矩阵 b np.array([[1, 2], [3, 4]]) # 全零数组 zeros np.zeros((2, 3)) # 全一数组 ones np.ones((2, 3)) # 随机数组 random_arr np.random.randn(3, 4) # 等差数组 range_arr np.arange(0, 1, 0.1) print(a.shape, b.shape, random_arr.shape).shape属性是 NumPy 和 PyTorch 里最常用的属性之一用来查看张量维度。比如(32, 3, 224, 224)表示 batch size 为 32、3 通道、高宽都是 224 的图像数据。5.2 数组形状操作深度学习代码里reshape和transpose是高频操作。x np.arange(12) print(x.shape) # (12,) # 变成 3 行 4 列 x_reshaped x.reshape(3, 4) # 展平为一维 x_flat x_reshaped.flatten() # 转置 x_T x_reshaped.T # 增加一个维度 x_expanded np.expand_dims(x_reshaped, axis0) print(x_expanded.shape) # (1, 3, 4)图像数据在送入神经网络前经常要做形状调整比如把(H, W)变成(C, H, W)或者把一批图片堆叠成四维张量。5.3 数组索引与切片arr np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) # 取第一行 print(arr[0, :]) # 取第一列 print(arr[:, 0]) # 取左上角 2x2 子矩阵 print(arr[:2, :2]) # 布尔索引 mask arr 5 print(arr[mask])布尔索引在做数据筛选时很有用比如过滤掉异常值、抽取特定类别的样本。5.4 数组运算与广播a np.array([1, 2, 3]) b np.array([4, 5, 6]) # 逐元素运算 add a b mul a * b # 矩阵乘法 m1 np.array([[1, 2], [3, 4]]) m2 np.array([[5, 6], [7, 8]]) matmul m1 m2 # 或者 np.dot(m1, m2) # 广播机制 base np.array([1, 2, 3]) bias 1.0 result base bias # 每个元素加 1广播是 NumPy 和 PyTorch 中一个容易误解但非常重要的机制。简单说形状不同的数组在满足一定条件时可以做运算标量加数组、一维数组加二维数组都属于这个范畴。5.5 数据归一化在训练模型之前数据通常需要归一化。图像数据通常需要将像素值从[0, 255]缩放到[0, 1]或更小的范围。image_data np.random.randint(0, 256, (224, 224, 3), dtypenp.uint8) # 转 float 并归一化到 [0, 1] image_float image_data.astype(np.float32) / 255.0 # 计算均值和标准差 mean image_float.mean(axis(0, 1)) std image_float.std(axis(0, 1)) print(mean:, mean) print(std:, std)这种写法在准备数据集时非常常见。astype(np.float32)是为了后续送入 GPU 计算时避免数据类型不匹配。6. PyTorch 快速上手从张量到训练循环PyTorch 的核心是张量Tensor可以理解成支持 GPU 加速、自动求导的 NumPy 数组。这一节用一个简单示例把训练流程串起来。6.1 张量创建与 NumPy 互转import torch import numpy as np # 从列表创建张量 a torch.tensor([1.0, 2.0, 3.0]) # 从 NumPy 数组创建张量 np_arr np.array([[1, 2], [3, 4]]) tensor_from_np torch.from_numpy(np_arr) # 张量转 NumPy tensor torch.ones(2, 3) numpy_arr tensor.numpy() # 查看形状和数据类型 print(tensor.shape) print(tensor.dtype)注意PyTorch 张量和 NumPy 数组共享底层内存某些情况下修改一个会影响另一个。转换时多留意。6.2requires_grad与自动求导深度学习训练靠的是反向传播核心就是自动求导。PyTorch 用requires_gradTrue标记需要计算梯度的张量。# 需要计算梯度的标量 x torch.tensor(3.0, requires_gradTrue) # 定义一个函数 y x^2 2x 1 y x ** 2 2 * x 1 # 反向传播 y.backward() # 查看 x 的梯度dy/dx 2x 2在 x3 时是 8 print(x.grad)x.grad会输出tensor(8.)。这就是 PyTorch 自动求导的入门体验。在真正的训练中模型的参数都会设置requires_gradTrue然后调用loss.backward()计算梯度再用优化器更新参数。6.3 用nn.Module定义模型实际开发中不会手动写反向传播而是用torch.nn模块。模型类继承nn.Module在__init__里定义层在forward里定义前向计算。import torch.nn as nn class SimpleNN(nn.Module): def __init__(self, in_features, hidden_features, out_features): super().__init__() self.fc1 nn.Linear(in_features, hidden_features) self.fc2 nn.Linear(hidden_features, out_features) self.relu nn.ReLU() def forward(self, x): x self.fc1(x) x self.relu(x) x self.fc2(x) return x这个示例是一个两层全连接网络输入层到隐藏层ReLU 激活隐藏层到输出层。nn.Linear就是全连接层nn.ReLU是激活函数。6.4 一个完整的训练循环下面用随机数据训练上面的模型体验一次完整的“前向传播 - 计算损失 - 反向传播 - 更新参数”流程。import torch import torch.nn as nn import torch.optim as optim # 固定随机种子便于复现 torch.manual_seed(42) # 随机生成 1000 个样本每个样本 20 维特征 X torch.randn(1000, 20) # 随机生成标签二分类 y torch.randint(0, 2, (1000, 1)).float() # 创建模型 model SimpleNN(in_features20, hidden_features32, out_features1) # 损失函数和优化器 criterion nn.BCEWithLogitsLoss() optimizer optim.Adam(model.parameters(), lr0.001) # 训练 20 轮 for epoch in range(20): # 前向传播 logits model(X) loss criterion(logits, y) # 梯度清零 optimizer.zero_grad() # 反向传播 loss.backward() # 更新参数 optimizer.step() if (epoch 1) % 5 0: print(fepoch {epoch 1}, loss: {loss.item():.4f})运行后你会看到 loss 逐渐下降。optimizer.zero_grad()这一步新手经常忘记它的作用是清空上一次反向传播留下的梯度如果不调用梯度会累积。6.5 使用 DataLoader 批量加载数据真实项目里数据量很大不会一次性把全部数据喂给模型而是用批量batch的方式。DataLoader是 PyTorch 的标准工具。from torch.utils.data import DataLoader, TensorDataset # 模拟数据 X torch.randn(1000, 20) y torch.randint(0, 2, (1000, 1)).float() # 封装成 Dataset dataset TensorDataset(X, y) # 创建 DataLoaderbatch_size64打乱顺序 loader DataLoader(dataset, batch_size64, shuffleTrue) for batch_idx, (batch_x, batch_y) in enumerate(loader): print(batch_idx, batch_x.shape, batch_y.shape) break输出会显示第一个 batch 的形状是(64, 20)也就是 64 个样本每个样本 20 维特征。shuffleTrue会在每个 epoch 开始前打乱数据顺序防止模型学到样本排列顺序。7. 小项目实战批量处理图像数据并训练分类模型这一节把前面的知识点串成一个完整小项目批量读取文件夹里的图像、做归一化、构建一个简单分类模型、训练并输出准确率。这里用模拟数据演示流程真实项目里换成自己的图片路径即可。7.1 项目目录结构建议项目目录这样组织dl_practice/ ├── data/ │ ├── cat/ │ │ ├── cat_001.jpg │ │ └── cat_002.jpg │ └── dog/ │ ├── dog_001.jpg │ └── dog_002.jpg ├── train.py ├── dataset.py └── requirements.txt把代码、数据、输出分开后续管理会轻松很多。7.2 批量读取图像并归一化下面的代码模拟批量读取一个文件夹下所有图片并统一缩放到相同尺寸。实际读取图片需要Pillow库可以用pip install pillow安装。import os from PIL import Image import numpy as np def load_images_from_folder(folder_path, target_size(64, 64)): images [] filenames [] for filename in os.listdir(folder_path): if filename.lower().endswith((.jpg, .jpeg, .png)): filepath os.path.join(folder_path, filename) try: img Image.open(filepath).convert(RGB) img img.resize(target_size) img_array np.array(img, dtypenp.float32) / 255.0 images.append(img_array) filenames.append(filename) except Exception as e: print(f读取失败: {filepath}, 错误: {e}) return np.stack(images), filenamesnp.stack会把列表里的多个数组堆叠成一个四维数组形状是(图片数量, 64, 64, 3)。7.3 批量读取并转换标签假设你的目录结构是data/cat/和data/dog/每个子目录名就是类别名。def build_dataset(data_root, target_size(64, 64)): class_names sorted(os.listdir(data_root)) class_to_idx {name: idx for idx, name in enumerate(class_names)} X_list [] y_list [] for class_name in class_names: class_dir os.path.join(data_root, class_name) if not os.path.isdir(class_dir): continue images, _ load_images_from_folder(class_dir, target_size) num_samples images.shape[0] labels [class_to_idx[class_name]] * num_samples X_list.append(images) y_list.extend(labels) X np.concatenate(X_list, axis0) y np.array(y_list) return X, y, class_names, class_to_idx这段代码把两个类别的图片都读取出来拼接成完整数据集。np.concatenate用来在已有维度上拼接数组。7.4 定义模型并训练图像数据是三维的(64, 64, 3)进入全连接网络前要先展平成一维。import torch import torch.nn as nn import torch.optim as optim class ImageClassifier(nn.Module): def __init__(self, in_features, num_classes): super().__init__() self.net nn.Sequential( nn.Linear(in_features, 128), nn.ReLU(), nn.Linear(128, 64), nn.ReLU(), nn.Linear(64, num_classes) ) def forward(self, x): return self.net(x)训练过程复用之前的模式。这里用CrossEntropyLoss是分类任务最常见的损失函数。# 假设 X 是 (N, 64, 64, 3)y 是 (N,) N X.shape[0] X_flat X.reshape(N, -1) # 展平成 (N, 64*64*3) # 转成 PyTorch 张量 X_tensor torch.tensor(X_flat, dtypetorch.float32) y_tensor torch.tensor(y, dtypetorch.long) # 创建 DataLoader dataset TensorDataset(X_tensor, y_tensor) loader DataLoader(dataset, batch_size32, shuffleTrue) # 模型、损失、优化器 model ImageClassifier(in_features64 * 64 * 3, num_classeslen(class_names)) criterion nn.CrossEntropyLoss() optimizer optim.Adam(model.parameters(), lr0.001) # 训练 for epoch in range(10): total_loss 0.0 for batch_x, batch_y in loader: optimizer.zero_grad() outputs model(batch_x) loss criterion(outputs, batch_y) loss.backward() optimizer.step() total_loss loss.item() avg_loss total_loss / len(loader) print(fepoch {epoch 1}, loss: {avg_loss:.4f})如果你在自己的真实图片上运行需要确保图片数量够多否则模型很难收敛。这个示例的主要目的是跑通流程验证数据批量读取、模型构建、训练循环可以串联起来。7.5 保存与加载模型训练结束后把模型权重保存到磁盘后续可以直接加载。# 保存模型权重 torch.save(model.state_dict(), model_weights.pth) # 加载模型权重 model ImageClassifier(in_features64 * 64 * 3, num_classeslen(class_names)) model.load_state_dict(torch.load(model_weights.pth)) model.eval()model.eval()是切换为评估模式。推理时建议加上这个调用因为某些层如 Dropout、BatchNorm在训练和评估时行为不同。8. 常见问题与排查方法问题现象可能原因排查方式解决方案安装 PyTorch 时下载缓慢网络问题或默认源慢查看 pip 下载日志使用国内可靠镜像源或采用离线安装包torch.cuda.is_available()返回 FalseCUDA 版本不匹配、驱动未安装、PyTorch 是 CPU 版查看nvidia-smi输出和 PyTorch 版本按官网命令重新安装匹配的 PyTorch运行报错ModuleNotFoundError: No module named torch当前环境没装 PyTorch 或解释器选错在命令行conda activate dl后检查pip list确认编辑器选择的解释器是 conda 的dl环境报错RuntimeError: shape mismatch维度对不上比如把二维数据送进三维要求的数据打印tensor.shape逐层检查用reshape、view、transpose调整维度图片读取慢数据量大、未批量化查看读取耗时使用 DataLoader 批量读取必要时增加num_workers训练时显存不足batch size 过大或分辨率过高观察报错CUDA out of memory减小 batch size降低分辨率或使用梯度累积模型 loss 一直不下降学习率不合适、数据未归一化、模型结构有误先在小数据上过拟合测试调低学习率、检查数据范围、简化模型结构加载离线包时提示找不到本地源缺依赖或缓存路径不对查看完整报错堆栈用pip install 包名先装缺的依赖这里单独说一个很常见的问题ModuleNotFoundError。很多初学者在 VSCode 里运行代码结果import torch报错但命令行里又能运行。原因是编辑器选择的 Python 解释器和命令行激活的环境不是同一个。解决办法是VSCode 里按CtrlShiftP选择 “Python: Select Interpreter”然后选中dl环境。9. 最佳实践与学习建议9.1 先跑通再深入第一次接触深度学习代码不要纠结每个函数的所有参数。先跑通一个最简单的示例知道损失值在下降模型在更新然后再看细节。这个“跑通一次”的正反馈比看十遍教程都有效。9.2 用小数据集做调试写训练脚本时先拿少量样本跑一个 epoch确认流程没有报错再用完整数据训练。这样可以大幅减少调试时间。比如可以在TensorDataset里只取前 32 个样本跑通后再换成全部数据。9.3 固定随机种子训练结果不稳定时先检查是否设置了随机种子。在代码开头加import random import numpy as np import torch random.seed(42) np.random.seed(42) torch.manual_seed(42) torch.cuda.manual_seed_all(42)这样可以保证每次运行结果一致方便排查问题。9.4 代码目录规划即使只是一个入门项目也建议按功能拆文件dl_practice/ ├── config.py # 超参数配置 ├── dataset.py # 数据加载与预处理 ├── model.py # 模型定义 ├── train.py # 训练脚本 ├── inference.py # 推理脚本 └── requirements.txt # 依赖清单这样后面扩展功能时不用在一个文件里反复翻滚。requirements.txt可以用pip freeze requirements.txt生成。9.5 善用 Python 官方文档和社区遇到不认识的函数先用help()查看import torch help(torch.reshape)或者直接查看官方文档。PyTorch 官方教程里的 60 分钟入门和中文文档都比较友好建议作为配套材料。9.6 关于版权和数据合规如果后续用真实图片、人脸照片、音频数据训练模型需要确认数据来源合法并且用途符合授权范围。涉及隐私数据时本地处理比在线服务更可控但仍需遵守相关法律法规和平台规定。不要收集未经授权的个人数据用于训练或发布。10. 总结与下一步这篇博客从环境准备开始一路写到 Python 基础语法、NumPy 数据操作、PyTorch 张量和训练循环最后用一个小项目把批量读取数据、训练、保存模型的完整流程串了起来。最值得记住的核心是深度学习入门不需要学完 Python 所有语法先把列表、字典、循环、函数、类这五样用熟然后直接进入 PyTorch 实战在写代码的过程中查漏补缺学习效率最高。下一步建议按这个路径走先把本文第 4 节的 Python 语法全部敲一遍确保没有报错。再对照第 5 节的 NumPy 示例练习数组创建、形状修改、归一化。然后用第 6 节的训练循环在随机数据上跑通模型。最后把第 7 节的小项目换成自己的数据尝试调整参数。最容易踩的坑是环境问题尤其是 Python 解释器选错、PyTorch 版本和 CUDA 版本不匹配。环境配置好后后面的代码学习会顺畅很多。后续可以继续扩展的方向用卷积神经网络CNN替换全连接网络处理图像用torchvision.datasets加载 MNIST、CIFAR-10 等公开数据集学习模型保存与部署把训练好的模型导出为可调用的接口服务。如果你走到了模型部署和批量推理的阶段这篇文章里提到的 Python 基本功和数据批量处理思路仍然会是你的起点。