TensorFlow2 完整学习路线:30 天从第一个模型到生产部署

TensorFlow2 完整学习路线:30 天从第一个模型到生产部署

【免费下载链接】eat_tensorflow2_in_30_days Tensorflow2.0 🍎🍊 is delicious, just eat it! 😋😋 【免费下载链接】eat_tensorflow2_in_30_days 项目地址: https://gitcode.com/gh_mirrors/ea/eat_tensorflow2_in_30_days

假设你刚入职,组里有个新模型要立项,而你手里的 TensorFlow2 经验基本为零。主管问你三件事:用什么框架、环境怎么搭、训练完的模型怎么上线?这三个问题,恰好对应 TensorFlow2 学习路上的三大关卡:选型、训练、部署。开源项目 eat_tensorflow2_in_30_days(《30天吃掉那只 TensorFlow2》)把这条路线拆成了 30 章,每章配可运行的完整范例。下面我用工程任务的顺序把它重新讲一遍,你不必按原书顺序读,直接按自己的卡点跳转即可。

框架选型:工程师和研究者答案不一样

先说结论:做工程落地,选 TensorFlow2;做科研迭代,选 PyTorch。

  • 工程师选 TensorFlow2 的原因不在训练体验,而在后半程。国内大多数互联网公司的在线推理服务栈是为 TensorFlow 模型准备的,模型能不能部署上线,往往比训练方便与否更致命。而且工业界偏好高可用、架构成熟的方案,很少需要频繁调试实验性网络。
  • 研究者选 PyTorch 的原因在迭代速度。发论文要快速试新架构,PyTorch 动态执行、调试友好,且 2019 年后学术界的主流产出基本都基于它,最新代码最容易找到。
  • 时间够就都学。两者的编程风格如今高度相似,学会一个再学另一个的成本很低。

还有一个高频疑问:装了 pip 的 Keras 还能用吗? 别装了。Keras 本质上是一套高层接口规范,pip 版 Keras 可对接多种后端;而 tf.keras 是 TensorFlow 基于自家底层 API 实现的同一套接口,两者用法几乎一致,但 tf.keras 与 TensorFlow 的耦合更紧。Keras 库在 2.3.0 之后已停止更新,所以 TensorFlow2 时代直接用 tf.keras,这是本书所有代码的默认写法。

环境搭建:10 分钟跑通第一段 TensorFlow2 代码

全书代码基于 Jupyter 编写,建议克隆到本地交互式运行:

git clone https://gitcode.com/gh_mirrors/ea/eat_tensorflow2_in_30_days
pip install -U tensorflow

再用一段最小代码验证环境是否就绪——它会创建两个字符串张量并拼接:

import tensorflow as tf
tf.print("tensorflow version:", tf.__version__)
a, b = tf.constant("hello"), tf.constant("world")
tf.print(tf.strings.join([a, b], " "))

两个注意点:

  • 书中代码以 TensorFlow 2.1 为基准验证,装最新版通常没问题,但个别 API 有变更,例如 model.predict_classes 已被移除(对 model.predict 结果取 argmax 即可);
  • 仓库 data/ 目录自带 titanic、cifar2、imdb 等配套数据集和训练好的模型文件,不用自己找数据。

第一个里程碑:跑通一个完整模型

无论数据长什么样,TensorFlow 建模流程都是六步:准备数据 → 定义模型 → 训练 → 评估 → 预测 → 保存。新手真正的难点在第一步,而难点由数据类型决定。四类数据的关键差异如下:

  • 结构化数据(如 titanic 生存预测):先用 Pandas 补齐缺失值、把类别列转成 onehot,喂进普通全连接网络;
  • 图片数据(如 cifar2 飞机/汽车二分类):用 tf.data 管道解码图片,喂进卷积网络;
  • 文本数据(如 imdb 影评情感分类):核心是"分词 + 定长序列化"——把文本变成整数序列并用 pad_sequences 补齐到统一长度,再进 Embedding 和卷积/LSTM;
  • 时间序列(如疫情曲线预测):核心是"滑动窗口"——把最近 N 天当输入、第 N+1 天当标签,把预测问题改写成监督学习。

cifar2 图片分类数据集样本

以图片任务为例,训练完的模型有两条保存路线:Keras 格式(model.save('model.h5'),只适合 Python 环境加载)和 SavedModel 格式(model.save('dir', save_format="tf"),跨语言、便于部署)。后者是生产环境的默认选择,第六节会用到。

三大基础概念:张量、计算图、自动微分

