扩张尺度张量填充方式

需求

        比如我有一个高分辨率特征张量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 * 2
    new_w = w_agg * 2

    # 判断是否需要进行 padding
    if new_h > h_h or new_w > w_h:
        # 计算需要填充的数量
        pad_h = new_h - h_h
        pad_w = new_w - w_h

        # 计算左右上下需要填充的数量
        pad_left = pad_w // 2
        pad_right = pad_w - pad_left
        pad_top = pad_h // 2
        pad_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 np

def 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 * 2
    new_w = w_agg * 2

    # 判断是否需要进行 padding
    if new_h > h_h or new_w > w_h:
        # 计算需要填充的数量
        pad_h = new_h - h_h
        pad_w = new_w - w_h

        # 计算左右上下需要填充的数量
        pad_left = pad_w // 2
        pad_right = pad_w - pad_left
        pad_top = pad_h // 2
        pad_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的情况

如下图所示:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值