- 深度学习
- 后端
- 开发工具
【免费下载链接】tpu
Reference models and tools for Cloud TPUs.
本指南以 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.py | model_fn:网络构建、损失、优化器、评估指标 |
| data_pipeline.py | InputReader: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_name | pascal_voc_seg | 分割数据集名称,对应segmentation_dataset.get_dataset的注册名 |
--train_split | train_aug | 训练所用 split;README 命令中显式指定为train |
--eval_split | val | 评估所用 split |
--dataset_dir | 无 | 数据集根目录(必填) |
预处理设置
| 参数 | 默认值 | 说明 |
|---|---|---|
--crop_size | 513,513 | 训练裁剪尺寸[height, width](多值 flag,逗号分隔) |
--min_scale_factor | 0.5 | 数据增强随机缩放的最小比例 |
--max_scale_factor | 2.0 | 数据增强随机缩放的最大比例 |
--scale_factor_step_size | 0.25 | 缩放因子的离散步长,用于在区间内等距采样 |
模型结构设置
| 参数 | 默认值 | 说明 |
|---|---|---|
--atrous_rates | 6,12,18 | ASPP(空洞空间金字塔池化)中各分支的空洞率 |
--output_stride | 16 | 输入与输出空间分辨率之比 |
--fine_tune_batch_norm | True | 是否微调 BatchNorm 参数 |
--upsample_logits | True | 训练期间是否对 logits 上采样后计算损失 |
训练与评估设置
| 参数 | 默认值 | 说明 |
|---|---|---|
--learning_policy | poly | 学习率策略,可选poly或step |
--weight_decay | 0.0001 | L2 权重衰减系数 |
--learning_rate | 0.01 | 初始学习率 |
--learning_rate_decay | 0.97 | step策略下的学习率衰减率 |
--learning_power | 0.9 | poly策略的幂指数 |
--optimizer | momentum | 优化器,可选momentum/sgd/rmsprop |
--momentum | 0.9 | Momentum 优化器的动量(使用 Nesterov 变体) |
--train_batch_size | 64 | 训练 batch size |
--eval_batch_size | 8 | 评估 batch size(代码注释说明取 8×num_shards 以适配 TPU 内存分块) |
--train_steps | 50000 | 训练总步数 |
--steps_per_eval | 2000 | train_and_eval模式下两次评估之间的训练步数 |
--save_checkpoints_steps | 2000 | checkpoint 保存间隔 |
--model_dir | 无 | Estimator 模型目录(必填) |
--init_checkpoint | 无 | 用于初始化骨干网络的预训练 checkpoint |
--eval_timeout | 无 | eval模式下等待新 checkpoint 的最大秒数 |
TPU 设置
| 参数 | 默认值 | 说明 |
|---|---|---|
--num_shards | 8 | TPU 分片数(对应 TPU 芯片数量) |
--use_tpu | True | 使用 TPU 而非 CPU |
--use_bfloat16 | False | 是否使用 bfloat16 训练 |
--iterations_per_loop | 2000 | TPU 上连续执行的步数,之后将指标回传 CPU;越大 TPU 利用率越高 |
--use_host_call | True | 是否通过 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):
- 对每个输出尺度调用
add_softmax_cross_entropy_loss_for_each_scale计算 softmax 交叉熵损失,ignore_label区域不参与损失计算,upsample_logits控制是否先上采样 logits 再与标签对齐; - 所有尺度损失求和得到
losses; - 手工收集所有名称含
weights且不含BatchNorm的可训练变量计算 L2 损失——BatchNorm 的缩放/偏移参数不做权重衰减; - 最终
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):
- 将融合后的 logits 用
tf.image.resize_bilinear双线性上采样回crop_size,保证与标签分辨率一致; tf.argmax得到逐像素预测类别,reshape 成一维;- 关键技巧:
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.
相关推荐
使用 TensorFlow DeepLab 在 PASCAL VOC 2012 上完成语义分割全流程实战(数据转换、训练、评估、可视化)
使用 TensorFlow DeepLab 在 PASCAL VOC 2012 上完成语义分割全流程实战(数据转换、训练、评估、可视化) 本指南以仓库内 pas
人工智能深度学习计算机视觉NLP语音CoreNet 实战:用 RangeAugment 可学习数据增强训练 DeepLabv3 语义分割模型(ADE20k 与 PASCAL VOC)
CoreNet 实战:用 RangeAugment 可学习数据增强训练 DeepLabv3 语义分割模型(ADE20k 与 PASCAL VOC) 本文是 Co
深度学习计算机视觉NLP多模态模型训练大模型基于 PyTorch 的 DeepLabV3 语义分割实战:从 PASCAL VOC 数据准备到单/多 GPU 训练、验证与预测
基于 PyTorch 的 DeepLabV3 语义分割实战:从 PASCAL VOC 数据准备到单/多 GPU 训练、验证与预测 导读 本文以 pytorch_
示例工程
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考