☰
TensorFlow安装与PyTorch对比:2024年深度学习框架选型实战指南
2026/11/3 5:24:23 网站建设 项目流程

TensorFlow发展到2024年,处境其实挺微妙的。一边是PyTorch在学术论文里的统治力逐年走高,一边是TensorFlow仍然在以非常庞大的体量运行在生产和移动端设备上。如果你刚接触深度学习,或者正打算把模型落地成产品,你会发现关于“TensorFlow安装”、“TensorFlow与PyTorch流行趋势”这类问题的讨论热度一直没降过。这篇文章我想以实际使用者的视角,聊聊TensorFlow目前到底是什么状态,怎么装最省心,以及它和PyTorch放在一起到底怎么选。

文章的内容会覆盖环境搭建、框架对比和完整体验一个Keras项目,适合三类人看:想入门深度学习的初学者、需要做技术选型的工程师,以及被版本问题折腾过的TensorFlow老用户。我会尽量讲清楚每个步骤背后的理由,也会把踩过的坑直接拿出来说。

1. 先聊清楚:TensorFlow到底是什么,能拿来干嘛

1.1 从分布式系统起家的深度学习框架

TensorFlow是Google在2015年开源的计算框架,核心逻辑是用“张量”在“计算图”中流动来完成数值运算。所谓张量,你可以把它理解成任意维度的数组——0维是标量,1维是向量,2维是矩阵,3维以上就是批量数据。所谓计算图,就是预先定义好运算流程,然后数据沿着这个流程跑一遍。这种范式最早脱胎于Google内部的分布式系统设计,所以TensorFlow天生就带着“大规模部署”、“跨设备运行”的基因。

这个设计在早期有一个明显的优点:可以在Python端定义图结构,再交给C++引擎执行,运行效率高,适合服务端部署。但也有一个致命的缺点:调试不方便,写起来不直观。所以大家在1.x版本时期普遍抱怨“难用”,本质上是这套静态图的开发体验不符合普通研究者的直觉。到了2.0版本,TensorFlow干脆把Keras作为官方高层API,默认开启了动态图执行模式(Eager Execution),把“先构图再运行”改成了“边运行边构图”,开发体验才真正跟上了时代。

从原理层面理解这一点很重要。因为你现在去搜TensorFlow安装教程,不同文章给的建议截然不同,根源就在于很多内容还停留在1.x时代。后面会专门讲安装和版本的问题。

1.2 TensorFlow的生态拼图:不只是训练模型

很多人以为TensorFlow就是个训练神经网络的库,其实它是一整套技术栈。训练模型只是最上层的一部分,支撑它的是几个关键组件。

Keras是目前官方推荐的高层接口,适合快速搭建模型;TensorFlow Serving负责把训练好的模型部署成高效的线上推理服务;TensorFlow Lite面向手机、嵌入式设备,可以把它理解为“轻量级TensorFlow”,专门用来跑端侧推理;TensorFlow.js则把计算能力搬到了浏览器。此外还有TensorBoard做可视化,TFX管理生产级机器学习流水线。

这套生态组合下来,TensorFlow的优势就显现出来了:它不只是一个训练工具,而是一个可以覆盖“数据处理 → 模型训练 → 模型转换 → 线上部署 → 端侧推理”全链路的解决方案。

这些组件在后面的实操和选型部分会反复提到。对做产品的人来说,这些能力往往比对某一个API的喜好更重要。

1.3 谁需要关注TensorFlow:典型的使用场景

从实际接触过的项目来看,TensorFlow目前在四类场景里还非常常见。

第一种是大型互联网公司的在线推理系统。这些公司前几年TensorFlow基础架构已经搭好,线上服务、监控、A/B测试都衔接得很成熟,短期没有动力切换到别的框架。第二种是移动端和物联网项目。TensorFlow Lite在Android生态里支持得最好,很多手机端的实时图像处理、OCR应用都跑在TFLite上。第三种是推荐系统。TensorFlow自带强大的分布式训练能力,加上TFX全流程管理,非常适合做大规模特征处理和模型迭代。第四种是教学和研究型团队存量的代码仓库。

如果你属于这四类中的任何一类,TensorFlow依然值得认真学。如果你只是做纯算法研究、发论文,那么可能PyTorch会更顺手。这两者的权衡我在第三章会展开说。

2. 环境搭建:TensorFlow安装的正确姿势

2.1 装机前先想明白的几件事

网上关于TensorFlow安装的文章很多,但大部分都在列pip命令,很少有人讲清楚装之前该想什么。以我多次从零搭环境的经验来看,有三件事必须先定下来,不然后面都是坑。

