☰
在 Cloud TPU 上训练 DeepLab V3 语义分割模型:基于 PASCAL VOC 2012 的完整实战指南
2026/10/13 2:45:30 网站建设 项目流程
  • 深度学习
  • 后端
  • 开发工具

【免费下载链接】tpu

Reference models and tools for Cloud TPUs.

项目地址:https://gitcode.com/gh_mirrors/tpu/tpu
点击查看免费下载

本指南以 tpu 仓库中 models/experimental/deeplab 为蓝本,系统讲解如何在 Google Cloud TPU 上训练与评估 DeepLab V3 语义分割模型。你将掌握从环境搭建、数据集与预训练权重准备,到训练/评估命令与全部核心参数,再到数据管线、多尺度网络构建、MIOU 评估等源码级实现原理的完整链路,可直接复现接近 0.74 MIOU(使用 train_aug 增强集可达约 0.77)的 VOC 2012 分割结果。

一、前置条件:搭建 Cloud TPU 运行环境

DeepLab on Cloud TPU 的完整运行依赖 Google Cloud 环境、tensorflow/models 中的 Deeplab 库以及可用的 PASCAL VOC 2012 数据与预训练权重,按以下三步准备即可。

1.1 创建 Google Cloud 项目并开通 TPU

在运行模型前,需要一台与 Cloud TPU 资源绑定的 GCE 虚拟机(Compute Engine VM)。官方 Quickstart 流程会引导完成项目的创建、TPU 资源的申请以及 VM 与 TPU 的关联。

运行本模型必须具备三样东西:

  • 一台关联了 Cloud TPU 资源的 GCE VM 实例;
  • 一个存放训练 checkpoint 的 GCS 存储桶;
  • 一个存放训练与评估数据的 GCS 存储桶。

