转置卷积nn.ConvTranspose2d

转置卷积是在卷积之后,对输出特征图进行卷积使恢复到原图大小。

首先看卷积操作:对于一个输入大小为5x5,卷积核大小为3x3,步长为1,padding为0,我们需要进行9次操作(input长 - kernel长+1)x(input宽 - kernel宽+1),输出大小为3x3。

 如何用矩阵相乘表示呢?

首先我们把输入图像拉成25x1的向量,接着我们把3x3卷积核填充到5x5大小,填充的部分用0表示,如何填充呢?就是将卷积核未覆盖的区域全部填充为0,那么把卷积核拉伸成1x25大小,再将9个全部拼接成1个矩阵,这样就形成了9x25大小的矩阵,与一个25x1大小的输入图进行矩阵乘法。输出的结果为9x1,进行reshape为3x3。

而转置卷积,就是将9x25大小的卷积矩阵进行转置,变成了25x9,然后对输出的特征图9x1进行相乘,就变成了25x1,然后reshape,变成了5x5。即恢复到原来的大小。

看一下官方代码:

in_channels(int) – 输入通道数

out_channels(int) – 卷积产生的通道数

kerner_size(int or tuple) - 卷积核的大小

stride(int or tuple,optional) - 卷积步长,即要将输入扩大的倍数,默认为1

padding(int or tuple, optional) - 上下左右填充0的层数,默认为0

output_padding(int or tuple, optional) - 输出边补充0的层数,高宽都增加padding

groups(int, optional) – 从输入通道到输出通道的阻塞连接数

bias(bool, optional) - 如果bias=True,添加偏置

dilation(int or tuple, optional) – 卷积核元素之间的间距,默认为1
>>> input = torch.randn(1, 16, 12, 12)
>>> downsample = nn.Conv2d(16, 16, 3, stride=2, padding=1)
>>> upsample = nn.ConvTranspose2d(16, 16, 3, stride=2, padding=1)
>>> h = downsample(input)
>>> h.size()
torch.Size([1, 16, 6, 6])
>>> output = upsample(h, output_size=input.size())
>>> output.size()
torch.Size([1, 16, 12, 12])

 官方输出长和宽计算公式:

H out=(H in−1)×stride[0]−2×padding[0]+dilation[0]×(kernel_size[0]−1)+output_padding[0]+1
W out=(W in−1)×stride[1]−2×padding[1]+dilation[1]×(kernel_size[1]−1)+output_padding[1]+1

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
nn.ConvTranspose2d是PyTorch中的一个类,用于实现二维转置卷积操作。它可以用于图像处理、计算机视觉等任务中。 在卷积神经网络中,卷积操作通常用于提取图像的特征。而转置卷积操作则可以用于将特征图进行上采样,即将特征图的尺寸扩大,从而实现图像的放大或者恢复。 nn.ConvTranspose2d的构造函数如下: ```python nn.ConvTranspose2d(in_channels, out_channels, kernel_size, stride=1, padding=0, output_padding=0, groups=1, bias=True, dilation=1) ``` 参数说明: - in_channels:输入特征图的通道数。 - out_channels:输出特征图的通道数。 - kernel_size:卷积核的大小,可以是一个整数或者一个元组。 - stride:卷积核的步长,默认为1。 - padding:输入特征图的边缘填充大小,默认为0。 - output_padding:输出特征图的边缘填充大小,默认为0。 - groups:输入通道分组数,默认为1。 - bias:是否使用偏置,默认为True。 - dilation:卷积核的扩张率,默认为1。 使用nn.ConvTranspose2d可以实现图像的上采样操作,例如将一个特征图的尺寸从(3, 32, 32)放大到(3, 64, 64): ```python import torch import torch.nn as nn conv_transpose = nn.ConvTranspose2d(3, 3, 2, stride=2) input = torch.randn(1, 3, 32, 32) output = conv_transpose(input) print(output.size()) # 输出:torch.Size([1, 3, 64, 64]) ``` 这样,nn.ConvTranspose2d就可以用于实现图像的放大或者恢复操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值