第一是版本。TensorFlow 2.x和1.x的API差别极大,代码完全不兼容。现在新项目无脑选2.x,但2.x内部也有小版本差异,不同小版本对Python版本的要求不一样。比如TensorFlow 2.10及以下对Python 3.11支持不好,2.11开始调整了依赖声明。如果你跟着旧教程不管三七二十一pip install tensorflow,最后很可能装了个不适配的版本,看起来装成功了,import就报错。建议安装前先去查看官方对Python版本的支持表,再决定用哪个Python环境。

第二是环境隔离。Python环境管理工具我比较推荐virtualenv或conda。很多人喜欢直接pip install到系统环境里,短期图方便,后来项目一多依赖冲突到怀疑人生是迟早的事。每一个项目单独开一个虚拟环境,虽然前期多动几步,长期来看反而是最省事的。

第三是硬件。有NVIDIA独立显卡的话,可以装GPU版TensorFlow,训练速度提升非常明显;没有显卡就用CPU版,照样能学,只是大模型训练会比较慢。这里要特别吐槽一下,“TensorFlow有CPU版和GPU版”这个说法到2.x其实已经变了,你直接安装官方tensorflow包,如果你的机器有兼容的GPU和CUDA环境,它会自动调用GPU,不需要再单独装tensorflow-gpu这个包。

注意:TensorFlow 2.x安装后的GPU能力是自动侦测的,别再装老的tensorflow-gpu包。真正决定能不能用GPU的是CUDA、cuDNN和显卡驱动的版本是否匹配。

2.2 从零开始的安装步骤(以2.16为例)

下面我以TensorFlow 2.16版本为例,给出一套目前比较稳的CPU版安装流程。这套流程在Ubuntu 22.04和Windows 11上我都跑过,基本不需要改动。

先创建并激活虚拟环境。Python建议用3.9-3.12之间的稳定版本,我推荐3.11:

# 使用virtualenv创建环境 python3 -m venv tf_env source tf_env/bin/activate # Windows下的激活命令 # tf_env\Scripts\activate

激活环境后,先升级pip再安装TensorFlow:

pip install --upgrade pip pip install tensorflow==2.16

安装完成后验证一下:

import tensorflow as tf print(tf.__version__) print(tf.config.list_physical_devices())

如果输出版本号,并且能在物理设备列表里看到CPU设备,说明安装成功。这里有个小细节,很多人在这个环节因为看不到GPU设备就以为安装失败了,其实列表里如果没有GPU是正常的——说明你的机器没有可用的NVIDIA GPU环境,或者驱动没有配对,并不代表TensorFlow装坏了。

另外如果你在macOS上工作,麻烦区分清楚Apple Silicon机型。M系列芯片建议直接用如下方式安装:

pip install tensorflow-macos pip install tensorflow-metal

官方已经明确把Apple Silicon的安装包单独分离出来了,用Intel的Mac或者普通Linux盒子直接pip install tensorflow就行,不要混用。

2.3 GPU支持与CUDA配置:一次说清

这是TensorFlow安装里最容易把人劝退的部分。核心问题在于:TensorFlow通过CUDA调用NVIDIA显卡计算,但CUDA本身不是一个简单装上就能用的东西,它下面还有显卡驱动版本、CUDA工具包版本、cuDNN(深度神经网络加速库)版本三层依赖,三者必须互相匹配。

在TensorFlow 2.16版本,官方要求的组合大致是:CUDA 12.3、cuDNN 8.9。如果你安装了NVIDIA官方驱动,建议先不要自己乱装CUDA全家桶,直接用conda来管理Toolkit反而省心:

conda install -c conda-forge cudatoolkit=12.3 cudnn=8.9

然后设置环境变量:

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$CONDA_PREFIX/lib

安装完后,用下面的命令检查GPU是否真正被TensorFlow发现:

print(tf.config.list_physical_devices('GPU')) print(tf.test.is_gpu_available())

跑通了的话,这个列表里会有一项GPU设备信息。实际训练时,使用GPU通常比CPU快十倍以上。

提示:如果你的显卡驱动是最近几年的型号,用这个方法大概率能直接跑通。如果遇到报错“could not load dynamic library ‘libcudnn.so.8’”,多半是cuDNN没找到,检查环境变量是否真的生效,别直接重装驱动。

3. 选型冷思考:2024年TensorFlow与PyTorch的流行趋势

3.1 两份生态里的真实差异

把TensorFlow和PyTorch放在一起比较,最核心的差异其实不在于谁“好用”谁“不好用”,而在于两者的设计哲学和服务目标不同。

