使用PyTorch为Tensor指定上下左右padding的行/列数目

先import相关库

import torch
import torch.nn as nn
import torch.nn.functional as F

第一种情况:当想要对Tensor上下和左右padding的数量不一样时

例如,想要对Tensor左右padding各一列,而上下padding各两行,有以下三种方式。

  1. 将padding数量作为创建padding后所要执行的函数(如卷积)对象的输入参数:
conv = nn.Conv2d(in_channels=3, out_channels=3, kernel_size=1, padding=(2, 1), stride=1)
inp = torch.randn(1, 3, 10, 10)
print(inp.size())
outp = conv(inp)
print(outp.size())
  1. 创建nn.ZeroPad2d对象:
pad = nn.ZeroPad2d((1, 1, 2, 2))
inp = torch.randn(1, 3, 10, 10)
print(inp.size())
outp = pad(inp)
print(outp.size())
  1. 使用F.pad函数:
inp = torch.randn(1, 3, 10, 10)
print(inp.size())
outp = F.pad(inp, [1, 1, 2, 2])
print(outp.size())

第二种情况:当想要对Tensor上下左右padding的数量均不一样时

例如,想要对Tensor左padding一列,右padding两列,上padding三行,下padding四行,有以下两种方式。

  1. 创建nn.ZeroPad2d对象:
pad = nn.ZeroPad2d((1, 2, 3, 4))
inp = torch.randn(1, 3, 10, 10)
print(inp.size())
outp = pad(inp)
print(outp.size())
  1. 使用F.pad函数:
inp = torch.randn(1, 3, 10, 10)
print(inp.size())
outp = F.pad(inp, [1, 2, 3, 4])
print(outp.size())

注意点

  • 在PyTorch中,网络层(如卷积、池化等)的padding参数只允许输入一个参数或两个参数。
  1. 当输入一个参数时,表示上下左右均padding该参数数目的行/列。
  2. 当输入两个参数(A, B)时,表示左右各padding A列,上下各padding B行。
  • 当想要上下左右均padding不同数目的行/列时,只能通过nn.ZeroPad2d或F.pad进行,其pad相关参数可以输入四个参数(A, B, C, D),分别表示左、右、上、下所要padding的行/列数目。
### PyTorch 中分组卷积的使用方法 在深度学习框架PyTorch中,`torch.nn.Conv2d` 提供了一个参数 `groups` 来实现分组卷积。当设置 `groups=1` 时,执的是标准卷积;而当 `groups>1` 并且输入通道数和输出通道数都能被 `groups` 整除的情况下,则会进分组卷积[^1]。 对于每一个单独的组而言,其为类似于普通的二维卷积层,只不过此时仅作用于分配给该组的那一部分输入通道上。具体来说,在每组内部,所有输入通道的数据都会参与计算以生成对应数量的新特征图作为输出的一部分。这种机制允许模型在同一层内并处理多个子集的信息流,从而有助于提高效率或增强表达能力。 #### 实现示例 下面给出一段Python代码用于展示如何利用PyTorch创建具有两个独立路径(即两组)的简单网络结构: ```python import torch from torch import nn class GroupedConv(nn.Module): def __init__(self, in_channels, out_channels, kernel_size, stride=1, padding=0, dilation=1, groups=1, bias=True): super(GroupedConv, self).__init__() # 定义一个带有指定数目分组的卷积层 self.conv = nn.Conv2d(in_channels=in_channels, out_channels=out_channels, kernel_size=kernel_size, stride=stride, padding=padding, dilation=dilation, groups=groups, bias=bias) def forward(self, x): return self.conv(x) if __name__ == "__main__": batch_size = 4 # 批量大小 channels_in = 3 # 输入图片的颜色通道数 (RGB) height_width = 6 # 假设正方形图像的高度宽度均为6像素 input_tensor = torch.randn(batch_size, channels_in, height_width, height_width) # 随机初始化一批次张量 grouped_conv_layer = GroupedConv(channels_in * 2, channels_in * 4, 3, groups=2) # 创建一个有两组的卷积层实例 output_tensor = grouped_conv_layer(input_tensor.repeat(1, 2, 1, 1)) # 将输入重复两次使得能够匹配所需的输入通道数 print(output_tensor.size()) # 输出形状应为 [batch_size, out_channels, H_out, W_out] ``` 这段程序首先定义了一个名为 `GroupedConv` 的自定义模块类,它继承自 `nn.Module` 并封装了单个 `nn.Conv2d` 层。接着构建了一种特殊情况下的测试场景——其中包含四个样本批次、三个颜色通道以及边长为六的小型灰度级图像,并通过调用上述构造器来建立含有双路分支架构的一维空间变换算子。最后打印出经过此运算后的最终结果尺寸信息以便验证正确性[^2]。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值