当前位置: 首页 > news >正文

扩张尺度张量填充方式

需求

        比如我有一个高分辨率特征张量size为[5,5],低分辨率特征张量size为[3,3],如果我想把低分辨率*2然后和高分辨率特征叠加,那就需要把[5,5]和[6,6]的张量加起来,但是维度不一致,怎么把[5,5]的张量通过填充的方式扩展到[6,6]?下面就给出两种填充方式。

一、零填充

1.代码

import torch
import torch.nn.functional as F
import matplotlib.pyplot as plt# 用 0 填充的函数
def pad_feat_h(feat_h, feat_aggregate):# 获取 feat_aggregate 的长和宽h_agg, w_agg = feat_aggregate.shape[-2:]# 获取 feat_h 的长和宽h_h, w_h = feat_h.shape[-2:]# 计算 feat_aggregate 长和宽乘 2 的结果new_h = h_agg * 2new_w = w_agg * 2# 判断是否需要进行 paddingif new_h > h_h or new_w > w_h:# 计算需要填充的数量pad_h = new_h - h_hpad_w = new_w - w_h# 计算左右上下需要填充的数量pad_left = pad_w // 2pad_right = pad_w - pad_leftpad_top = pad_h // 2pad_bottom = pad_h - pad_top# 进行 padding 操作feat_h = F.pad(feat_h, (pad_left, pad_right, pad_top, pad_bottom), mode='constant', value=0)return feat_h

2.测试用例

# 创建一个简单的测试特征图 feat_h
feat_h = torch.tensor([[1, 2, 3],[4, 5, 6],[7, 8, 9]
], dtype=torch.float32).unsqueeze(0).unsqueeze(0)  # 添加批次和通道维度# 创建一个目标特征图 feat_aggregate
feat_aggregate = torch.tensor([[0, 0],[0, 0]
], dtype=torch.float32).unsqueeze(0).unsqueeze(0)  # 添加批次和通道维度# 调用填充函数
padded_feat_h = pad_feat_h(feat_h, feat_aggregate)# 可视化
plt.figure(figsize=(10, 5))plt.subplot(1, 2, 1)
plt.title("Original feat_h")
plt.imshow(feat_h.squeeze().numpy(), cmap='viridis')
plt.colorbar()plt.subplot(1, 2, 2)
plt.title("Padded feat_h")
plt.imshow(padded_feat_h.squeeze().numpy(), cmap='viridis')
plt.colorbar()plt.show()

3.可视化

二、边缘填充

用张量的最外层像素去补齐缺失的元素

1.代码

import torch
import torch.nn.functional as F
import matplotlib.pyplot as plt
import numpy as npdef pad_feat_h_with_edge(feat_h, feat_aggregate):# 获取 feat_aggregate 的长和宽h_agg, w_agg = feat_aggregate.shape[-2:]# 获取 feat_h 的长和宽h_h, w_h = feat_h.shape[-2:]# 计算 feat_aggregate 长和宽乘 2 的结果new_h = h_agg * 2new_w = w_agg * 2# 判断是否需要进行 paddingif new_h > h_h or new_w > w_h:# 计算需要填充的数量pad_h = new_h - h_hpad_w = new_w - w_h# 计算左右上下需要填充的数量pad_left = pad_w // 2pad_right = pad_w - pad_leftpad_top = pad_h // 2pad_bottom = pad_h - pad_top# 进行 padding 操作,修改 mode 为'replicate'feat_h = F.pad(feat_h, (pad_left, pad_right, pad_top, pad_bottom), mode='replicate')return feat_h

2.测试用例

# 创建一个简单的测试特征图 feat_h
feat_h = torch.tensor([[1, 2, 3, 4],[5, 6, 7, 8],[9, 10, 11, 12],[13, 14, 15, 16]
], dtype=torch.float32).unsqueeze(0).unsqueeze(0)  # 添加批次和通道维度# 创建一个目标特征图 feat_aggregate
feat_aggregate = torch.tensor([[0, 0, 0],[0, 0, 0],[0, 0, 0]
], dtype=torch.float32).unsqueeze(0).unsqueeze(0)  # 添加批次和通道维度# 调用填充函数
padded_feat_h = pad_feat_h_with_edge(feat_h, feat_aggregate)# 可视化
plt.figure(figsize=(10, 5))plt.subplot(1, 2, 1)
plt.title("Original feat_h")
plt.imshow(feat_h.squeeze().numpy(), cmap='viridis')
plt.colorbar()

3.可视化

注:该代码也适合original_feat_h不恰好处于Padded_feat_h的情况

如下图所示:

http://www.xdnf.cn/news/126847.html

相关文章:

  • HTML字符实体和转义字符串
  • 【Linux】基本指令(下)
  • Docker部署DeepSeek常见问题及解决方案
  • 详细讲解 QMutex 线程锁和 QMutexLocker 自动锁的区别
  • 提升内容创作效率:AI原创文章批量生成工具优势
  • 【DNS】BIND 9的配置
  • Android之AI自动化测试--Midscene
  • CentOS 7上Memcached的安装、配置及高可用架构搭建
  • 内存管理:内存堆管理
  • 编译原理(5):链接
  • Kafka命令行的使用/Spark-Streaming核心编程(二)
  • 17.磁珠在EMC设计中的运用
  • Happens-Before 原则
  • 理解js函数(Ⅱ)
  • CompletableFuture到底怎么用?
  • Code Splitting 分包策略
  • MobTech袤博ShareSDK集成错误 ld: symbol(s) not found for architecture arm64
  • 《一文读懂Transformers库:开启自然语言处理新世界的大门》
  • 【重走C++学习之路】18、map和set
  • 基于RFID的智能家居系统设计与实现
  • Spring—依赖注入注解
  • 从认证到透传:用 Nginx 为 EasySearch 构建一体化认证网关
  • 【Java 8新特性】Stream API 和 Lambda 表达式
  • MySQL数据库基本操作-DQL-基本查询
  • 多线程事务?拿捏!
  • 豆包桌面版 1.47.4 可做浏览器,免安装绿色版
  • [创业之路-382]:企业法务 - 企业如何通过技术专利与技术秘密保护自己
  • AI赋能Python长时序植被遥感动态分析、物候提取、时空变异归因及RSEI生态评估
  • WebServiceg工具
  • 虾皮(Shopee)商品详情 API 接口概述及 JSON 数据返回参考