PyTorch的核心理念是“研究友好”。它用动态计算图,写代码的方式跟写普通Python程序几乎没有区别,可以用print随便输出中间变量,可以用if语句写出不同分支,调试体验非常接近“原生Python”。这种设计让它在学术界快速流行,因为论文实验中最常见的工作是快速验证想法、频繁改动网络结构,PyTorch天然适配这种节奏。

TensorFlow的核心理念是“生产可靠”。虽然2.x也默认了动态图模式,但它的静态图能力并没有消失,只是被封装到了tf.function里。想部署到生产环境时,TensorFlow的SignatureDef结构、SavedModel格式、以及与TensorFlow Serving的无缝配合,明显比PyTorch要成熟。PyTorch也有TorchServe,但它在工业界的生态积累比TensorFlow还是差了一些。

看到这里你大概明白了,两个框架的“流行度之争”,本质上是研究工具和生产工具的路线之争,而不是谁比谁强的竞争。

3.2 学术论文与工业风向的变化

说一个比较残酷的数据现状:近两年顶级会议上PyTorch的使用率大幅超过TensorFlow。在论文复现、开源代码、预训练模型发布这些领域,PyTorch基本成了默认选择。Hugging Face的Transformers库,主线就是PyTorch实现的;很多大模型的微调工具也默认建立在PyTorch之上——这让很多新入门的朋友非常自然地先学了PyTorch。

关于“tensorflow与pytorch的流行趋势 2024年”这个热议话题,我的观察是:学术圈的火热确实在朝PyTorch倾斜,但工业圈并没有那么干脆。谷歌自家的模型、Android生态里的端侧模型、已经跑了多年的推荐系统,这些存量资产并不会因为学术偏好而立即迁移。大型系统的迁移成本太高,稳定性永远是第一位的。所以在实际招聘里,很多偏算法工程的岗位依然明确要求TensorFlow经验。

另外还有一个趋势值得注意:两边都在互相借鉴。PyTorch 2.0引入了torch.compile,提升静态编译性能;TensorFlow则在Keras 3.0里实现了多后端支持,可以直接选择在JAX或PyTorch上运行。换句话说,框架边界正在变得模糊,真正有价值的能力是对深度学习基础概念的理解,而不是死守某一个特定API。

3.3 从趋势看选型:什么场景下TensorFlow仍然值得

基于上面的这些差异,我可以比较直接地给出建议,2024年你依然值得学TensorFlow的场景有这么几个:

第一,你是做推荐的,特别是大规模分布式训练。TensorFlow原生的分布式策略和TFX生态,很难被替代。第二,你要做移动端或嵌入式推理,TensorFlow Lite在浏览器和手机端的优化成熟度暂时领跑。第三,你在企业里部署模型,打算用标准化的SavedModel格式和TensorFlow Serving做服务,这套链路稳定且资料完备。第四,你的团队前辈有大量TensorFlow存量代码,你进来直接接手。

反过来,如果你是刚入门深度学习,主要是复现论文、做实验、做个人作品,那么PyTorch的上手曲线确实更平滑,社区资源也更集中。但我不建议根本没搞懂深度学习就开始站队,框架只是工具。真正想清楚自己要解决什么问题,你会发现两个框架的公共知识占了八成以上,三成差异其实花几天就能补齐。

4. 实操一把:用Keras从零训练一个图像分类模型

4.1 项目设定与数据集准备

安装好了环境,也搞清楚了框架之间的差异,接下来用代码走一遍流程。我选的实战项目是经典的Fashion MNIST图像分类任务:识别十种服饰类型,包括T恤、裤子、套头衫、裙子、外套、凉鞋、衬衫、运动鞋、包、短靴。

选这个项目的原因很实际。第一,数据集规模适中,在CPU上训练也只要几分钟。第二,它是标准的计算机视觉入门任务,跟手写数字识别相比不会练得非常简单,但又不至于一开始就上手大模型。第三,Keras内置了这个数据集,不需要手工下载和清洗,能让注意力集中在TensorFlow的核心操作上。

先写加载数据的代码,并且顺便了解一下数据的形状:

import tensorflow as tf from tensorflow.keras.datasets import fashion_mnist (x_train, y_train), (x_test, y_test) = fashion_mnist.load_data() print("训练集shape:", x_train.shape) # (60000, 28, 28) print("测试集shape:", x_test.shape) # (10000, 28, 28)

Fashion MNIST的每张图片都是28×28像素的灰度图。注意这里还没有通道维度的概念,Keras的卷积层需要输入带通道维的四维张量,后面要主动reshape一下。另外像素值范围是0到255,神经网络对输入数据的尺度非常敏感,喂数据之前必须归一化到0到1之间。

