如何高效合并两个按通道归一化选择的张量
技术百科
花韻仙語
发布时间:2026-01-18
浏览: 次 本文介绍一种基于布尔掩码的向量化方法,替代原始双层循环,实现对两个同形状3d/4d张量按通道l2范数比较后逐通道选取较大者,大幅提升计算效率。
在深度学习中,常需根据通道级统计量(如L2范数)对多个特征图进行融合决策。原始实现使用嵌套 for 循环遍历 batch 和 channel 维度,虽逻辑清晰但严重阻碍 GPU 并行能力,导致训练/推理速度显著下降。
更优解是利用 PyTorch 的广播机制与高级索引(advanced indexing),将条件判断和赋值完全向量化。核心思路如下:
- 计算通道范数:对输入张量 x 和 y 沿空间维度(H, W)计算 L2 范数,得到形状为 (B, C) 的二维张量;
- 生成布尔掩码:通过比较 x_norm >= y_norm 直接获得 (B, C) 布尔张量 condition;
-
向量化赋值:利用布尔掩码对四维张量 z、x、y 进行高级索引——z[condition] = x[condition] 会自动将 condition 广播至所有空间位置,等价于“对
每个满足条件的 (b,c),复制 x[b,c,:,:] 到 z[b,c,:,:]”。
✅ 完整优化代码如下:
import torch # 示例输入(实际中为你的特征张量) x = torch.randn(16, 64, 32, 32) # B, C, H, W y = torch.randn(16, 64, 32, 32) # 步骤1:计算通道L2范数(保留B,C维度) x_norm = torch.norm(x, dim=(2, 3)) # shape: (B, C) y_norm = torch.norm(y, dim=(2, 3)) # 步骤2:构建广播兼容的布尔掩码 condition = x_norm >= y_norm # shape: (B, C),dtype=torch.bool # 步骤3:向量化赋值(无需循环!) z = torch.where(condition.unsqueeze(-1).unsqueeze(-1), x, y) # 或等价写法(显式索引): # z = torch.zeros_like(x) # z[condition] = x[condition] # z[~condition] = y[~condition]
⚠️ 注意事项:torch.where() 是更推荐的方式(第3行),它天然支持广播,且一行完*部赋值,语义更清晰、内存更友好;若使用 z[condition] = x[condition],需确保 condition 为二维布尔张量,PyTorch 会自动将其广播到 (B, C, H, W) 空间,但要求 x 和 y 形状严格一致;该方法假设 x 和 y 具有完全相同的形状(B, C, H, W),否则需先对齐尺寸(如 padding 或 interpolate);对于超大 batch 或 channel 数,可进一步用 torch.cuda.amp.autocast() 配合半精度加速范数计算。
此方案将时间复杂度从 O(B×C×H×W) 的显式循环降为 O(B×C + B×C×H×W) 的向量化操作,在 GPU 上通常获得 10–100 倍加速,是 PyTorch 中“用算子代替循环”的典型实践。
# 深度学习
# 将其
# 多个
# 更清晰
# 循环
# channel
# 则需
# 遍历
# for
# 布尔
# 掩码
# padding
# pytorch
# 中为
# 完全相同
# batch
# 降为
相关栏目:
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
AI推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
SEO优化<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
技术百科<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
谷歌推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
百度推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
网络营销<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
案例网站<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
精选文章<?muma echo $count; ?>
】
相关推荐
- LINUX怎么查看进程_LINUX ps命令查看运
- Win11怎么恢复旧版开始菜单_通过软件还原Win
- Flask 表单数据通过 SMTP 发送邮件的完整
- c++如何使用std::bitset进行位图算法_
- 如何使用正则表达式批量替换重复的“-”模式为固定字
- php文件怎么变mp4保存_php输出视频流保存为
- Python 中将 ISO 8601 时间戳转换为
- Win10怎么关闭自动更新错误弹窗_Win10策略
- 如何在Golang中处理URL参数_Golang
- Django 测试数据库表缺失与字段未创建问题的完
- GML (Geography Markup Lan
- Win11怎么更改系统语言为中文_Windows1
- c# F# 的 MailboxProcessor
- Win11开机Logo怎么换_Win11自定义启动
- 如何使用Golang recover捕获panic
- Win10怎样卸载自带Edge_Win10卸载Ed
- 如何在 Windows 11 中使用 AlomWa
- Python与Docker容器化部署实战_镜像构建
- Win11怎么更改文件夹图标_自定义Win11文件
- Windows10系统服务优化指南_Win10禁用
- 如何在 Go 同包不同文件中正确引用结构体
- Win11视频默认播放器怎么改_Win11关联第三
- Windows怎样关闭开始菜单广告_Windows
- php转mp4怎么保留字幕_php处理带字幕视频转
- Win11怎么更改任务栏颜色_Windows11个
- Win10怎么卸载爱奇艺_Win10彻底卸载爱奇艺
- Windows11如何设置专注助手_Windows
- Win11怎么设置组合键快捷方式_Windows1
- 如何在Golang中使用time处理时间_Gola
- php嵌入式日志记录怎么实现_php将硬件数据写入
- Mac怎么开启“任何来源”_Mac安装未签名应用的
- Win11怎么设置任务栏对齐方式_Windows1
- 如何将文本文件中的竖排字符串转换为横排字符串
- 如何在Golang中使用encoding/gob序
- Win10怎样设置闹钟贪睡时间 Win10闹钟贪睡
- Win11怎样安装搜狗输入法_Win11安装搜狗输
- Linux怎么修改用户密码_Linux系统pass
- Win11怎么关闭透明效果_Windows11个性
- c++ unordered_map怎么用 c++哈
- c++的static关键字有什么用 静态变量和静态
- 小程序里php怎么变mp4_小程序调用php生成m
- Windows蓝屏错误0x00000023怎么修复
- php485返回空数组怎么回事_php485数据接
- Windows家庭版如何开启组策略(gpedit.
- Win11怎么关闭边缘滑动手势_Windows11
- Python音视频处理高级项目教程_FFmpegP
- 如何使用Golang开发基础文件下载功能_Gola
- Windows 11如何查看系统激活密钥_Wind
- php能控制zigbee模块吗_php通过串口与c
- php怎么操作Redis_Redis扩展连接与基本


QQ客服