
如果你现在准备进入 AI 方向或者在 2026 年这个节点想把研究、项目和求职往前推一步第一个要拍板的问题大概率是学 PyTorch 还是 TensorFlow先说结论从论文开源率、模型生态、招聘 JD 和科研协作的整体趋势来看PyTorch 是目前 AI 领域的默认主场TensorFlow 仍然在存量系统、移动端和部分工业场景里大量存在但新项目选择它的比例明显下降。这篇文章会围绕“2026 年到底怎么选”展开给你一套可以照抄的 PyTorch 三小时极速入门路线同时把转 AI、搞科研、进大厂三种职业路径下的框架权重讲清楚。本文不是空谈对比。你会看到 2026 年实际选型逻辑、环境搭建步骤、张量和自动求导代码、完整训练循环、迁移学习小项目、显存与训练速度观察方法以及这三年最常见的问题排查清单。无论你是刚转行的新手还是需要快速复现论文的研究生都可以按这个顺序走一遍。1. PyTorch 还是 TensorFlow2026 年的选择逻辑先看两个框架现在的真实状态。PyTorch 在深度学习研究、CV、NLP、大模型微调领域占据明显主导地位。大部分开源模型、学术论文代码、Hugging Face 生态里的 Transformer 实现第一优先写的是 PyTorch。大模型相关的 LoRA、DeepSpeed、vLLM、SFT 脚本也几乎全部围绕 PyTorch 展开。对于“跟着论文复现一个模型”选 PyTorch 的阻力最小。TensorFlow 并没有消失。TensorFlow 2.18 仍然在持续更新Keras 生态在工业界有大量积累TensorFlow Lite、TensorFlow Serving、TPU 支持等能力在某些生产场景里仍是优势。如果你所在的公司已经有成熟的 TensorFlow 在线推理链路或者你要做的是移动端/嵌入式部署TensorFlow 依然是加分项。从学习成本来看如果你从零开始目标是快速进入学术界或新模型开发直接学 PyTorch。如果你要接手老的工业系统或者面试的岗位明确要求 TensorFlow再补 TensorFlow。如果两边都是零基础不建议同时学。先精通 PyTorch再花三天理解 TensorFlow/Keras 的基本 API 差异是性价比最高的路径。下表是两种框架在 2026 年常见选型维度上的对比对比维度PyTorchTensorFlow学术研究与论文复现绝对主流开源代码占比高较少见到新论文使用大模型生态Hugging Face、LoRA、DeepSpeed 默认支持支持度相对分散工业部署TorchServe、ONNX、TensorRT 路径成熟TensorFlow Serving、TFLite 很成熟移动端/嵌入式有 TorchScript 和 ExecuTorch生态扩张中TF Lite 历史积累更深学习曲线命令式风格Python 写起来直觉Keras 封装很友好但 Debug 链路不如 PyTorch 直观新项目维护成本社区活跃问题容易搜到新案例少踩坑后资料相对难找整体建议是2026 年以 PyTorch 为主线TensorFlow 作为第二技能按岗位需求补充。2. PyTorch 核心能力速览在开始安装之前先建立对 PyTorch 的整体认知。PyTorch 不只是一个深度学习框架它提供的是一整套“从模型研究到部署”的工具链。能力项说明核心生态torch、torchvision、torchaudio、torchtext 覆盖 CV、语音、文本主场景自动求导通过 autograd 机制自动计算梯度训练循环主要靠它动态图命令式编程print、if、for 能直接在张量计算流程里使用调试方便Dataset/DataLoader数据加载、打乱、并行读取的标准接口训练工具原生支持分布式训练、混合精度、模型保存与断点续训模型导出支持 ONNX 导出便于接 TensorRT 或业务系统预训练模型torchvision 和 Hugging Face 生态提供大量可直接用的权重硬件兼容支持 NVIDIA CUDA、AMD ROCm、Apple Silicon MPS也支持纯 CPU 训练部署方式API 服务、TorchServe、ONNX Runtime、TensorRT 等表格里没有写死显存占用因为显存取决于模型大小、batch size、输入分辨率和训练方式后面会单独给出观察方法和控制思路。3. 三小时入门路线规划很多人卡在“学深度学习框架”这一步不是因为难而是因为不知道从哪块开始。三小时不是让你把 PyTorch 官方文档全部啃完而是跑通一条最核心的链路张量操作、自动求导、数据加载、训练循环、模型保存与加载。建议按这个节奏来时间段学习内容产出第 1 小时环境安装 张量 自动求导能在 GPU/CPU 上跑张量运算和 backward第 2 小时Dataset/DataLoader 自定义训练循环能训练一个简单模型并观察 loss 下降第 3 小时迁移学习 模型保存加载能微调 resnet18 并保存模型这套路线不需要先读完整本教材每个阶段都有可运行代码跑通了再往后走。如果中间报错直接看第 10 节的排查清单。4. 环境准备与安装部署4.1 前置条件检查在安装之前先确认本机环境操作系统Windows、Linux、macOS 都可以。Python 版本推荐 3.9 到 3.12具体以 PyTorch 官网对应版本为准。显卡与驱动如果你是 NVIDIA 显卡先运行nvidia-smi看驱动支持的 CUDA 版本。磁盘空间PyTorch 本体加 torchvision 大约需要几个 GB预训练模型还会额外占用空间。显存入门阶段 CPU 也能跑但如果要用 GPU 训练建议至少 6G 以上显存体验更好具体以实际模型为准。检查显卡驱动的命令nvidia-smi如果没有输出说明驱动没装好或者当前设备是纯 CPU 环境。入门阶段可以先在 CPU 上把代码逻辑跑通再处理 GPU 加速。4.2 创建虚拟环境强烈建议使用 conda 或者 venv 建立独立环境避免和系统 Python 包相互污染。下面的命令以 conda 为例conda create -n pytorch-learn python3.10 -y conda activate pytorch-learn如果你没有 conda也可以直接用 Python 自带的虚拟环境python -m venv pytorch-learn # Windows pytorch-learn\Scripts\activate # macOS / Linux source pytorch-learn/bin/activate4.3 安装 PyTorchGPU 版本的安装命令不建议手敲因为 CUDA 版本和显卡驱动相关。最稳妥的方式是打开 PyTorch 官网的安装向导选择操作系统、包管理器、CUDA 版本网站会生成一行准确的安装命令。CPU 版验证环境可以直接安装pip install torch torchvision torchaudio安装完成后用下面的代码验证import torch print(torch.__version__) print(CUDA available:, torch.cuda.is_available()) print(Device count:, torch.cuda.device_count())如果你的机器装了 NVIDIA 驱动但torch.cuda.is_available()返回False大概率是安装命令里的 CUDA 版本和驱动不匹配回到官网重新生成安装命令即可。4.4 如果需要同一环境跑 TensorFlow有些读者可能同时要看 TensorFlow 项目可以在同一个 conda 环境里安装pip install tensorflow2.18.*TensorFlow 2.18 是目前比较新的稳定版本线。注意PyTorch 和 TensorFlow 安装在同一个环境里有可能出现 protobuf 版本冲突如果遇到这种情况建议用两个独立环境分别维护。4.5 Jetson 等嵌入式设备注意如果你是在 Jetson 设备上安装 PyTorch不要直接pip install torch因为 NVIDIA Jetson 的 JetPack 版本和 PyTorch 版本有严格对应关系。比如 JetPack 6.2.2 下需要安装 NVIDIA 提供的预编译 PyTorch 包。直接去 PyTorch 官网或 NVIDIA 官方论坛查对应版本否则会出现编译失败或版本不兼容的问题。5. 第 1 小时张量与自动求导PyTorch 的基础是torch.Tensor。你可以把张量理解成 GPU 或 CPU 上的多维数组它既支持 NumPy 风格的运算又支持自动求导。5.1 创建张量import torch # 从列表创建 x torch.tensor([[1.0, 2.0], [3.0, 4.0]]) # 常见初始化 zeros torch.zeros(2, 3) ones torch.ones(2, 2) rand torch.randn(3, 3) # 张量属性 print(x.shape) print(x.dtype) print(x.device)输出里会看到torch.Size([2, 2])、torch.float32、cpu这些信息。device 是 CPU 还是 GPU 会直接影响后续训练速度。5.2 张量运算a torch.tensor([1.0, 2.0]) b torch.tensor([3.0, 4.0]) print(a b) print(a - b) print(a * b) print(a b) # 内积PyTorch 的运算规则和 NumPy 很接近所以如果你有过 NumPy 经验上手会非常快。5.3 自动求导自动求导是 PyTorch 的核心能力。一个标量运算从创建到反向传播链条是这样的x torch.tensor(2.0, requires_gradTrue) y x ** 2 3 * x 1 # y 对 x 求导 y.backward() print(x.grad) # 2*x 3 7对于表达式y x^2 3x 1当x 2时导数是2 * 2 3 7。PyTorch 通过backward()自动把梯度算出来存在x.grad里。这个机制是整个训练循环的基础也是 PyTorch 和 NumPy 最大的区别你不需要手写求导公式和反向传播过程。5.4 GPU 迁移在深度学习中模型和批次数据都要放到 GPU 上计算。迁移代码非常简单if torch.cuda.is_available(): x x.cuda() print(x.device)在 macOS 上部分新版本 PyTorch 支持 MPS 后端if torch.backends.mps.is_available(): x x.to(mps)入门阶段不需要把每个张量都手动迁移后面会统一用device变量控制。6. 第 2 小时Dataset 与训练循环第二个小时的核心是把数据加载和模型训练串起来。6.1 自定义 Dataset深度学习中数据通常来自图片、文本、表格不可能一次性全读到内存里。PyTorch 用Dataset定义数据池用DataLoader按批次加载数据。from torch.utils.data import Dataset, DataLoader import torch class MyDataset(Dataset): def __init__(self, size100): self.size size def __len__(self): return self.size def __getitem__(self, idx): x torch.randn(2) y torch.tensor([1.0]) return x, y dataset MyDataset(100) loader DataLoader(dataset, batch_size16, shuffleTrue) for batch_x, batch_y in loader: print(batch_x.shape, batch_y.shape) break__len__返回数据总量__getitem__根据索引返回一条样本。DataLoader会自动完成分批、打乱、并行读取。6.2 定义一个简单模型用nn.Module定义模型是所有 PyTorch 模型的基本写法import torch.nn as nn class SimpleNet(nn.Module): def __init__(self): super().__init__() self.fc nn.Linear(2, 1) def forward(self, x): return self.fc(x) model SimpleNet() print(model)6.3 完整训练循环训练一个模型的核心步骤只有五步前向传播、计算 loss、梯度清零、反向传播、更新参数。import torch.optim as optim device torch.device(cuda if torch.cuda.is_available() else cpu) model SimpleNet().to(device) criterion nn.MSELoss() optimizer optim.SGD(model.parameters(), lr0.01) for epoch in range(10): for batch_x, batch_y in loader: batch_x batch_x.to(device) batch_y batch_y.to(device) pred model(batch_x) loss criterion(pred, batch_y) optimizer.zero_grad() loss.backward() optimizer.step() print(fepoch {epoch 1}, loss: {loss.item():.4f})注意optimizer.zero_grad()不能漏。如果漏了梯度会累加训练过程会不稳定。6.4 判断训练是否成功跑完上面的代码loss 应该在逐步下降。如果 loss 不下降优先检查学习率是否太大或太小。数据是否经过了归一化。模型输出的尺寸和标签是否一致。device 是否统一有没有一部分数据在 CPU、一部分在 GPU。这个阶段的核心目标是理解流程不是追求精度。7. 第 3 小时迁移学习实战第三小时做一件真实能用的任务用预训练的 resnet18 做图像分类微调。迁移学习的好处是不需要从零训练一个超大模型显存占用低收敛快能在短时间内看到效果。7.1 加载预训练模型并替换分类头import torch.nn as nn from torchvision import models model models.resnet18(weightsmodels.ResNet18_Weights.IMAGENET1K_V1) # 查看原来的全连接层输入维度 num_ftrs model.fc.in_features # 替换成 10 类分类头 model.fc nn.Linear(num_ftrs, 10) print(model)7.2 冻结特征层只训练分类头入门阶段可以先只训练最后一层速度很快也能避免显存不足for param in model.parameters(): param.requires_grad False for param in model.fc.parameters(): param.requires_grad True7.3 准备数据与训练假设你已经准备好一个train_loader每个 batch 是(images, labels)尺寸为(batch_size, 3, 224, 224)和(batch_size, )。import torch import torch.optim as optim device torch.device(cuda if torch.cuda.is_available() else cpu) model model.to(device) criterion nn.CrossEntropyLoss() optimizer optim.Adam(model.fc.parameters(), lr1e-3) for epoch in range(3): for images, labels in train_loader: images images.to(device) labels labels.to(device) outputs model(images) loss criterion(outputs, labels) optimizer.zero_grad() loss.backward() optimizer.step() print(fepoch {epoch 1}, loss: {loss.item():.4f})如果你的数据不是 224x224 的图需要先加一个 transform 预处理例如from torchvision import transforms transform transforms.Compose([ transforms.Resize((224, 224)), transforms.ToTensor(), transforms.Normalize(mean[0.485, 0.456, 0.406], std[0.229, 0.224, 0.225]) ])迁移学习是 PyTorch 里性价比最高的一类任务很多真实项目的起点都是“预训练模型 替换分类头 微调”。7.4 保存与加载模型训练结束后保存权重torch.save(model.state_dict(), resnet18_finetuned.pth)加载权重model.load_state_dict(torch.load(resnet18_finetuned.pth, weights_onlyTrue))注意一个版本问题PyTorch 2.6 开始torch.load默认把weights_only参数设为True。如果你加载的是一个老 checkpoint可能会遇到反序列化报错。对于自己训练的模型加载时可以显式传weights_onlyFalse但前提是你确认 checkpoint 来源可信避免执行未知 pickle 数据带来的安全风险。更推荐的做法是保存和加载都使用state_dict不要直接保存整个模型对象。8. 接口与推理把训练好的模型用起来训练只是第一步。真实项目中你需要把模型暴露成接口或者在脚本里批量推理。8.1 模型推理脚本先写一个最简单的推理函数import torch def predict(image_tensor, model_pathresnet18_finetuned.pth): device torch.device(cuda if torch.cuda.is_available() else cpu) model models.resnet18(weightsNone) model.fc nn.Linear(model.fc.in_features, 10) model.load_state_dict(torch.load(model_path, weights_onlyTrue)) model model.to(device) model.eval() with torch.no_grad(): image_tensor image_tensor.unsqueeze(0).to(device) output model(image_tensor) pred output.argmax(dim1).item() return predeval()和no_grad()在推理时很重要。前者让 dropout 和 BatchNorm 进入评估状态后者关闭梯度计算节省显存和加速。8.2 批量推理批量推理时可以结合DataLoaderfrom torch.utils.data import DataLoader dataset MyDataset(size100) loader DataLoader(dataset, batch_size32, shuffleFalse) all_preds [] for batch_x, _ in loader: batch_x batch_x.to(device) with torch.no_grad(): batch_pred model(batch_x).argmax(dim1) all_preds.append(batch_pred.cpu()) result torch.cat(all_preds, dim0) print(result)批量推理要特别注意显存batch size 过大可能会导致 OOM。建议先从小 batch 跑通再逐步上调。8.3 API 服务方向如果要把模型接进业务系统可以用 FastAPI 包一层 HTTP 接口。下面是一个通用模板from fastapi import FastAPI import uvicorn app FastAPI() app.post(/predict) def predict_endpoint(data: dict): # 这里需要把 data 里的输入转换成张量 # 并调用模型推理逻辑 return {prediction: 0} if __name__ __main__: uvicorn.run(app, host127.0.0.1, port8000)这个模板不包含具体预处理逻辑真正接业务时需要根据你的模型输入格式调整。API 服务的关键是模型加载一次推理放在请求处理函数里不要每个请求都重新加载模型。9. 资源占用与性能观察PyTorch 项目最常见的坑不是代码写错而是显卡内存不够、CPU 占用异常、训练越来越慢。9.1 显存观察训练过程中单独开一个终端持续观察显存watch -n 1 nvidia-smi或者每次打印一次nvidia-smi --query-gpumemory.used,utilization.gpu --formatcsv -l 1显存占用主要受这几个因素影响模型参数量。batch size。输入图片分辨率。是否开启了梯度计算。是否加载了优化器状态。入门阶段的建议是先用小 batch 跑通再去调显存策略。9.2 降低显存的通用方法减小 batch size。降低输入图片分辨率。使用混合精度训练PyTorch 有原生支持。冻结不需要训练的网络层。推理时使用torch.no_grad()。分批处理数据不要一次性加载全部样本。9.3 CPU 与 GPU 的差异同一个模型在 CPU 上能跑但不代表效率一样。GPU 适合并行计算CPU 在数据加载、预处理、小模型推理中也有优势。入门阶段可以先在 CPU 上验证逻辑再用 GPU 跑大规模训练。两者最大的区别体现在 batch size 较大时的矩阵运算速度。9.4 进程残留PyTorch 训练中断后GPU 显存可能不会立刻释放。检查是否有残留进程nvidia-smi ps aux | grep python找到残留进程后按需结束。10. 常见问题与排查方法问题现象可能原因排查方式解决方案import torch报 CUDA 错误驱动和 PyTorch 的 CUDA 版本不匹配运行nvidia-smi查看驱动支持版本到 PyTorch 官网重新生成安装命令torch.cuda.is_available()返回 False安装的是 CPU 版或驱动缺失打印torch.__version__看是否有cpu安装对应 CUDA 版本的 PyTorchtorch.load报 weights_only 相关错误PyTorch 2.6 起默认weights_onlyTrue查看报错堆栈加载可信模型时传weights_onlyFalse或改用safetensors训练时显存不足 OOMbatch size 太大或分辨率过高观察nvidia-smi显存占用减小 batch size、降低分辨率、开启混合精度loss 不下降学习率不合适、数据没归一化、梯度累计打印每 batch 的 loss调整学习率、检查数据预处理、确认 optimizer 正确使用训练速度很慢数据加载没并行或没用到 GPU观察 GPU 利用率调大num_workers、启用pin_memory、确认模型和数据都在 GPU 上conda 或 pip 安装慢默认源下载慢看下载速度切换国内镜像源多个 Python 环境混乱没有用虚拟环境检查which python用 conda 或 venv 单独建环境Jetson 设备安装失败JetPack 版本和 PyTorch 版本不匹配查看 JetPack 版本使用 NVIDIA 官方预编译包按 JetPack 版本选择对应 PyTorch11. 最佳实践与合规提醒入门阶段就要养成几个习惯后面做项目会少踩很多坑每个项目用独立虚拟环境不要把依赖全部堆在 base 环境里。模型权重、数据集、训练脚本、输出结果分开目录管理。训练脚本里固定随机种子方便复现。第一次跑项目先用最小参数验证链路通不通再调大 batch size 和训练轮次。批量任务要加日志记录每个 batch 的进度失败时可以断点续跑。模型保存优先用state_dict不要直接 pickle 整个模型对象。对外提供 API 服务时限制访问范围不要暴露在公网无授权访问。使用开源预训练模型时要遵守模型的 LICENSE尤其是商用场景。如果训练数据包含人脸、声音、私人信息必须确认数据来源合法并获得相应授权。生成式模型输出内容可能带有偏见或错误落地到业务系统前要做人工复核。12. 总结先跑通再扩展回到最初的问题2026 年到底选 PyTorch 还是 TensorFlow如果你是转 AI 或搞科研直接以 PyTorch 为主线这是当前生态最顺、资料最多、工作机会覆盖最广的选择。如果你已经在工业系统里维护 TensorFlow 项目继续深耕也没有问题同时可以抽时间把 PyTorch 的基本流程补上。进大厂的话两者都不算稀缺技能稀缺的是你能不能用框架把问题解决到可上线、可复现的程度。这篇内容里最值得你立刻动手试的是第 7 节的迁移学习案例。它能在很短时间内跑通一条完整链路也是很多真实项目的起点。最容易踩的坑有两个一个是 CUDA 版本不匹配导致torch.cuda.is_available()为 False另一个是 PyTorch 2.6 之后的weights_only加载问题。这两个问题在第 10 节都有对应解法。三小时入门只是起点。跑通训练循环之后下一步可以尝试动手改一个开源项目或者把当前模型导出成 ONNX 接进服务器。框架本身不是壁垒用框架解决实际问题的经验才是。建议先把这篇收藏安装、训练、排查的时候对照着操作能省不少时间。