实际上很多新手在训练精度提不上去的时候,第一反应是换模型结构,其实最容易被忽略的就是数据预处理这一步。

完整的预处理代码:

# 归一化:把像素值从[0, 255]缩放到[0, 1] x_train = x_train.astype('float32') / 255.0 x_test = x_test.astype('float32') / 255.0 # 为卷积网络增加通道维度:(样本数, 28, 28, 1) x_train = x_train.reshape((-1, 28, 28, 1)) x_test = x_test.reshape((-1, 28, 28, 1)) # 标签转成one-hot编码 y_train = tf.keras.utils.to_categorical(y_train, 10) y_test = tf.keras.utils.to_categorical(y_test, 10)

4.2 搭建模型架构与训练配置

接下来定义一个卷积神经网络。这里我直接使用Keras的Sequential模型,把各个层按顺序堆叠即可。代码里每一行都要清楚它在干什么,而不是盲目抄作业。

model = tf.keras.Sequential([ tf.keras.layers.Conv2D(32, (3,3), activation='relu', input_shape=(28,28,1)), tf.keras.layers.MaxPooling2D((2,2)), tf.keras.layers.Conv2D(64, (3,3), activation='relu'), tf.keras.layers.MaxPooling2D((2,2)), tf.keras.layers.Flatten(), tf.keras.layers.Dense(128, activation='relu'), tf.keras.layers.Dropout(0.2), tf.keras.layers.Dense(10, activation='softmax') ])

解释一下我的设计思路。第一层Conv2D用了32个3×3的卷积核,目的是提取图像的局部特征,比如边缘、纹理;MaxPooling2D池化层的作用是下采样,减小特征图尺寸,降低计算量同时也减少过拟合风险。第二组卷积用了64个卷积核,让层数越深时通道数越多,这是CNN很常见的做法。Flatten层把二维特征图展平成一维向量,后续接全连接层做分类。

输出层的10对应了10个服饰类别,softmax激活函数输出每个类别的概率分布。

接下来是训练参数的设置。这里有几个关键选项值得展开说。