看懂这三个词,你就理解了"TensorFlow"这个名字的由来——Tensor(张量)+ Flow(计算图上的数据流)。

张量就是多维数组。标量是 0 维、向量是 1 维、矩阵是 2 维,彩色图片是 3 维(高、宽、RGB 通道)。它和 numpy 数组几乎一一对应,分两种角色:常量(值不可改)和变量(可重新赋值,模型里所有待训练参数都是变量)。

计算图记录"先算什么、后算什么",TF2 里有三种形态:

  1. 静态图(TF1 时代):先定义图,再开 Session 执行,两步分离;
  2. 动态图(TF2 默认,即 Eager 模式):每行代码执行即算,调试体验和原生 Python 一致,但 Python 与 C++ 内核频繁通信,效率偏低;
  3. Autograph(@tf.function):给普通函数加个装饰器,TF 自动把它转成静态图。首次调用时构建并缓存,之后直接复用。

工程惯例是:动态图写代码、调 bug,关键路径再加 @tf.function 提速:

@tf.function
def strjoin(x, y):
    return tf.strings.join([x, y], " ")

自动微分解决"梯度谁来算"。反向传播的求导由 tf.GradientTape(梯度磁带)自动完成:

x = tf.Variable(0.0)
with tf.GradientTape() as tape:
    y = x * x - 4 * x
print(tape.gradient(y, x))   # -4.0

训练循环的本质就是"开磁带 → 前向计算 → 取梯度 → 优化器更新参数",四行搞定。

Autograph 生成的图可以用 TensorBoard 可视化,仓库里保存了多份 trace 日志供对照观察:

TensorBoard 中 Autograph 计算图可视化

API 分层体系:低阶、中阶、高阶各管什么事

TensorFlow 的 API 像盖楼,从硬件层往上依次是:内核层 → 低阶 API → 中阶 API → 高阶 API,每层封装下一层,你可以按需要取用不同"装修等级"的接口。

TensorFlow 五层 API 层次结构图

层级代表接口一句话定位适合场景
低阶 APItf.Variable、tf.constant、tf.GradientTape、tf.function原料:张量操作、计算图、自动微分写自定义算子、研究框架内部机制
中阶 APItf.keras.layers、tf.keras.losses、tf.keras.optimizers、tf.data.Dataset、tf.feature_column预制件:模型层、损失、优化器、数据管道组装训练组件、做特征工程
高阶 APItf.keras.models(Sequential / 函数式 / 子类化)成品房:声明模型、一行 fit 训练绝大多数工程与日常建模

选择原则很直接:能用高阶就别碰低阶。低阶 API 的价值在于"出了怪问题时下钻排查",以及实现 tf.keras 里没有的自定义逻辑,而不是日常拿来写业务。

训练为什么慢:数据管道的三个提速手段

模型在 GPU 上算力富余时,瓶颈常常是"数据喂不上来"。TensorFlow 数据管道(tf.data)给你三个标准加速手段:

  1. prefetch:让"下一批数据准备"和"当前一批训练"并行,训练不再等 IO;
  2. num_parallel_calls=tf.data.AUTOTUNE:让 map 里的解码、缩放等预处理并行执行,线程数自动选;
  3. cache:数据集不大时首个 epoch 后缓存进内存,后续 epoch 免去重复读盘。

三招叠加的典型写法:

ds = tf.data.Dataset.list_files("./data/cifr2/train/*/*.jpg")
ds = ds.map(load_image, num_parallel_calls=tf.data.experimental.AUTOTUNE)
ds = ds.shuffle(1000).batch(100).prefetch(tf.data.AUTOTUNE)

注意版本差异:2.4 之后 tf.data.experimental.AUTOTUNE 已提升到 tf.data.AUTOTUNE。书中用计时实验直观演示了效果——同样 10 批数据,串行准备需 30 秒,加 prefetch 后降到 20 秒,再叠加 cache 直接减半。

单 GPU 到 TPU:硬件加速的三级跳

训练提速的第二级是换硬件,TF2 用 tf.distribute 统一了三种策略:

  • 单 GPU:用 tf.config.experimental.set_memory_growth(gpu, True) 让显存按需增长,避免 TF 启动就占满显存;
  • 多 GPU:核心是 MirroredStrategy(镜像策略)——在它的 scope() 里定义模型,框架自动把 batch 切给每张卡、同步梯度,等于免费的数据并行:
strategy = tf.distribute.MirroredStrategy()
with strategy.scope():
    model = build_model()
    model.compile(optimizer="adam", loss="mse")