由于训练过程中的 checkpoint、TFRecord 数据集都以 GCS 路径(gs://)访问,建议提前创建好存储桶并确保 VM 具备读写权限。

1.2 安装 tensorflow/models 下的 Deeplab 库

DeepLab on Cloud TPU 本身是依赖型实现:它不重复实现网络骨干、ASPP、Decoder 等全部细节,而是直接复用tensorflow/models仓库research/deeplab目录下的库代码。因此必须先按其安装说明将该库加入PYTHONPATH并验证安装成功。

这一点从本仓库源码可以清楚印证:main.py中直接from deeplab import common、from deeplab.deprecated import segmentation_dataset,model.py中from deeplab.core import feature_extractor、from deeplab.model import multi_scale_logits等导入全部指向外部 Deeplab 库。

除此之外,还需要按照tpu仓库顶层说明,把models目录本身加入 Python 路径:

export PYTHONPATH="$PYTHONPATH:/path/to/models"

1.3 准备 PASCAL VOC 2012 语义分割数据集

数据集可使用 tensorflow/models 官方提供的脚本research/deeplab/datasets/download_and_convert_voc2012.sh一键完成下载与 TFRecord 格式转换。转换产物包含训练集train、增强训练集train_aug(额外加入了 SBD 增强标注,样本量更大)与验证集val等多个 split,后续可通过--train_split/--eval_split参数选择。

1.4 准备预训练骨干权重

DeepLab V3 的骨干网络通常先在 ImageNet 上预训练。README 中特别推荐使用经过修改的 ResNet-101(ImageNet 预训练)权重,在后续训练命令中通过--init_checkpoint指定其路径。若没有该权重,训练将从零开始,收敛速度与最终精度都会明显下降。

二、代码结构:理解本仓库的 DeepLab 实现

models/experimental/deeplab目录结构非常精简,只有 4 个文件,职责划分清晰:

文件职责
README.md使用说明:前置条件、训练/评估命令、预期精度
main.py训练与评估入口:flag 定义、TPUEstimator 装配、模式调度
model.pymodel_fn:网络构建、损失、优化器、评估指标
data_pipeline.pyInputReader:TFRecord 读取、预处理、批量化

三者形成清晰的调用链:main.py构建TPUEstimator(model_fn=model.model_fn, ...),训练/评估时由data_pipeline.InputReader提供数据批次,model.py完成前向、损失与指标计算。下一节先看如何实战运行,第四节再深入源码原理。

三、训练与评估实战

3.1 启动训练

训练命令如下(在models/experimental/deeplab目录下执行):

python main.py \ --mode='train' \ --num_shards=8 \ --train_split='train' \ --alsologtostderr=true \ --model_dir=${MODEL_DIR} \ --dataset_dir=${DATASET_DIR} \ --init_checkpoint=${INIT_CHECKPOINT} \ --model_variant=resnet_v1_101_beta \ --image_pyramid=1. \ --aspp_with_separable_conv=false \ --multi_grid=1,2,4 \ --decoder_use_separable_conv=false

各环境变量的含义:

  • ${MODEL_DIR}:checkpoint 与 TensorBoard 摘要的写入目录(GCS 或本地路径);
  • ${DATASET_DIR}:存放 TFRecord 数据集的目录;
  • ${INIT_CHECKPOINT}:上一步下载的 ResNet-101 预训练权重路径。

训练完成后,只需将--mode改为eval即可复用同一份参数进行评估。README 给出的参考指标为:使用trainsplit 训练约 9 小时,MIOU 接近0.74;若使用增强集--train_split=train_aug,MIOU 应接近0.77。

3.2 三种运行模式

main.py通过--mode控制运行方式(默认值为train_and_eval,见 main.py):

mode行为
train只训练--train_steps(默认 50000)步后结束
eval持续监听--model_dir下新出现的 checkpoint,逐个评估;达到最终训练步数后自动退出(对应 main.py 中基于checkpoints_iterator的循环)
train_and_eval训练与评估交错进行:每训练--steps_per_eval(默认 2000)步保存一次 checkpoint 并立即评估一次(对应 train_and_eval 函数)

3.3 核心参数详解

main.py中注册了约 30 个 flag,分组说明如下。其中--image_pyramid、--multi_grid、--aspp_with_separable_conv、--decoder_use_separable_conv等网络结构参数并不在本仓库定义——从源码结构看,它们由所依赖的 tensorflow/models Deeplab 库(deeplab/common.py)注册,本仓库main.py通过from deeplab import common导入后即可在命令行直接使用,get_params会将全部 flag 值收集进参数字典供模型使用。

数据集设置

参数默认值说明
--dataset_namepascal_voc_seg分割数据集名称,对应segmentation_dataset.get_dataset的注册名
--train_splittrain_aug训练所用 split;README 命令中显式指定为train
--eval_splitval评估所用 split
--dataset_dir无数据集根目录(必填)

预处理设置

参数默认值说明
--crop_size513,513训练裁剪尺寸[height, width](多值 flag,逗号分隔)
--min_scale_factor0.5数据增强随机缩放的最小比例
--max_scale_factor2.0数据增强随机缩放的最大比例
--scale_factor_step_size0.25缩放因子的离散步长,用于在区间内等距采样

模型结构设置

参数默认值说明
--atrous_rates6,12,18ASPP(空洞空间金字塔池化)中各分支的空洞率
--output_stride16输入与输出空间分辨率之比
--fine_tune_batch_normTrue是否微调 BatchNorm 参数
--upsample_logitsTrue训练期间是否对 logits 上采样后计算损失

训练与评估设置

参数默认值说明
--learning_policypoly学习率策略,可选poly或step
--weight_decay0.0001L2 权重衰减系数
--learning_rate0.01初始学习率
--learning_rate_decay0.97step策略下的学习率衰减率
--learning_power0.9poly策略的幂指数
--optimizermomentum优化器,可选momentum/sgd/rmsprop
--momentum0.9Momentum 优化器的动量(使用 Nesterov 变体)
--train_batch_size64训练 batch size
--eval_batch_size8评估 batch size(代码注释说明取 8×num_shards 以适配 TPU 内存分块)
--train_steps50000训练总步数
--steps_per_eval2000train_and_eval模式下两次评估之间的训练步数
--save_checkpoints_steps2000checkpoint 保存间隔
--model_dir无Estimator 模型目录(必填)
--init_checkpoint无用于初始化骨干网络的预训练 checkpoint
--eval_timeout无eval模式下等待新 checkpoint 的最大秒数

TPU 设置

参数默认值说明
--num_shards8TPU 分片数(对应 TPU 芯片数量)
--use_tpuTrue使用 TPU 而非 CPU
--use_bfloat16False是否使用 bfloat16 训练
--iterations_per_loop2000TPU 上连续执行的步数,之后将指标回传 CPU;越大 TPU 利用率越高
--use_host_callTrue是否通过 host_call 在每个训练步生成摘要(loss、学习率等),供 TensorBoard 使用
--tpu无Cloud TPU 名称或grpc://ip:8470地址
--gcp_project无TPU 所在项目名,缺省时自动从 GCE metadata 探测
--tpu_zone无TPU 所在 GCE zone,缺省时自动探测

四、源码级原理剖析

4.1 数据管线:InputReader 与预处理

data_pipeline.InputReader负责把 TFRecord 数据集转成 TPU 可消费的 batch,其构造参数包括dataset、split_name、is_training与model_variant(后者用于选择对应的图像均值减除方式,见 data_pipeline.py)。

关键实现细节:

  • 数据读取使用slim.dataset_data_provider.DatasetDataProvider,训练时开启shuffle且num_epochs=None(无限循环),评估时关闭 shuffle 且只跑一个 epoch(data_pipeline.py);
  • 标签必须是[height, width]或[height, width, 1]形状,否则抛ValueError,随后统一 reshape 为[None, None, 1](data_pipeline.py);
  • 预处理复用外部 Deeplab 库的input_preprocess.preprocess_image_and_label,完成随机裁剪(crop_size)、随机缩放(min/max_scale_factor与步长)、均值减除等增强操作(data_pipeline.py);
  • 批量化使用tf.train.batch:训练时 64 个线程,评估时降为 1 个线程,并额外保存original_image供可视化使用;容量设为32 * batch_size并开启dynamic_pad(data_pipeline.py)。

4.2 网络构建:多尺度 logits 与 bfloat16

model.py中的_build_network调用外部 Deeplab 库的multi_scale_logits构建网络,支持按image_pyramid指定的多个尺度分别前向,最终在merged_logitsscope 下融合多尺度结果(对应 model.py 与常量_MERGED_LOGITS_SCOPE)。

当启用--use_bfloat16时,整个网络在bfloat16.bfloat16_scope()内构建以利用 TPU 的 bfloat16 加速能力,随后把各尺度 logits 显式tf.cast回tf.float32,保证数值稳定性(model.py)。README 训练命令中--image_pyramid=1.表示仅使用原始尺度一个尺度。

model_variant不仅决定骨干网络(如resnet_v1_101_beta),还用于 checkpoint 恢复时的变量作用域映射:model_fn在提供init_checkpoint且处于训练模式时,通过feature_extractor.name_scope[model_variant]构造变量前缀,用tf.train.init_from_checkpoint完成骨干部分权重加载(model.py)。

4.3 损失函数:多尺度交叉熵 + L2 正则

loss_fn的核心逻辑(model.py):

  1. 对每个输出尺度调用add_softmax_cross_entropy_loss_for_each_scale计算 softmax 交叉熵损失,ignore_label区域不参与损失计算,upsample_logits控制是否先上采样 logits 再与标签对齐;
  2. 所有尺度损失求和得到losses;
  3. 手工收集所有名称含weights且不含BatchNorm的可训练变量计算 L2 损失——BatchNorm 的缩放/偏移参数不做权重衰减;
  4. 最终loss = losses + weight_decay * l2_loss。

4.4 优化器与学习率策略

优化器由_get_optimizer按--optimizer选择(model.py):

  • momentum:MomentumOptimizer,momentum=0.9且use_nesterov=True(README 默认命令使用此配置);
  • sgd:普通梯度下降;
  • rmsprop:RMSProp,epsilon与momentum由外部 Deeplab 库参数提供。

学习率由_get_learning_rate按--learning_policy选择(model.py):

  • poly:tf.train.polynomial_decay,从learning_rate多项式衰减到 0,幂指数learning_power=0.9;
  • step:tf.train.exponential_decay,每过num_batches_per_epoch(一个 epoch 的 batch 数)按learning_rate_decay=0.97阶梯式衰减。

在 TPU 模式下,优化器会包一层contrib_tpu.CrossShardOptimizer实现跨分片(跨芯片)梯度同步(model.py);同时把 BatchNorm 的UPDATE_OPS作为train_op的依赖加入,确保 moving mean/variance 正确更新(model.py)。

4.5 评估指标:MIOU 的正确计算方式

_create_eval_metric展示了语义分割标准指标 MIOU(mean Intersection over Union)在 TPU 上的实现细节(model.py):

  1. 将融合后的 logits 用tf.image.resize_bilinear双线性上采样回crop_size,保证与标签分辨率一致;
  2. tf.argmax得到逐像素预测类别,reshape 成一维;
  3. 关键技巧:tf.metrics.mean_iou要求标签取值范围是[0, num_classes),因此先把ignore_label区域置 0,再通过weights掩码把这些区域排除在统计之外(model.py),从而保证 ignore 区域既不影响分母也不影响分子。

4.6 训练摘要与 checkpoint 协调

train_and_eval函数实现“训练一段、评估一次”的循环:每轮训练steps_per_eval步后保存 checkpoint,随即用eval_dataset.num_samples // eval_batch_size步完成整轮评估(main.py)。训练摘要通过host_call机制在 CPU host 侧生成loss、learning_rate、current_epoch三个标量写入model_dir供 TensorBoard 查看(model.py)。

eval模式则用checkpoints_iterator持续监听新 checkpoint,并对 TPU worker 初始化慢于 CPU 任务导致的 checkpoint 已删除情况做了容错(捕获NotFoundError后跳过继续监听,见 main.py)。

五、注意事项与常见问题

  • use_host_call必须为 True:源码注释明确指出(main.py),该 flag 用于每步生成训练摘要;若置为 False,且 host_call 较慢跟不上 TPU 计算时,可能出现性能下降。
  • num_shards与 TPU 规格匹配:命令中--num_shards=8对应 8 核 TPU(如 v2-8/v3-8);eval_batch_size默认取8 × num_shards以充分利用 TPU 内存分块。
  • batch_size缩放:换用更大的 TPU(如 32/128 核)时,train_batch_size、eval_batch_size需按分片数等比放大,同时可考虑适当调整learning_rate。
  • iterations_per_loop越大越好:TPU 上连续执行的步数越多、与 CPU 的同步越少,利用率越高;但会受train_steps上限约束。
  • 评估等待超时:eval模式建议设置--eval_timeout,避免训练停滞时评估任务无限等待。
  • image_pyramid、multi_grid等结构参数由 tensorflow/models Deeplab 库提供,README 中--image_pyramid=1.(单尺度)、--multi_grid=1,2,4(多网格空洞卷积)、--aspp_with_separable_conv=false与--decoder_use_separable_conv=false(禁用可分离卷积,换取精度)是经过验证的标准配置组合。

六、总结

本指南完整覆盖了 Cloud TPU 上 DeepLab V3 语义分割的端到端流程:环境与依赖准备、VOC 2012 数据与预训练权重获取、训练/评估命令与全部参数语义,以及从数据管线、多尺度网络、损失与优化器到 MIOU 指标计算和 TPU 训练协调的源码级原理。仓库中的 README.md、main.py、model.py 与 data_pipeline.py 是可直接复用的完整参考实现,按文中命令配置即可在约 9 小时内复现接近 0.74 MIOU(trainsplit)或接近 0.77 MIOU(train_augsplit)的 VOC 2012 分割模型。

  • 深度学习
  • 后端
  • 开发工具

【免费下载链接】tpu

Reference models and tools for Cloud TPUs.

项目地址:https://gitcode.com/gh_mirrors/tpu/tpu
点击查看免费下载

相关推荐

上一篇:Terraform AWS Provider 数据源详解:aws_prometheus_workspace 读取 Amazon Managed Prometheus 工作区
下一篇:Balena Etcher终极指南:如何三步制作完美系统启动盘

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

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

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

立即咨询