model.compile( optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'] )

优化器adam是目前最常用的默认选择,它结合了Momentum和RMSProp的优点,能自适应调节学习率,对新手来说几乎不需要调参就能取得不错的效果。loss选择categorical_crossentropy,因为这里是多分类任务且标签做了one-hot编码;如果标签仍是整数形式,应该用sparse_categorical_crossentropy。

训练轮次epochs设为10,batch_size设为64。batch_size是一次喂给模型的数据量,太大会导致显存溢出,太小则训练不稳定。10轮对Fashion MNIST这种规模的任务足够看到明显的收敛过程。

history = model.fit( x_train, y_train, batch_size=64, epochs=10, validation_split=0.2, verbose=1 )

validation_split=0.2意味着自动从训练集里抽出20%做验证集,这样每个epoch结束都能看到模型在没见过数据上的表现,方便判断是否过拟合。

4.3 训练、评估与模型保存

训练过程运行后,可以看到每个epoch的输出。正常情况下,准确率会从第一轮的80%左右逐步上升到最后一轮的95%以上。如果你发现验证准确率不再上升但训练准确率还在涨,说明过拟合开始了,这时候可以考虑增加Dropout比例或减小模型复杂度。

训练完成后,用测试集做最终评估:

test_loss, test_acc = model.evaluate(x_test, y_test) print(f"测试集准确率: {test_acc:.4f}")

大概可以到97%上下。这个任务做到这个程度已经算入门成功。如果你想要一个能真实部署使用的模型,还需要把训练好的模型保存下来。老生常谈的问题是用那种格式保存,答案是SavedModel格式:

model.save('fashion_model')

它会生成一个文件夹,里面包含完整的模型结构、权重和训练配置。以后要做推理,一行代码就能恢复:

restored_model = tf.keras.models.load_model('fashion_model') predictions = restored_model.predict(x_test[:5])

关于梯度计算,我多说一句:Keras的fit函数已经把前向传播、反向传播、参数更新封装好了,你不需要手写梯度。但当你想自定义训练循环时,就需要用到tf.GradientTape。它是TensorFlow 2.x里最核心的自动微分接口:

with tf.GradientTape() as tape: logits = model(x_train_batch) loss_value = loss_fn(y_train_batch, logits) grads = tape.gradient(loss_value, model.trainable_weights) optimizer.apply_gradients(zip(grads, model.trainable_weights))

理解这个机制能让你以后应对各种非标准训练策略时不至于束手无策。

5. 踩坑实录:TensorFlow常见问题与排查技巧

5.1 版本兼容问题防不胜防

我见过太多人因为版本兼容问题直接放弃了TensorFlow,其实大部分都能提前避免。最典型的一类问题是:安装时就pip install tensorflow,然后跑旧教程里的1.x代码,import里写import tensorflow as tf和tf.placeholder,直接报AttributeError。如果你要学习的代码是1.x写的,要么把代码迁移到2.x,要么安装tensorflow==1.15老版本,二选一,别想着同时兼容。

第二类问题是Python版本和TensorFlow版本不匹配。TensorFlow发布节奏慢于Python版本更新速度,新Python版本出来后往往要过几个月TensorFlow才支持。当你看到warning提示“Some Python dependencies could not be resolved”时,大概率是版本互相不兼容了。我的建议是安装之前去官方各版本对Python版本的支持声明里核对一遍。

第三个非常隐蔽的坑是系统里的OpenMP库冲突。症状是import tensorflow时报错“libiomp5md.dll already initialized”或“OMP: Error #15”。根因是机器上同时存在多个OpenMP运行时,触发冲突。解决办法是设置一个环境变量绕开重复加载:

export KMP_DUPLICATE_LIB_OK=TRUE

Windows用户同样可以设置系统环境变量来解决这个问题。这个报错看起来特别吓人,但解决方式简单得令人无语。

5.2 显存不足和训练卡死

使用GPU训练时,最常见的报错就是OOM(Out of Memory)。TensorFlow默认会占用几乎全部显存,而不是按需申请。如果机器上同时要跑多个模型,或者显存本身只有4GB或6GB,就很容易在模型稍大一点时报OOM。

解决办法是限制显存按需增长:

gpus = tf.config.experimental.list_physical_devices('GPU') if gpus: try: for gpu in gpus: tf.config.experimental.set_memory_growth(gpu, True) except RuntimeError as e: print(e)

设置了memory_growth之后,TensorFlow会尽量少占显存,不够再加,而不是一开始就把显存占满。

还有一个经常被忽略的问题是“训练看起来卡死,其实没死”。如果你用GPU训练,第一次迭代往往特别慢,因为TensorFlow在初始化CUDA上下文、分配显存、加载cuDNN算法,这个过程可能长达几十秒。如果是在Windows上,还会跳出一个命令行窗口提示复制cuDNN动态库,这个窗口第一次要一两分钟。我的经验是:看到第一个epoch跑起来之前,先安静等两分钟再说。如果超过三分钟还没有任何输出,再去查是不是有更严重的配置问题。

5.3 常见问题速查表

为了方便查阅,我把平时群里被问得最多的问题直接整理成一个速查表。

问题现象常见原因解决思路
import时报无法找到cudnn库CUDA与TensorFlow版本不匹配核对cuDNN版本,设置LD_LIBRARY_PATH环境变量
训练速度很慢但没报错实际在CPU上运行检查GPU设备是否被识别,驱动是否正常
OOM显存不足模型太大或默认占用全部显存开启显存按需增长,减小batch_size
报错Illegal instructionCPU太老,TensorFlow用了新指令集安装之前的版本,或换TensorFlow源码编译版本
Keras报NotImplementedError代码是用1.x版本API写的把代码升级到2.x,学习新版API
到了某一层突然shape不符合预期中间某一层的输出维度搞错了用model.summary()检查每一层输出shape

注意:TensorFlow的报错信息在不同版本里措辞差异很大。排查问题时不要只看一两个关键词就动手重装,先顺着完整堆栈往上翻,看清楚到底是哪一层、哪个API出了问题。我见过很多次重装能解决问题,其实只是换了个版本顺带解除了依赖冲突。

另外一个经验是,遇到看不懂的错误,先把完整的错误信息复制下来搜索,比直接求助别人更有效率。TensorFlow用户量大,绝大多数坑在GitHub的issue里都有前人在讨论。

最后说点实际的

装好环境、跑通过项目、也理解了两个框架的取舍,剩下的是耐心。深度学习这条路跟学骑自行车差不多,一开始容易被框架细节绊倒,会摔几次,但你只要坚持跑通一两个完整项目,后面的路就会顺很多。我个人的建议是:如果你时间有限,先别纠结两个框架选哪个,用你最顺手的一个把完整的“训练-评估-部署”流程走通一次。框架可以换,但能力是通用的。遇到“TensorFlow怎么装”这类问题的时候,记得今天看到的这些坑,你会省下不少时间。

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

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

立即咨询