
如果你正在准备 2026 年入门深度学习那“TensorFlow 和 PyTorch 到底选哪个”这个问题几乎一定会卡住你几天。网上一搜有人坚定站 PyTorch说学术界都在用它也有人是 TensorFlow 的老用户强调生产部署成熟稳定。两边说得都有道理但对一个零基础新手来说这种争论其实不是帮助而是负担。如果只让我给一个结论我会说零基础入门优先选 PyTorch。这不是因为 TensorFlow 不行而是因为从 2024 年到 2025 年PyTorch 在学术研究、开源社区、大模型生态里的“事实标准”地位已经非常清楚。对初学者来说选一个资料丰富、踩坑人少、社区活跃的框架能减少大量不必要的阻力。但这个结论不够你还需要知道为什么 PyTorch 成了主流TensorFlow 到底还值不值得学两个框架的代码风格差异有多大安装部署时最容易踩哪些坑这篇文章会把这些问题一次性讲透并给出从环境搭建、代码示例到学习路线的完整实践路径让零基础的人看完就能动手跑通第一个模型。1. 这篇文章真正要解决的问题很多新手在框架选择上消耗了太多时间根本原因是把“选框架”这件事看得太重了。框架是工具不是知识本身。深度学习最核心的知识——神经网络结构、损失函数、反向传播、优化器、卷积、池化、注意力机制——在任何框架里都是相通的。你切换框架只需要学新的 API 语法不需要重学算法原理。但框架确实会影响你的学习体验。一个友好的框架能让你在写代码时把注意力放在模型设计上而不是被底层机制困扰。一个别扭的框架会让你在环境配置和调试上浪费大量精力甚至打击自信。所以这篇文章要解决的核心问题有三个让你搞清楚 TensorFlow 和 PyTorch 的真实差异而不是停留在“一个工业界用、一个学术界用”的模糊印象里。让你能自己动手完成环境搭建跑通一个完整的手写数字识别例子从代码层面感受两个框架的区别。让你明确自己的定位知道自己该选哪个方向、按什么路径继续深入学习。读完这篇文章你不需要再纠结“选哪个”你只需要去做。2. 基础概念与核心原理在对比框架之前先把两个最容易被混淆的概念讲清楚计算图和张量。2.1 张量是什么张量Tensor就是“多维数组”的深度学习说法。标量是 0 维张量向量是 1 维张量矩阵是 2 维张量再往上就是高维张量。在图像任务里一张彩色图片通常表示成(height, width, channels)这样的 3 维张量比如(224, 224, 3)。一批图片放在一起就是 4 维张量(batch_size, height, width, channels)。无论是 TensorFlow 还是 PyTorch核心计算对象都是张量。两者的张量 API 高度相似你掌握了其中一个另一个基本能猜个八九不离十。2.2 动态图与静态图这才是两个框架最根本的分歧。TensorFlow 1.x 时代采用静态计算图你先把完整的计算流程定义好构建成一个“图”然后在一个会话Session里把数据喂进去执行。这种方式在部署和优化上有优势但调试非常痛苦。你没办法在中间步骤顺手打印一个值因为图还没执行。PyTorch 从诞生起就采用动态计算图也叫“define-by-run”。你写代码的时候计算图跟着代码一行一行构建变量是什么、中间结果是什么随时可以打印、修改。这非常符合 Python 程序员的心智模型调试体验接近普通 Python 代码。TensorFlow 开发团队显然也意识到了这个趋势所以在 TensorFlow 2.x 里默认开启了 Eager Execution动态执行并把 Keras 作为官方高级 API。也就是说现在的 TensorFlow 也能做到类似 PyTorch 的动态图体验。但这也带来一个问题TensorFlow 的历史包袱太重。你在网上搜索资料时会同时看到 TF 1.x 的 Session 写法和 TF 2.x 的 Keras 写法新手很容易被带偏。2.3 两者的核心定位如果用一句话总结两个框架的定位差异可以这样说PyTorch先把研究和实验体验做到极致然后逐步向部署领域扩展。TensorFlow先把工业部署和生产闭环做到极致再回头优化研究体验。对新手来说研究和实验就是你目前最需要的功能。所以 PyTorch 更合适原因在此。3. TensorFlow 与 PyTorch 在 2025-2026 年的生态现状只看框架本身还不够你要关心的是框架背后的生态。3.1 学术界PyTorch 已是事实标准如果你现在去翻 2024 年以来的论文开源代码会发现大部分项目都默认使用 PyTorch。在 Hugging Face 的 Transformers 库中PyTorch 是最优先支持的后端大多数预训练模型权重也以 PyTorch 格式发布。你如果要复现论文、研究新模型遇到 PyTorch 资料的概率远高于 TensorFlow。这不是说 TensorFlow 没有学术用户而是说你作为新手遇到问题去搜索时PyTorch 的解决方案更容易找到、更完整。3.2 工业界TensorFlow 依然有阵地TensorFlow 的优势在于部署闭环。TensorFlow Serving、TensorFlow Lite、TensorFlow.js 这些工具经过多年打磨已经非常成熟。很多企业现有的推荐系统、视觉检测系统、移动端推理管线仍然跑在 TensorFlow 上。但要注意工业界的“存量”和“增量”是两回事。存量系统多为历史原因而新的 AI 项目越来越多地使用 PyTorch 训练再转 ONNX 或 TensorRT 部署。尤其是大模型时代主流的模型推理框架对 PyTorch 的兼容性更好。3.3 对新手意味着什么从生态角度如果你准备长期做 AI 方向PyTorch 的学习价值更大。TensorFlow 可以在后面需要时再学因为有 Keras 这层高级接口从 PyTorch 切换到 TensorFlow 并不难。反过来从 TensorFlow 切换到 PyTorch 会更费劲因为 PyTorch 的编程范式更接近 Python 原生逻辑需要适应的时间更短。结论很清晰先学 PyTorch打牢基础后续按需补充 TensorFlow。这不是“二选一死磕”而是一条更省力的路径。4. 环境准备与前置条件不管选哪个框架环境搭建是第一步。很多新手在这里就被劝退其实掌握了方法就很快。下面以 PyTorch 为例演示TensorFlow 的安装方法只是命令里的包名不同思路完全一样。4.1 你需要准备什么一台可以联网的电脑Windows、Linux、macOS 都可以。Python 环境推荐安装 Anaconda它能帮你管理虚拟环境。NVIDIA 显卡可选。有显卡可以装 GPU 版训练速度快很多没有显卡也能用 CPU 跑通所有示例就是慢一些。基本的命令行操作能力会打开终端输入命令就行。4.2 创建虚拟环境与安装框架打开终端执行conda create -n dl_env python3.10 -y conda activate dl_envPyTorch 的安装命令建议直接去官网生成因为不同操作系统、不同 CUDA 版本的安装命令不同。你打开pytorch.org的 Install 页面选择自己的系统把生成的命令复制执行即可。CPU 版通常是pip install torch torchvision torchaudioGPU 版通常是pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118注意上面这个命令只是示例。GPU 版本的 index URL 会随版本变化以官网实际生成为准。TensorFlow 的安装相对简单pip install tensorflow如果你有 NVIDIA 显卡并想使用 GPU需要先装好 NVIDIA 驱动、CUDA Toolkit 和 cuDNN。这里的版本匹配最容易出问题后面第 7 章会专门讲。4.3 验证安装是否成功装完后在终端进入 Python 环境验证import torch print(torch.__version__) print(torch.cuda.is_available())import tensorflow as tf print(tf.__version__) print(tf.config.list_physical_devices(GPU))如果能正常输出版本号说明框架安装成功。cuda.is_available()或list_physical_devices(GPU)返回True说明 GPU 可用返回False说明当前在用 CPU。这里真正容易踩坑的地方是你明明有显卡但检测不到 GPU。大多数情况是 CUDA 版本和框架要求不匹配或者显卡驱动太老。遇到这个问题不要乱卸载安装先确认版本对应关系。5. 核心流程拆解接下来我们用一个最经典的“手写数字识别”任务跑通从数据到训练的完整流程。这个任务相当于深度学习界的“Hello World”代码量小、原理清晰非常适合零基础入门。5.1 PyTorch 版完整示例先看 PyTorch 的写法。这里用 Fashion-MNIST 数据集因为它和 MNIST 一样简单但更有实际意义。# 文件路径mnist_pytorch.py import torch import torch.nn as nn import torch.optim as optim from torch.utils.data import DataLoader from torchvision import datasets, transforms # 1. 数据准备下载并加载 Fashion-MNIST transform transforms.Compose([ transforms.ToTensor(), transforms.Normalize((0.5,), (0.5,)) ]) train_dataset datasets.FashionMNIST( root./data, trainTrue, downloadTrue, transformtransform ) test_dataset datasets.FashionMNIST( root./data, trainFalse, downloadTrue, transformtransform ) train_loader DataLoader(train_dataset, batch_size64, shuffleTrue) test_loader DataLoader(test_dataset, batch_size64, shuffleFalse) # 2. 定义模型两层全连接网络 class MLP(nn.Module): def __init__(self): super().__init__() self.fc1 nn.Linear(28 * 28, 256) self.fc2 nn.Linear(256, 10) self.relu nn.ReLU() def forward(self, x): x x.view(x.size(0), -1) # 将 28*28 展平 x self.relu(self.fc1(x)) x self.fc2(x) return x model MLP() # 3. 定义损失函数和优化器 criterion nn.CrossEntropyLoss() optimizer optim.Adam(model.parameters(), lr0.001) # 4. 训练一个 epoch def train_one_epoch(): model.train() 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() return running_loss / len(train_loader) # 5. 评估准确率 def evaluate(): model.eval() correct 0 total 0 with torch.no_grad(): for images, labels in test_loader: outputs model(images) _, predicted torch.max(outputs, 1) total labels.size(0) correct (predicted labels).sum().item() return correct / total # 6. 执行训练 if __name__ __main__: for epoch in range(5): loss train_one_epoch() acc evaluate() print(fEpoch {epoch 1}, Loss: {loss:.4f}, Accuracy: {acc:.4f})这段代码的核心在于loss.backward()和optimizer.step()。前者自动计算梯度后者更新模型参数。这就是框架替你完成的部分——手动推导反向传播的时代已经过去了。5.2 TensorFlow 版完整示例再看看 TensorFlow 的写法。TensorFlow 2.x 里最常用的是 Keras 高级 API代码要简洁很多。# 文件路径mnist_tf.py import tensorflow as tf from tensorflow.keras import layers, models # 1. 数据准备加载 Fashion-MNIST (x_train, y_train), (x_test, y_test) tf.keras.datasets.fashion_mnist.load_data() # 归一化到 [-1, 1] x_train (x_train.astype(float32) - 127.5) / 127.5 x_test (x_test.astype(float32) - 127.5) / 127.5 # 2. 定义模型两层全连接网络 model models.Sequential([ layers.Flatten(input_shape(28, 28)), layers.Dense(256, activationrelu), layers.Dense(10) ]) # 3. 编译模型指定损失函数、优化器和评估指标 model.compile( optimizertf.keras.optimizers.Adam(0.001), losstf.keras.losses.SparseCategoricalCrossentropy(from_logitsTrue), metrics[accuracy] ) # 4. 训练并同时评估 model.fit(x_train, y_train, epochs5, batch_size64, validation_data(x_test, y_test))TensorFlow 的model.fit()把训练循环封装好了你不需要手写for epoch循环。这种设计对新手很友好但也意味着你想深度控制训练过程时需要额外学习自定义训练循环的写法。5.3 两个框架代码风格的核心差异从上面两个例子能直观看出PyTorch 的代码更“显式”训练循环、梯度清零、反向传播都是你自己控制的你能清楚看到每一步发生了什么。TensorFlow 的代码更“封装”一个fit()就把训练和评估全包了初学者写起来很爽但对底层机制的理解可能会弱一些。打个比方PyTorch 像手动挡你更清楚发动机转速和挡位的配合TensorFlow 的 Keras 像自动挡省心省力但操控感弱一些。对于想真正理解深度学习原理的入门者手动挡的练习价值更高。6. 运行结果与效果验证当你运行上面两个示例时预期看到类似这样的输出。PyTorch 版Epoch 1, Loss: 0.5612, Accuracy: 0.8065 Epoch 2, Loss: 0.3764, Accuracy: 0.8589 Epoch 3, Loss: 0.3381, Accuracy: 0.8714 Epoch 4, Loss: 0.3156, Accuracy: 0.8795 Epoch 5, Loss: 0.2989, Accuracy: 0.8846TensorFlow 版会输出训练进度条和验证准确率最终准确率通常在 0.88 左右。怎么判断成功主要看两点损失值Loss在逐步下降。如果 Loss 不降反升说明学习率设置有问题或模型结构有 bug。准确率Accuracy在逐步上升。普通全连接网络在 Fashion-MNIST 上跑到 88% 是正常水平。如果你看到准确率超过 95%反而要想想是不是数据和标签泄漏了。如果运行失败第一步先看报错信息。常见的错误类型有张量形状不匹配检查inputs和labels的形状打印images.shape和labels.shape。数据集下载失败多半是网络问题可以先手动下载数据集放到指定目录或者切换网络源。Loss 变成 NaN通常是学习率太大把lr调小到0.0001试试。7. 常见问题与排查思路根据大量新手踩坑的经验下面这份排查表能帮你解决 80% 的安装和运行问题。问题现象可能原因排查方式解决方案torch.cuda.is_available()返回 FalseCUDA 版本不匹配或驱动过旧在终端运行nvidia-smi查看驱动版本到 PyTorch 官网生成匹配当前 CUDA 版本的安装命令重新安装TensorFlow 检测不到 GPUcuDNN 未安装或版本不匹配打印tf.config.list_physical_devices(GPU)安装与 TensorFlow 版本匹配的 CUDA 和 cuDNN参考官方文档pip install tensorflow报错找不到版本Python 版本过高或过低运行python --version检查版本使用 TensorFlow 官方支持的 Python 版本推荐 3.9-3.11数据集下载慢或失败网络原因或下载源不稳定查看错误信息中的 URL使用离线下载方式或配置镜像源Loss 变成 NaN学习率过大、数据未归一化打印前几轮的 Loss 值调小学习率、检查数据预处理是否归一化模型训练准确率很低模型结构简单或数据预处理不当先跑通代码再关注准确率确认数据归一化方式尝试增加网络层数使用model.eval()后结果仍变动模型中有 Dropout 或 BatchNorm 未正确处理确认评估阶段是否调用了no_grad()在 PyTorch 中用torch.no_grad()包裹评估代码并调用model.eval()加载 .pt 模型文件报错模型结构定义与保存时不一致确认模型类定义和初始化参数是否一致保存时打包model.state_dict()加载时先实例化模型再加载权重这里面最容易让人崩溃的是 GPU 相关的问题。请记住一个基本顺序先确认nvidia-smi能看到显卡再确认 CUDA 版本和框架要求匹配最后才考虑其他问题。不要凭感觉瞎升级驱动否则可能把已经能用的环境搞坏。8. 最佳实践与工程建议跑通一个例子和真正做好一个 AI 项目之间还差一些工程习惯。这些习惯越早养成越好。8.1 永远使用虚拟环境隔离项目不要一股脑把所有包都装进系统 Python。不同项目依赖的版本可能冲突用 conda 或 venv 创建独立环境能让你避免“改一个项目的依赖弄坏另一个项目”的尴尬。环境命名建议带上用途比如dl_cv_env、dl_nlp_env。8.2 固定版本记录依赖项目跑通后马上把依赖版本记录下来pip freeze requirements.txt这样你换电脑、团队协作、云端部署时都能轻松复现环境。不要图省事跳过这步几个月后你自己都会感谢当初这个习惯。8.3 设置全局随机种子深度学习包含大量随机初始化不设种子的话每次跑的结果都不同影响问题排查和效果对比。在 PyTorch 中可以在训练脚本开头加上import random import numpy as np import torch def set_seed(seed42): random.seed(seed) np.random.seed(seed) torch.manual_seed(seed) if torch.cuda.is_available(): torch.cuda.manual_seed_all(seed)8.4 训练和验证要分开写不要在训练循环里同时做评估更不要用训练集当验证集。训练阶段保留 Dropout、BatchNorm 的更新行为评估阶段切换到评估模式并关闭梯度计算。这不是可选项是必须项。8.5 模型保存与复现建议保存模型时同时保存两部分信息模型结构描述或模型类代码和模型权重。PyTorch 通常这样保存# 保存 torch.save(model.state_dict(), model.pt) # 加载 model MLP() # 先实例化 model.load_state_dict(torch.load(model.pt)) model.eval()不要只保存整个模型对象因为加载时对原代码的依赖太强别人拿到你的文件很可能跑不起来。8.6 不要急于追求高级功能很多新手学了几天 PyTorch就想用分布式训练、混合精度、自定义算子。这些技能有用但不是当前阶段该学的。先把基本训练流程走扎实理解张量形状变化、梯度传播、过拟合这些核心概念比堆砌高级 API 重要得多。9. 总结与后续学习方向回到最初的问题2026 年入门深度学习到底该选 TensorFlow 还是 PyTorch我的建议非常明确零基础选 PyTorch。理由有三个学术和开源生态几乎都围绕 PyTorch你查资料、复现论文、使用预训练模型都会更顺畅。动态图模式更接近普通 Python 编程对新手友好调试直观。Hugging Face 等核心工具链默认支持 PyTorch你后续接触大模型、Transformer 时会发现这条路非常顺。但这不意味着 TensorFlow 不值得学。如果未来工作环境明确要求使用 TensorFlow比如做移动端推理、TensorFlow Serving 部署你完全可以在 PyTorch 基础扎实后转向它。两个框架的底层概念通用切换成本并没有想象中高。如果你的下一步是继续深入 AI 领域可以参考这个学习路径PyTorch 基础张量操作、自动求导、nn.Module、DataLoader把本文的示例扩展成 CNN。深度学习理论弄懂反向传播、卷积、池化、激活函数、损失函数、优化器这些核心概念。经典模型复现LeNet、ResNet、Transformer亲自写一遍并调通训练。项目实战找一个真实场景比如图像分类、文本分类从数据采集到模型部署完整走一遍。扩展生态学习 Hugging Face Transformers、ONNX 模型转换、推理加速等工具。最后给你一个很实用的建议不要在学习框架上花费超过一周时间。框架只是个工具真正的竞争力来自你对深度学习原理的深度理解以及通过大量项目积累起来的调试能力。尽早动手尽早踩坑你的成长速度会远超那些每天纠结“哪个框架好”的人。如果你在安装配置或跑通示例的过程中遇到问题欢迎把报错信息发在评论区我会尽力帮你排查。建议收藏这篇文章当作你深度学习入门路上的第一份环境配置手册。