2024年过半,tensorflow安装这个关键词还能挂在技术热词榜上,说明TensorFlow和PyTorch的讨论远没有结束。我身边经常能碰到两类人:一类刚装完TensorFlow,被Python版本、CUDA、cuDNN这套组合拳打得晕头转向,连import tensorflow都跑不通,直接在第一步就放弃了;另一类是项目还没开始,先纠结选哪个框架,每天刷各种对比帖,越刷越焦虑,最后还是两手空空。
这篇文章不打算站队,也不做"XX吊打XX"的标题党。我在实际项目里两种框架都用过,TensorFlow这边从Keras快速建模到TF Serving上线、再到移动端TFLite部署都摸过一遍。我会把你们最关心的三件事讲透:第一,TensorFlow到底解决什么问题,为什么它在2024年依然值得认真学;第二,从零安装TensorFlow时那些最容易劝退你的报错,分别是什么原因、怎么处理;第三,它和PyTorch目前的真实生态位差距,以及你自己的项目更适合往哪边靠。
如果你准备入手TensorFlow,或者正卡在环境搭建和框架选型之间进退两难,这篇文章应该能帮你省下不少搜索和试错时间。
1. TensorFlow到底在解决什么问题:从2024年的热度说起
1.1 一个被反复提起的疑问:2024年还有没有必要认真学
先聊聊最容易被带偏的问题:TensorFlow是不是已经"过时"了?
我经常在技术群里看到这样的对话。有人说现在论文复现全是PyTorch,TensorFlow没必要再学;也有人反驳说大厂生产环境一堆TensorFlow老系统,运维岗位长期缺人。两种说法都有事实依据,但都只看到了局部。tensorflow与pytorch的流行趋势这个话题能出现在2024年的热搜词里,本身就说明行业并没有给出"一边倒"的答案。
我自己理解是这样的:PyTorch在研究和开源社区里的声量确实更大,很多AIGC、大模型相关的开源项目默认给的就是PyTorch接口。但TensorFlow的根本定位从来不是"写论文最快的玩具",而是"从模型到生产系统的完整链路"。你只要看一眼它的组件清单就明白了:TF Serving管线上服务,TensorFlow Lite管移动端,TensorFlow.js管浏览器,TensorFlow Extended管数据管道和模型验证。这一整条链路,其他框架到现在也很难做到同样顺滑。
所以我的态度很明确:如果你是要做研究、写论文、快速验证想法,PyTorch确实顺手,但如果你要做产品、做部署、做长期维护的业务系统,TensorFlow依然是目前工程化最完整的选择。
1.2 TensorFlow解决的核心问题:从实验环境到生产服务的一体化
我打个比方。PyTorch更像一个手艺人的工作台,工具灵活、上手快,适合做精工细活;TensorFlow则更像一条带传送带的车间,前面的工序是模型设计、训练、调参,后面的工序是导出、部署、监控、更新。它把"实验室里能跑的模型"和"生产线上能用的模型"之间的那段距离,尽可能压缩了。
具体到日常工作,你会体验到这种一体化的价值:
- 模型训练完,直接
model.save()就能导出标准格式,不用再去写一堆转换脚本。 - TensorFlow Serving直接吃SavedModel目录,配合Docker一条命令启动服务,接口是标准gRPC/REST,后端语言随便你选。
- 换到边缘设备时,TensorFlow Lite有完整的量化工具链,可以把模型从几百MB压到几十MB,而且对NPU、DSP这类硬件的适配很成熟。
这些能力对纯研究场景可能用不上,但一旦进入产品化阶段,它们的价值就会成倍放大。很多从PyTorch迁移过来的工程师跟我抱怨过,模型在实验室跑得挺好,但上线的路走得磕磕绊绊,反而是TensorFlow这边"开箱即用"的东西多。
1.3 哪些场景下TensorFlow仍然是最省事的选择
不是所有项目都需要完整的大平台,但有些场景我建议你直接用TensorFlow,不要折腾别的:
- 团队后端不是Python:如果你的模型服务要嵌入Java、Go或者C++系统,TF Serving比在Python进程里跑PyTorch模型省心得多。
- 目标设备包含移动端或嵌入式:Android、iOS、树莓派、各类边缘盒子,TFLite在这些平台上的支持广度和量化工具成熟度,目前依然有优势。
- 项目生命周期超过一年:长期系统需要稳定的版本节奏、完整的监控方案和可维护的部署链路,TensorFlow的工程化规范会帮你兜住很多底。
简单说,选择框架不能只看"哪个更火",要看你的终点在哪里。
2. 安装TensorFlow:环境版本对齐与三个高频报错现场
2.1 装之前必须搞清楚的版本关系:Python、CUDA与cuDNN逐个对齐
接着聊最折磨人的安装环节。我先给一个结论:TensorFlow安装出问题的原因,八成不是你命令敲错,而是版本组合没对齐。
TensorFlow的安装本质上是三套东西的匹配:Python版本、CUDA版本、cuDNN版本。任何一环跟TensorFlow的要求对不上,后面就会以千奇百怪的报错形式爆发出来。
以2024年最常用的TensorFlow 2.15、2.16为例,官方对Python版本的支持范围大致是3.9到3.12。但我经过多次实测和个人踩坑,最稳妥的选择是Python 3.10或3.11。Python 3.12虽然能装,但如果你还要搭配其他科学计算库,很容易碰上某个依赖库没跟上Python新版本的情况。
CUDA和cuDNN这边,规则稍微复杂一点,但我把核心思路说清楚你就明白了。TensorFlow 2.x在Linux上首次安装时,pip包会尝试验证系统里的CUDA版本,版本对不上会直接跳过GPU支持或者运行时报错。我的建议是装之前先看一眼自己的显卡驱动驱动支持哪个CUDA版本,或者直接去NVIDIA官网查驱动对应的CUDA能力,再决定TensorFlow版本。
为了省事,我一般这样搭配:
conda create -n tf-dev python=3.10 -y conda activate tf-dev如果你是Linux且有GPU需求,可以用conda直接管理CUDA相关组件,减少系统层面的污染:
conda install -c conda-forge cudatoolkit=11.8 cudnn=8.6Windows用户我多说一句:如果你用NVIDIA显卡,建议优先走WSL2方案。官方对Windows原生GPU支持的重心明显在往WSL2迁移,在WSL2里装驱动和CUDA比在Windows原生环境里折腾省心得多,尤其是碰到cuDNN文件复制这种极其容易出错的操作时,WSL2的优势特别明显。
2.2 pip与conda两种安装路线:没有谁绝对正确,但条件不同
接着说我观察到的另一个高频问题:到底用pip还是conda?
这两个工具本身不冲突,区别在于管理边界。conda能管Python解释器、能管CUDA运行库,但它不一定能拿到所有Python包的最新版本;pip的包全、更新快,但不管CUDA和解释器。所以我的推荐组合是:conda建环境+控制CUDA,pip装TensorFlow本体和其余PyPI包。
先把基础环境弄好:
conda create -n tf-dev python=3.10 -y conda activate tf-dev conda install -c conda-forge cudatoolkit=11.8 cudnn=8.6先找看看TensorFlow兼容这个CUDA版本(TF 2.10~2.15各版本对不同CUDA版本的支持有差异,建议到官方说明页核对),确认后再安装。以兼容CUDA 11.8的TensorFlow版本为例:
pip install tensorflow==2.10.*考虑到直接下载速度不稳定,可以换成国内镜像源:
pip install tensorflow -i https://pypi.tuna.tsinghua.edu.cn/simple安装完成后,跑下面这段代码验证:
python - <<'EOF' import tensorflow as tf print(tf.__version__) print("GPU:", tf.config.list_physical_devices('GPU')) EOF如果看到类似GPU: [PhysicalDevice(name='/physical_device:GPU:0', device_type='GPU')]的输出,就说明GPU已经识别到了。
2.3 三个高频报错现场:numpy、protobuf和tensorflow-gpu
报错一:numpy 2.x引起的导入崩溃。2024年不少人一升级numpy,import tensorflow直接报类似A module that was compiled using NumPy 1.x cannot be run in NumPy 2.x的错误。原因很简单,TensorFlow的旧版本编译时用的是numpy 1.x的API,而numpy 2.0做了大版本API变化。解决方式就是装完TensorFlow后顺手把numpy固定到兼容版本:
pip install "numpy<2"报错二:protobuf版本冲突。如果你装的是TensorFlow 2.11或更早的版本,经常会碰到一个错误,提示TypeError: Descriptors cannot be created directly。这是protobuf 4.x和旧版TF不兼容造成的。处理办法是降级protobuf:
pip install "protobuf<3.21"如果你装的是新版本TensorFlow,这个问题一般不会出现,所以看到这类报错的先检查自己是不是用了太旧的TF版本。
报错三:还在找tensorflow-gpu包。这个我必须重点提醒一下,2024年我依然收到不少私信问"为什么pip install tensorflow-gpu找不到包"。TensorFlow 2.1之后,tensorflow-gpu就已经被打包进tensorflow本体了。你要做的就是装tensorflow,然后在确认CUDA/cuDNN环境正确的前提下,它能自动使用GPU,根本不需要再单独装一个"GPU版TensorFlow"。继续沿用旧教程去装tensorflow-gpu,只会浪费时间或者装到一个已废弃的壳子。
提示:安装前查一下TensorFlow官方版本说明页里的CUDA兼容表,以当前版本的最新要求为准,比我上面举例的版本号更可靠。
3. TensorFlow与PyTorch的2024生态位:不是谁赢,是各自占哪个山头
3.1 研究圈与产业界的分布真相
现在聊热搜词里那个大问题:2024年,TensorFlow和PyTorch到底谁更有前途?
我先给一个直接又诚实的观察:研究圈和AI创业公司,PyTorch的声量明显占优;工业界已上线的系统和大型技术团队,TensorFlow的存量仍然很大。
为什么会形成这种分布?因为两类场景对框架的诉求完全不一样。研究者要的是快速改代码、快速出实验、快速跟进最新的社区实现,PyTorch的动态图和"以Python直觉为中心"的API天然贴合这个节奏。HuggingFace生态里的模型也基本都优先提供PyTorch权重,这进一步巩固了研究圈的选择。
而上了生产线的团队要的是什么?是稳定、可监控、跨语言调用方便、模型更新流程清晰。TensorFlow从头到尾就是按照"可部署"的标准设计的,SavedModel格式、TensorFlow Serving、TFLite这一串链路的完善程度,比TorchServe、ONNX Runtime那套组合拳还是要成熟一些,踩过的坑都有人填过了。
3.2 2024年最值得注意的变量:Keras 3多后端化
今年有一个变化很容易被忽略,但我觉得它可能是未来两三年最重要的事情:Keras 3.0已经支持多后端了。你可以继续用Keras这套高层API,但后端可以选择TensorFlow、PyTorch或者JAX。
这意味着什么?意味着"框架绑定"正在被一层一层拆掉。假如你习惯了Keras的简洁写法和callback管理方式,你完全可以依然用Keras写训练代码,后端选PyTorch去跟研究圈生态对接;将来要部署时再切回TensorFlow后端,产出标准的SavedModel。这种跨框架来回切换的能力,让"选错框架"这件事的代价变小了。
我在做技术选型评审时,越来越倾向于告诉团队:不用再把框架当成一次性的赌注。你把业务和模型逻辑写好,后端是可以换的。真正难迁移的是那些跟框架深度绑定的自定义算子、特殊部署流程,这些才是需要认真决策的部分。
3.3 选择框架的三个判断维度
与其纠结网上那些冲榜数据,不如用下面三个维度来判断你适合哪一边:
第一,你的模型最终要部署在哪里。这个问题直接决定框架选择。如果最终目标是浏览器里跑、手机上跑、嵌进C++后台服务,TensorFlow这条链路会省掉很多事;如果目标只是"有GPU、能出论文、能快速喂给其他人用",PyTorch更合适。
第二,团队现有技术栈。团队主力是Python研究者,还是偏工程的Java/Go工程师?工程岗居多的团队可以优先考虑TensorFlow的生产工具链,Python为主的团队天然靠近PyTorch这一步。没必要逆着团队习惯硬来。
第三,出问题时你能搜到的答案密度。框架生态的"护城河"有一半在Stack Overflow和GitHub Issue里。2024年的现状是:PyTorch的高频报错,你在网上几乎随便一搜就有现成答案;TensorFlow的高频报错,答案也不少,但版本差异导致的坑更多,需要更仔细核对版本号。
下面这张表是我根据实际使用体验整理的,供你参考:
| 对比维度 | TensorFlow | PyTorch |
|---|---|---|
| 研究原型与论文复现 | 可用Keras快速上手,但与论文代码衔接不如PyTorch直接 | 开源复现和主流论文默认占比高,跟社区节奏最舒服 |
| 生产服务与跨语言部署 | TF Serving + SavedModel完善,Java/Go/C++调用成熟 | TorchServe、LibTorch能用,但生态相对分散 |
| 移动端与网页端 | TensorFlow Lite支持广,量化工具链成熟 | PyTorch Mobile/ExecuTorch在进步,但起步较晚 |
| 底层自由度 | 偏向"高层API+生产约束",自定义底层算子成本高 | 动态图灵活、torch.autograd直观,自定义训练循环更顺手 |
| 社区趋势 | 存量项目大,长期维护性强 | 新项目、开源模型、论文默认越来越多的趋势明显 |
4. 用Keras跑通第一个训练任务:API选择与几条提升效率的约定
4.1 模型定义层的API选择:不要一上来就翻底层
环境装好了,框架也基本定了,接下来就是真正写代码。我见过很多人学TensorFlow时被"低层API"吓跑,一上来就开始看tf.GradientTape、手动算loss、手动更新梯度,折腾半天连个线性模型都没跑起来。
我这里想传达一个实际经验:从Keras开始,比从底层API开始,效率高十倍,而且完全不耽误你理解训练原理。
Keras提供了三种模型定义方式:
Sequential:一层层堆叠,适合最标准的线性结构,几行代码就能跑一个小模型。Functional:允许层之间自由连接,支持多输入、多输出、分支结构,是我们日常90%业务模型的最佳起点。Subclassing:把模型写成一个类,自由度最高,适合复杂自定义逻辑,但代价是调试成本更高。
我的建议是:别一上来就玩Subclassing,从Functional开始,因为它既能覆盖绝大多数真实结构,写起来又不会像Sequential那样遇到复杂模型就束手无策。
下面是一个用Functional API构建简单图像分类器的骨架,你能直观看到它的可组合性:
import tensorflow as tf from tensorflow import keras inputs = keras.Input(shape=(160, 160, 3)) x = keras.layers.Rescaling(1./255)(inputs) x = keras.layers.Conv2D(32, 3, activation='relu')(x) x = keras.layers.MaxPooling2D()(x) x = keras.layers.Conv2D(64, 3, activation='relu')(x) x = keras.layers.MaxPooling2D()(x) x = keras.layers.Flatten()(x) x = keras.layers.Dense(128, activation='relu')(x) x = keras.layers.Dropout(0.5)(x) outputs = keras.layers.Dense(10)(x) model = keras.Model(inputs, outputs)这种写法最大的好处是结构透明,每一层输入输出都清清楚楚,后面要加分支或接多个输出也很自然。
4.2 tf.data数据管道:训练速度的分水岭
很多新人忽略了一个关键问题:真正决定训练多快跑完的,往往不是模型结构,而是数据喂给GPU的速度。
如果你每次都在Python的for循环里用batch切片喂数据,GPU多半在空等CPU处理数据。TensorFlow对此给出的标准答案是tf.data。它能把数据读取、预处理、缓存、预取打包成一张流水线,让GPU尽量不闲着。
以图片分类为例,最省事的方式是直接用image_dataset_from_directory,把文件夹里的图片变成数据集:
train_ds = keras.utils.image_dataset_from_directory( 'data/train', image_size=(160, 160), batch_size=32, label_mode='int' ) val_ds = keras.utils.image_dataset_from_directory( 'data/val', image_size=(160, 160), batch_size=32, label_mode='int' )接下来就是很多人会漏掉的三连操作:
train_ds = train_ds.map(lambda x, y: (x / 255.0, y)) train_ds = train_ds.cache().shuffle(1000).prefetch(tf.data.AUTOTUNE)cache()把数据缓存到内存或磁盘,shuffle()打乱顺序,prefetch(tf.data.AUTOTUNE)让数据准备和模型训练并行。这三个操作加上之后,训练迭代速度通常会有肉眼可见的提升。
4.3 回调和模型保存的几个好习惯
训练过程中,回调是一个经常被低估的机制。它能在训练循环的特定节点自动执行一些操作,比如模型效果不再提升时提前结束、自动降低学习率、保存最优权重。我一般固定挂这三个回调:
callbacks = [ keras.callbacks.EarlyStopping(patience=3, restore_best_weights=True), keras.callbacks.ReduceLROnPlateau(patience=2, factor=0.5), keras.callbacks.ModelCheckpoint( 'best_model.keras', save_best_only=True ) ]EarlyStopping能让你不用死等完所有epoch,ReduceLROnPlateau会在验证loss停滞时自动降学习率,ModelCheckpoint保证你最后拿到的是验证集上最好的那版权重。这三个组合起来,基本可以代替手动调参的很多重复劳动。
模型保存格式上,我现在统一用.keras格式:
model.save('best_model.keras')如果你将来要部署到TF Serving,可以再导出一份SavedModel目录:
tf.saved_model.save(model, 'saved_model/1')注意1是版本号,TF Serving靠目录层级区分模型版本,这个结构不要乱来。
4.4 一个可在本地跑通的最小训练骨架
把上面这些串起来,就是一个完整的、能在本地小数据集上跑通的训练骨架:
import tensorflow as tf from tensorflow import keras train_ds = keras.utils.image_dataset_from_directory( 'data/train', image_size=(160, 160), batch_size=32, label_mode='int' ) val_ds = keras.utils.image_dataset_from_directory( 'data/val', image_size=(160, 160), batch_size=32, label_mode='int' ) train_ds = train_ds.cache().shuffle(1000).prefetch(tf.data.AUTOTUNE) val_ds = val_ds.cache().prefetch(tf.data.AUTOTUNE) model = keras.Sequential([ keras.layers.Rescaling(1./255, input_shape=(160, 160, 3)), keras.layers.Conv2D(32, 3, activation='relu'), keras.layers.MaxPooling2D(), keras.layers.Conv2D(64, 3, activation='relu'), keras.layers.MaxPooling2D(), keras.layers.Flatten(), keras.layers.Dense(128, activation='relu'), keras.layers.Dropout(0.5), keras.layers.Dense(10) ]) model.compile( optimizer='adam', loss=keras.losses.SparseCategoricalCrossentropy(from_logits=True), metrics=['accuracy'] ) model.fit( train_ds, epochs=30, validation_data=val_ds, callbacks=[ keras.callbacks.EarlyStopping(patience=3, restore_best_weights=True), keras.callbacks.ReduceLROnPlateau(patience=2, factor=0.5), keras.callbacks.ModelCheckpoint('best_model.keras', save_best_only=True), ] ) model.evaluate(val_ds)如果你的数据量不大,这个骨架几分钟就能跑完,先把整套流程走通,再逐步把模型结构换得更复杂。
5. 练到一半崩溃的排查手记:显存、随机种与数据管道
5.1 显存溢出不是玄学:三种常见原因与对策
训练跑着跑着突然报Resource exhausted: OOM when allocating tensor,这个错误基本是显存爆了。我先说一个反常识的规律:OOM不一定是你的模型太大,很多时候是环境配置和数据管道的问题。
第一种情况是TensorFlow默认会预占几乎全部GPU显存。很多新人一上来就在共享GPU服务器上踩到这个坑,模型明明很小,但nvidia-smi一看显存被吃光了。解决办法是开启显存增长模式:
gpus = tf.config.experimental.list_physical_devices('GPU') if gpus: for gpu in gpus: tf.config.experimental.set_memory_growth(gpu, True)这样TensorFlow会按需分配显存,而不是一开始就把整张卡占满。
第二种情况是batch_size太大。尤其是图片模型,batch_size每翻一倍,显存占用就跟着翻倍。遇到OOM最直接的调整方式就是把batch_size从64降到32,或者再把图片分辨率调低一档。
第三种情况最隐蔽,是数据在cache()里把内存吃光了。如果你把整个大数据集cache()到内存,GPU显存没爆,主机内存反而先爆了,然后整体拖慢。这种情况下把它改成cache(filename='data_cache')写到磁盘缓存,比内存缓存对大数据集更友好。
5.2 训练结果无法复现:随机种子与GPU非确定性
另一个经典问题:同一个脚本跑两遍,准确率不一样,甚至有时差得挺多。
这里面有两大来源。第一是Python层面的随机性,处理办法是在脚本最前面固定三处随机种子:
import os import random import numpy as np import tensorflow as tf os.environ['PYTHONHASHSEED'] = '42' random.seed(42) np.random.seed(42) tf.random.set_seed(42)第二是GPU并行计算本身的非确定性。GPU上浮点运算的并行顺序不固定,比如矩阵乘法里几个计算单元谁先完成,结果可能在小数点后几位上不同,这种差异在训练初期可能被累积放大。想完全消除几乎不可能,但如果你只是希望实验可对比,上面那套种子设置就够了。
提示:如果某个实验特别强调"完全可复现",最稳妥的方式是固定环境版本(Python版本、TensorFlow版本、CUDA版本、cuDNN版本),并记录在项目说明文件里。因为种子只能控制随机数序列,控制不了底层库版本差异带来的影响。
5.3 GPU利用率上不去:瓶颈往往不在模型而在数据
还有一种让人摸不着头脑的情况:GPU利用率一直很低,nvidia-smi看着只有30%左右,训练速度也上不去。这时候先别怀疑模型太简单,优先检查数据管道。
最常见的瓶颈是数据预处理卡在CPU上。比如你的map函数里做了图片解码、缩放、归一化,如果不用AUTOTUNE让预取自动调优,CPU在喂数据这件事上就会成为瓶颈,GPU就只能干等着。
另一个容易被忽略的点是**num_parallel_calls**。map越长、越复杂,越应该开并行:
train_ds = train_ds.map( lambda x, y: (tf.image.random_flip_left_right(x), y), num_parallel_calls=tf.data.AUTOTUNE )如果你怀疑瓶颈在数据管道,最简单的验证方式是把model.fit里的steps_per_epoch调小,如果GPU利用率立刻上去了,那问题就基本坐实在数据侧。
5.4 老代码跑不动的API版本问题:分清TF1与TF2时代的遗留
最后一个高频排查现场,是从网上找的旧教程代码报错。这往往不是因为你的环境坏了,而是因为教程写于TensorFlow 1.x时代。
TensorFlow 1.x里的Session、placeholder、tf.variable_scope、tf.Session().run()这类API,在TensorFlow 2.x默认Eager执行模式下已经不复存在。如果你在网上看到以这些关键词开头的代码,不要硬搬,先确认教程对应的TensorFlow版本。Keras出现之前的低层API教程尤其容易踩这个坑。
我的处理策略是:老代码先看大结构,如果整个就是TF1风格,那不如直接用Keras重写一遍,成本往往比在旧代码上打补丁要低。如果是TF2时代但用了tf.compat.v1这种兼容层,再看情况决定要不要用,但新代码我基本不支持继续吃这个"历史包袱"。
6. 它适不适合你:我给三类读者的几句实话
6.1 不同起点的人,我的建议完全不同
如果你正在做学术研究或者快速原型验证,那我不会劝你硬转TensorFlow。PyTorch的社区惯性太强了,研究圈的代码、权重、预训练模型都围绕它转,你去硬适配TensorFlow就是在给自己添堵,没必要。
但如果你所在的团队是要做产品、要上线、要维护多年不换代的系统,那TensorFlow这条工程链路确实值得认真投入。我亲眼见过几个项目在PyTorch里把模型调得很好,临到上线才发现部署链路处处要自己拼装,回头又来研究TF Serving和SavedModel。与其这样绕远路,不如一开始就判断清楚产物形态。
如果你是完全的新手,刚接触深度学习,那我建议你先不要陷入框架之争。找一个框架,把Keras或PyTorch的官方教程从头到尾手敲一遍,理解训练循环、梯度、损失函数这些核心概念,比纠结选边重要得多。框架是工具箱,核心是建模思维和调试能力,工具可以换,但是底子不能虚。
6.2 一个让我少踩很多坑的笨习惯
最后分享一个我自己的"笨办法",帮我避开了大量环境问题。
我从几年前开始,每一个TensorFlow项目都会在根目录放一份requirements.txt,但里面除了直接依赖的包,还会额外记录几个关键环境信息:Python解释器版本、CUDA版本、cuDNN版本、TensorFlow具体的小版本号。别小看这个习惯,很多看起来"玄学"的报错,最后排查来排查去,都是因为某个人悄悄升级了某个依赖。
如果你用Docker做开发环境,那我更建议直接把环境固定成镜像,训练和部署都用同一个镜像。这比任何代码层面的约定都来得可靠,能保证你今天跑通的东西,三个月后机器重启依然能跑通。
刚接触TensorFlow那两年,我在网上刷过无数篇安装教程和框架对比帖,后来发现大部分争执都没落在自己的使用场景上。如果你只是跑跑模型,TensorFlow和PyTorch都能做到;如果你要把它变成业务里长期存在的一个服务,TensorFlow这条链路我帮不少项目踩平过。真要说哪个框架天下第一,热搜词就不会年年都有人搜了。