model.fit(ds, epochs=10)
  • TPU:通过 tf.distribute.TPUStrategy 连接,主要用于 Google Colab、Kaggle 等云环境,用法与多 GPU 几乎相同,只是 resolver 换成 TPU 集群地址。

Colab GPU 训练速度实测

书中给出了云 GPU 环境下的实测速度截图,本地没有卡也能跟着走完流程。

部署上线:tensorflow-serving 四步清单

模型训练完只是完成一半,上线服务才是交付。用 tensorflow-serving 部署的完整清单:

  1. 导出模型:model.save('dir/version', save_format="tf") 生成 SavedModel 目录(含 saved_model.pb 与 variables/);
  2. 检查签名:用命令行确认输入输出 tensor 的名字、形状、类型,这是后续请求的"接口文档":
saved_model_cli show --dir ./data/linear_model/1 --all

saved_model_cli 查看模型签名信息输出

  1. 启动服务:推荐 Docker 方式,一行命令拉起镜像并挂载模型目录,开放 gRPC(8500)与 REST(8501)两个端口;
  2. 发请求验证:任何语言都能调,curl 最直观:
curl -d '{"instances": [[1.0, 2.0], [5.0, 7.0]]}' \
    -X POST http://localhost:8501/v1/models/linear_model:predict

拿到 predictions 数组,模型就正式在线了。如果还有 Spark 离线大批量推理的需求,书里额外演示了用 spark-scala 加载同一份 SavedModel 的路径。完整步骤见 6-6,使用tensorflow-serving部署模型.md。

30 天学习路径:按四个里程碑走

不必死磕日历,按里程碑推进、每个里程碑以"能跑通"为验收标准。难度用 ⭐ 标注,时间按每天 1 小时左右的节奏估算:

里程碑一:跑通四类模型(约 7 小时)

  • 结构化数据建模(titanic 生存预测):⭐⭐⭐,约 1 小时
  • 图片数据建模(cifar2 分类):⭐⭐⭐⭐,约 2 小时
  • 文本数据建模(imdb 情感分类):⭐⭐⭐⭐⭐,约 2 小时
  • 时间序列建模(疫情曲线预测):⭐⭐⭐⭐⭐,约 2 小时

里程碑二:看懂底层原理(约 4 小时)

  • 张量数据结构与常量/变量:⭐⭐⭐⭐,约 1 小时
  • 三种计算图(静态 / 动态 / Autograph):⭐⭐⭐⭐⭐,约 2 小时
  • 自动微分与 GradientTape 训练循环:⭐⭐⭐,约 1 小时

里程碑三:灵活选用 API(约 9 小时)

  • 低阶 API:张量结构操作、数学运算、Autograph 机制:⭐⭐~⭐⭐⭐⭐⭐,约 5 小时
  • 中阶 API:Dataset、特征列、激活、层、损失、指标、优化器、回调:⭐⭐⭐~⭐⭐⭐⭐,约 6 小时(可只精读用到的部分)

里程碑四:上生产(约 6 小时)

  • 三种模型构建方式 + 三种训练方式:⭐⭐⭐,约 2 小时
  • 单 GPU / 多 GPU / TPU 加速:⭐⭐,约 1.5 小时
  • tensorflow-serving 部署 + spark-scala 调用:⭐⭐⭐⭐~⭐⭐⭐⭐⭐,约 2.5 小时

全书章节文档在仓库根目录按编号存放,合并版电子书见 eat_tf2_ebook.md,英文读者可看 english/ 目录的译文。

结语:带走这份行动清单

如果今天就要动手,按这个顺序来:

  1. 克隆仓库,装好 tensorflow,跑通版本验证代码(10 分钟);
  2. 打开 titanic 范例,跑通六步建模流程,亲手改一次网络结构看 AUC 变化;
  3. 给训练函数加 @tf.function,用 TensorBoard 观察提速后的计算图;
  4. 把模型存成 SavedModel,saved_model_cli 核对签名;
  5. 起一个 tensorflow-serving 容器,用 curl 拿到第一次线上预测。

做完这五步,你就走过了 TensorFlow2 从学习、训练到部署的完整闭环——剩下的,只是按同一套路换成自己的数据。

【免费下载链接】eat_tensorflow2_in_30_days Tensorflow2.0 🍎🍊 is delicious, just eat it! 😋😋 【免费下载链接】eat_tensorflow2_in_30_days 项目地址: https://gitcode.com/gh_mirrors/ea/eat_tensorflow2_in_30_days

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值