深度学习后端开发工具【免费下载链接】tpuReference models and tools for Cloud TPUs.项目地址https://gitcode.com/gh_mirrors/tpu/tpu点击查看免费下载本篇技术指南围绕本仓库 models/official/efficientnet/condconv 目录展开系统讲解条件参数化卷积Conditionally Parameterized ConvolutionsCondConv这一新型卷积构建块从论文核心思想出发深入源码剖析CondConv2D/DepthwiseCondConv2D两个可复用的 Keras 层再到 EfficientNet-CondConv 模型的网络配置、预训练 checkpoint 的使用与在 Cloud TPU 上完成训练和推理的完整方案。读完本文你将掌握 CondConv 层的实现原理、num_experts参数的作用、如何用现成脚本跑通 EfficientNet-CondConv 的图像分类推理以及如何在此基础上配置自己的 CondConv 模型训练。1. 什么是 CondConv从每个样本一套卷积核说起在传统的卷积层中同一张卷积核被应用于批次内的所有样本——无论输入是猫、狗还是汽车网络都使用完全相同的卷积参数提取特征。CondConv条件参数化卷积打破了这一约束每个输入样本都被一套样本专属example-dependent的卷积核处理。论文中给出一个直观的动机示例在 ImageNet 分类任务上理想情况下应该用不同的卷积核分别处理狗和猫的图片。如上图所示一个 CondConv 层由n 个专家experts组成每个专家的大小与原始卷积层的卷积核完全相同。对于每一个输入样本层会通过一个样本相关的路由函数routing function计算出 n 个权重然后以这组权重对 n 个专家做加权求和得到该样本专用的卷积核。增加专家数量可以提升网络的容量capacity但由于每个样本只执行一次加权求和与一次卷积运算推理时的计算成本以乘加运算次数 MADDs 衡量几乎不变从而实现了容量提升与高效推理两者兼得。论文的实验覆盖了 MobileNetV1、MobileNetV2、ResNet 系列以及 EfficientNet 系列普遍改善了精度 vs 推理成本的权衡曲线。当把 CondConv 应用于 EfficientNet 时即得到 EfficientNet-CondConv 模型系列其中 8 专家的 EfficientNet-CondConv-B0 在论文中取得了当时精度与推理成本权衡上的领先结果详见下文预训练模型表格中的 ImageNet 精度数据。本目录除了提供论文结果的复现代码外还开源了CondConv2D与DepthwiseCondConv2D两个 Keras 层可直接嵌入新的模型架构中使用。相关文件为 condconv_layers.py、efficientnet_condconv_builder.py以及论文引用Brandon Yang 等CondConv: Conditionally Parameterized Convolutions for Efficient InferenceNeurIPS 2019。2. 源码级剖析CondConv2D 与 DepthwiseCondConv2D 两个 Keras 层condconv_layers.py是 CondConv 的核心实现它提供了两个可直接复用的层CondConv2D普通 2D 条件卷积与DepthwiseCondConv2D深度可分离条件卷积。两者分别继承自tf.keras.layers.Conv2D与tf.keras.layers.DepthwiseConv2D在build()阶段以专家维度 × 参数维度的二维矩阵存储参数在call()阶段完成逐样本的加权与卷积。2.1 关键构造参数CondConv2D的构造函数签名condconv_layers.py与标准 Keras 卷积层基本一致核心差异是多了一个num_experts参数参数说明默认值/约束filters输出空间维度输出卷积核数量必填正整数kernel_size卷积窗口的高与宽可传单个整数必填num_experts层中专家卷积核与偏差的数量必填且num_experts 1时抛出ValueError(A CondConv layer must have at least one expert.)strides沿高、宽的步长(1, 1)与dilation_rate ! 1不兼容paddingvalid或samevaliddata_formatchannels_last默认或channels_first默认取 Keras 配置dilation_rate空洞卷积膨胀率(1, 1)activation激活函数默认无线性use_bias是否使用偏差向量Truekernel_initializer/bias_initializer参数初始化器glorot_uniform/zeroskernel_regularizer/bias_regularizer/activity_regularizer正则化器Nonekernel_constraint/bias_constraint参数约束NoneDepthwiseCondConv2D的签名condconv_layers.py与之类似区别在于多出depth_multiplier每个输入通道对应的深度卷积输出通道数默认 1、使用depthwise_initializer而非kernel_initializer并且没有filters参数——输出通道由输入通道 × depth_multiplier决定。2.2 参数存储专家矩阵与专用初始化器CondConv 为了高效计算把偏差和卷积核统一组织成形状为[num_experts, num_params]的二维矩阵CondConv2D中condconv_kernel的形状为(num_experts, kernel_num_params)其中kernel_num_params kernel_h × kernel_w × input_dim × filterscondconv_bias形状为(num_experts, filters)。DepthwiseCondConv2D中depthwise_condconv_kernel形状为(num_experts, depthwise_kernel_num_params)其中depthwise_kernel_num_params kernel_h × kernel_w × input_dim × depth_multiplier。直接对这样展平后的二维矩阵做常规初始化会破坏每个专家自身的分布因此仓库提供了get_condconv_initializer(initializer, num_experts, expert_shape)condconv_layers.py它对每一个专家先用传入的初始器在原始expert_shape上独立初始化再tf.reshape(kernel, [-1])展平最后tf.stack堆叠成[num_experts, num_params]。这样既保证了每个专家得到正确的分布初始化又满足高效矩阵运算所需的二维布局。2.3 前向计算逐样本的加权、拆分与卷积CondConv2D.call(inputs, routing_weights)condconv_layers.py完整展现了每样本专属卷积核的计算流程计算样本专属卷积核kernels tf.matmul(routing_weights, self.condconv_kernel)路由权重矩阵形状[batch, num_experts]与专家矩阵相乘得到每个样本各自的一维参数向量。按 batch 拆分inputs tf.split(inputs, batch_size, 0)kernels tf.split(kernels, batch_size, 0)把输入和参数都拆成单个样本。逐样本执行卷积对每个样本将参数tf.reshape(kernel, self.kernel_shape)还原成[kh, kw, input_dim, filters]的四维卷积核然后调用tf.nn.convolutionstride、padding、dilation 与 data_format 均来自层配置。合并输出outputs tf.concat(outputs_list, 0)按 batch 维拼接回原形状。条件偏差若use_biasTrue同样以biases tf.matmul(routing_weights, self.condconv_bias)计算样本专属偏差逐样本tf.nn.bias_add后拼接。最后如有activation则应用激活函数。DepthwiseCondConv2D.call()condconv_layers.py逻辑一致只是将tf.nn.convolution换成tf.nn.depthwise_conv2d并把 strides 转换成该算子的 4 维形式。实现上的关键观察是routing_weights不是由层内部生成而是作为call()的第二个参数由外部传入。这意味着路由函数可以被设计成任意形式下文会看到 EfficientNet 中用的是全局平均池化 全连接 sigmoidCondConv 层本身只负责加权求和 卷积。2.4 序列化get_config()在父类配置基础上追加了num_experts字段保证层可以被正确序列化与反序列化从而支持model.save()/model.load()以及分布式训练中的配置传递。3. EfficientNet-CondConv 网络结构从 blocks 描述到路由函数3.1 三个预定义模型配置efficientnet_condconv_builder.py 中的efficientnet_condconv_params(model_name)以元组(width_coefficient, depth_coefficient, resolution, dropout_rate, condconv_num_experts)定义了仓库内置的三个 CondConv 模型模型名宽度系数深度系数输入分辨率dropout_rate专家数efficientnet-condconv-b0-4e1.01.02240.254efficientnet-condconv-b0-8e1.01.02240.258efficientnet-condconv-b0-8e-depth1.01.12240.258可以看出三种变体的思路b0-4e/b0-8e在 EfficientNet-B0 基线上仅改变专家数b0-8e-depth则额外把深度系数提高到 1.1网络更深对应 README 表格中参数与 MADDs 都明显更高的那一档。3.2 blocks 描述与_cc标记efficientnet_condconv()内部通过BlockDecoder.decode()解析一段压缩的 blocks 描述字符串efficientnet_condconv_builder.pyr1_k3_s11_e1_i32_o16_se0.25, r2_k3_s22_e6_i16_o24_se0.25, r2_k5_s22_e6_i24_o40_se0.25, r3_k3_s22_e6_i40_o80_se0.25, r3_k5_s11_e6_i80_o112_se0.25_cc, r4_k5_s22_e6_i112_o192_se0.25_cc, r1_k3_s11_e6_i192_o320_se0.25_cc,每个字段的含义r重复次数、k卷积核尺寸、s步长如s22表示 stride2、e扩张比、i输入通道、o输出通道、se通道注意力压缩比、_cc表示该 block 使用 CondConv。在 efficientnet_builder.py 的_decode_block_string中condconv(cc in block_string)即为解析逻辑_encode_block_string则会在block.condconv为真时重新附上cc标记保证编码-解码闭环。与标准 EfficientNet-B0 的 blocks见 efficientnet_builder.py对比CondConv 版本只把后三个较大的 block 替换为 CondConv 版本中等规模的i80_o112、较大的i112_o192、i192_o320前几个小 block 保持普通卷积。这是用最小额外计算换取容量的典型设计取舍。3.3 GlobalParamsCondConv 的全局开关模型构建时通过GlobalParamsefficientnet_model.py传递全局配置其中condconv_num_experts字段是 CondConv 的全局开关。efficientnet_condconv()还固定了下列关键超参数batch_norm_momentum0.99、batch_norm_epsilon1e-3dropout_rate与survival_prob默认 0.8用于随深度线性衰减的 DropConnect见 efficientnet_model.pydata_formatchannels_last、num_classes1000、depth_divisor8relu_fntf.nn.swishSwish 激活batch_normutils.TpuBatchNormalizationTPU 专用批归一化训练在 Cloud TPU 上时必须使用见 utils.pyuse_seTrue保留 Squeeze-and-Excitation 注意力模块。3.4 路由函数与层集成在 efficientnet_model.py 的MBConvBlock._build()中凡block_args.condconv True的 block 会额外创建路由函数self._avg_pooling tf.keras.layers.GlobalAveragePooling2D(data_formatself._data_format) self._routing_fn tf.layers.Dense(self._condconv_num_experts, activationtf.nn.sigmoid)即路由函数 全局平均池化 → 全连接层输出维度 专家数→ sigmoid 激活。前向时efficientnet_model.py先用池化与全连接算出routing_weights再通过functools.partial把同一个routing_weights注入该 block 内所有 CondConv 卷积fused_conv/expand_conv/depthwise_conv/project_conv。同时层的类本身也通过functools.partial(condconv_layers.CondConv2D, num_experts...)在 block 构造时替换为 CondConv 版本efficientnet_model.py。模型分发则通过 model_builder_factory.py 完成凡model_name以efficientnet-condconv-开头get_model_builder与get_model_input_size都会自动路由到efficientnet_condconv_builder模块并取出对应输入尺寸224。4. 使用预训练 EfficientNet-CondConv checkpoint 做推理4.1 预训练模型一览仓库提供了如下预训练 checkpoint表格来自 README.mdImageNet 精度随专家数与网络深度增加而提升模型CondConv 专家数ParamsMADDsAccuracyEfficientNet-B0-5.3M391M77.3EfficientNet-CondConv-B0413.3M402M77.8EfficientNet-CondConv-B0824.0M413M78.3模型CondConv 专家数ParamsMADDsAccuracyEfficientNet-B1-7.8M700M79.2EfficientNet-CondConv-B0-Depth839.7M614M79.5对比可知从 B0 到 8 专家的 CondConv-B0参数从 5.3M 增至 24.0M容量显著增加但 MADDs 仅从 391M 增至 413M推理成本几乎不变精度提升 1.0 个百分点——这正是 CondConv 设计目标的量化体现。而 Depth 变体通过加深网络深度系数 1.1进一步逼近 EfficientNet-B1 的精度79.2 → 79.5却只付出 614M MADDs 的代价低于 B1 的 700M。4.2 一行脚本跑通单图分类README 提供了完整的快速上手流程checkpoint 存储于 Cloud TPU checkpoints 公共存储桶$ export MODELefficientnet-condconv-b0-8e $ wget https://storage.googleapis.com/cloud-tpu-checkpoints/efficientnet/${MODEL}.tar.gz $ tar zxf ${MODEL}.tar.gz $ wget https://upload.wikimedia.org/wikipedia/commons/f/fe/Giant_Panda_in_Beijing_Zoo_1.JPG -O panda.jpg $ wget https://storage.googleapis.com/cloud-tpu-checkpoints/efficientnet/eval_data/labels_map.txt $ python eval_ckpt_main.py --model_name$MODEL --ckpt_dir$MODEL --example_imgpanda.jpg --labels_map_filelabels_map.txt这段流程实际发生的动作下载并解压 checkpoint → 下载一张熊猫示例图与 ImageNet 标签映射文件 → 调用eval_ckpt_main.py在本地CPU完成单图推理。4.3 eval_ckpt_main.py 参数详解eval_ckpt_main.py 是可复用的推理驱动脚本核心 flags 如下Flag默认值说明--model_nameefficientnet-b0模型名efficientnet-condconv-*系列自动路由到 CondConv builder--runmodeexamplesexamples单图或imagenet全量验证集评估--imagenet_eval_globNoneImageNet 验证集图片通配符如/imagenet/ILSVRC2012*.JPEG--imagenet_eval_labelNone验证集标签文件路径--ckpt_dir/tmp/ckpt/checkpoint 目录--enable_emaTrue是否用指数滑动平均EMA权重做推理--export_ckptNone是否导出剥离 EMA 的 checkpoint--example_img/tmp/panda.jpg单图推理的图片路径--labels_map_file/tmp/labels_map.txt标签 ID 到语义名的映射文件--include_background_labelFalse是否把 label 0 当作背景类--num_images5000ImageNet 评估图片数-1表示全部推理预处理eval_ckpt_main.py与训练保持一致输入[0, 255]的像素先减MEAN_RGB[127,127,127]再除STDDEV_RGB[128,128,128]归一化到[0,1]然后经build_model得到 logitstf.nn.softmax后输出概率。底层由utils.EvalCkptDriverutils.py驱动恢复 checkpoint默认启用 EMA 权重映射→ 逐 batch 前向 → 返回每个样本的Top-5 预测索引与概率。如果希望获得更交互式的上手体验可参考 eval_ckpt_example.ipynb它演示了在 Colab 中克隆本仓库、设置sys.path、以model_name参数加载预训练 checkpoint 并做图像分类的完整流程。5. 在 Cloud TPU 上训练 EfficientNet-CondConv5.1 训练入口与数据README 将完整训练教程指向 Cloud TPU 官方文档。在仓库内训练入口为 main.py其--model_name直接支持efficientnet-condconv-*经由model_builder_factory.get_model_builder分发因此只需把模型名换成 CondConv 变体即可复用整套训练流水线。数据侧使用 imagenet_input.py 读取 ImageNet TFRecord仓库默认提供gs://cloud-tpu-test-datasets/fake_imagenet假数据目录用于跑通流程。5.2 关键训练 flagsmain.py中与训练最相关的 flagsFlag默认值说明--use_tpuTrue是否使用 TPU设为false则回退到 CPU/GPU--tpuNoneCloud TPU 名称或grpc://ip:8470地址--gcp_project/--tpu_zoneNoneGCP 项目名与 TPU 所在 zone未指定时自动探测--data_dirfake_imagenetImageNet 数据目录--model_nameefficientnet-b0可设为efficientnet-condconv-b0-4e/-8e/-8e-depth--modetrain_and_evaltrain_and_eval/train/eval--model_dirNonecheckpoint 与 summary 存储目录--train_steps218949训练步数约等于 batch 2048 下 350 个 epoch--train_batch_size2048训练 batch 大小--eval_batch_size64评估 batch 大小--batch_norm_batch_size128分布式批归一化的分组 batch 大小--num_train_images/--num_eval_images1281167/50000训练/验证集大小--steps_per_eval6255每训练多少步执行一次评估--input_image_sizeNone输入分辨率CondConv 模型固定为 224--augment_nameNone数据增强autoaugment或randaugment训练时模型使用utils.TpuBatchNormalizationTPU 专用批归一化而build_model在非训练/微调模式下会将其替换为常规utils.BatchNormalizationefficientnet_condconv_builder.py确保推理与训练行为一致。5.3 从源码结构推断的扩展方式从 builder 的公开接口看efficientnet_condconv_builder.py读者也可以不依赖预定义模型名自行构建 CondConv 模型直接调用efficientnet_condconv(width_coefficient..., depth_coefficient..., dropout_rate..., survival_prob..., condconv_num_expertsN)获取blocks_args与global_params其中condconv_num_experts决定所有_ccblock 的专家数。还可以通过override_params覆盖GlobalParams中的任意字段如dropout_rate、survival_prob若包含未定义字段会抛出ValueError。指定model_dir时builder 还会把model_name、global_params、blocks_args写入model_params.txt存档方便核对训练配置。6. 使用限制与注意事项CondConv 层要求已知 batch 维度。CondConv2D的call()通过tf.split(inputs, batch_size, 0)逐样本处理因此输入必须带有确定的 batch 维。对应地utils.EvalCkptDriver.build_dataset在评估 CondConv 模型时会设置batch_drop_remainderTrue丢弃无法凑满一个 batch 的尾部样本并提示剩余样本将不被评估utils.py——若要评估全部样本需选择能整除图片总数的eval_batch_size。推理成本以 MADDs 度量。CondConv 的专家加权求和发生在参数空间一次前向的乘加量几乎与专家数无关这是其效率优势的来源但参数Params随专家数线性增长训练显存与 checkpoint 体积需要相应规划。数值与预处理约定。本文所有精度、Params、MADDs 数据均来自仓库 README 中论文报告的实验结果推理时必须使用与训练一致的MEAN_RGB/STDDEV_RGB归一化才能复现 checkpoint 的精度。7. 总结CondConv 通过多专家参数 样本相关路由加权在几乎不增加推理乘加量的前提下显著提升网络容量。本仓库为其提供了完整的三层支撑可复用的CondConv2D/DepthwiseCondConv2DKeras 层、EfficientNet-CondConv 的预定义模型配置_ccblocks、路由函数、TPU 专用 BN以及开箱即用的预训练 checkpoint、单图/全量集推理脚本与 Cloud TPU 训练入口。无论你想复现论文结果、把 CondConv 层嵌入自己的模型还是在 Cloud TPU 上训练更大规模的 CondConv 网络都可以从 condconv 目录出发按本文第 2、4、5 节的路径快速落地。赞分享深度学习后端开发工具【免费下载链接】tpuReference models and tools for Cloud TPUs.项目地址https://gitcode.com/gh_mirrors/tpu/tpu点击查看免费下载相关推荐AG Kit SEO Specialist Agent 实战指南面向 Google 与 AI 搜索的双引擎优化方案AG Kit SEO Specialist Agent 实战指南面向 Google 与 AI 搜索的双引擎优化方案 本指南以 AG Kit 仓库中的 seo深度学习后端开发工具基于 DGL 与 MXNet 的 SGC 实战复现简化图卷积网络的原理、源码与训练调参基于 DGL 与 MXNet 的 SGC 实战复现简化图卷积网络的原理、源码与训练调参 本篇技术指南以仓库 examples/mxnet/sgc https:人工智能机器学习深度学习图计算The JavaScript Way 第八章精讲JavaScript 字符串处理的完整实战指南The JavaScript Way 第八章精讲JavaScript 字符串处理的完整实战指南 本文基于开源书籍《The JavaScript Way》的 m深度学习后端开发工具上一篇ML-For-Beginners 课程导读12 周经典机器学习教学大纲的结构、学习路径与离线实践方法下一篇Harbor 系统管理员角色验证以 Test 2-31 为例理解 RBAC 下“非 admin 用户拥有全部管理权限”的测试设计创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考