小白学Pytorch系列--Torch.nn API Vision Layers(15)
Posted 发呆的比目鱼
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了小白学Pytorch系列--Torch.nn API Vision Layers(15)相关的知识,希望对你有一定的参考价值。
小白学Pytorch系列–Torch.nn API Vision Layers(15)
方法 | 注释 |
---|---|
nn.PixelShuffle | 将形状张量 ( ∗ , C r 2 , H , W ) (*,C r^2,H,W) (∗,Cr2,H,W)中的元素重新排列为形状张量 ( ∗ , C , H r , W r ) (*,C,H r,W r) (∗,C,Hr,Wr),其中r是一个高阶因子。 |
nn.PixelUnshuffle | 通过将形状张量 ( ∗ , C , H r , W r ) (*,C,H r,W r) (∗,C,Hr,Wr)中的元素重新排列为形状张量 ( ∗ , C r 2 , H , W ) (*,C r^2,H,W) (∗,Cr2,H,W)来反转PixelShuffle操作,其中r是一个降尺度因子。 |
nn.Upsample | 对给定的多通道1D(时间)、2D(空间)或3D(体积)数据进行上采样。 |
nn.UpsamplingNearest2d | 对由多个输入通道组成的输入信号应用二维最近邻上采样。 |
nn.UpsamplingBilinear2d | 对由多个输入通道组成的输入信号应用二维双线性上采样。 |
nn.PixelShuffle
将形状张量
(
∗
,
C
r
2
,
H
,
W
)
(*,C r^2,H,W)
(∗,Cr2,H,W)中的元素重新排列为形状张量
(
∗
,
C
,
H
∗
r
,
W
∗
r
)
(*,C,H * r,W *r)
(∗,C,H∗r,W∗r),其中r是一个高阶因子。
>>> pixel_shuffle = nn.PixelShuffle(3)
>>> input = torch.randn(1, 9, 4, 4)
>>> output = pixel_shuffle(input)
>>> print(output.size())
torch.Size([1, 1, 12, 12])
nn.PixelUnshuffle
通过将形状张量
(
∗
,
C
,
H
∗
r
,
W
∗
r
)
(*,C,H* r,W *r)
(∗,C,H∗r,W∗r)中的元素重新排列为形状张量
(
∗
,
C
r
2
,
H
,
W
)
(*,C r^2,H,W)
(∗,Cr2,H,W)来反转PixelShuffle操作,其中r是一个降尺度因子。
>>> pixel_unshuffle = nn.PixelUnshuffle(3)
>>> input = torch.randn(1, 1, 12, 12)
>>> output = pixel_unshuffle(input)
>>> print(output.size())
torch.Size([1, 9, 4, 4])
nn.Upsample
>>> input = torch.arange(1, 5, dtype=torch.float32).view(1, 1, 2, 2)
>>> input
tensor([[[[1., 2.],
[3., 4.]]]])
>>> m = nn.Upsample(scale_factor=2, mode='nearest')
>>> m(input)
tensor([[[[1., 1., 2., 2.],
[1., 1., 2., 2.],
[3., 3., 4., 4.],
[3., 3., 4., 4.]]]])
>>> m = nn.Upsample(scale_factor=2, mode='bilinear') # align_corners=False
>>> m(input)
tensor([[[[1.0000, 1.2500, 1.7500, 2.0000],
[1.5000, 1.7500, 2.2500, 2.5000],
[2.5000, 2.7500, 3.2500, 3.5000],
[3.0000, 3.2500, 3.7500, 4.0000]]]])
>>> m = nn.Upsample(scale_factor=2, mode='bilinear', align_corners=True)
>>> m(input)
tensor([[[[1.0000, 1.3333, 1.6667, 2.0000],
[1.6667, 2.0000, 2.3333, 2.6667],
[2.3333, 2.6667, 3.0000, 3.3333],
[3.0000, 3.3333, 3.6667, 4.0000]]]])
>>> # Try scaling the same data in a larger tensor
>>> input_3x3 = torch.zeros(3, 3).view(1, 1, 3, 3)
>>> input_3x3[:, :, :2, :2].copy_(input)
tensor([[[[1., 2.],
[3., 4.]]]])
>>> input_3x3
tensor([[[[1., 2., 0.],
[3., 4., 0.],
[0., 0., 0.]]]])
>>> m = nn.Upsample(scale_factor=2, mode='bilinear') # align_corners=False
>>> # Notice that values in top left corner are the same with the small input (except at boundary)
>>> m(input_3x3)
tensor([[[[1.0000, 1.2500, 1.7500, 1.5000, 0.5000, 0.0000],
[1.5000, 1.7500, 2.2500, 1.8750, 0.6250, 0.0000],
[2.5000, 2.7500, 3.2500, 2.6250, 0.8750, 0.0000],
[2.2500, 2.4375, 2.8125, 2.2500, 0.7500, 0.0000],
[0.7500, 0.8125, 0.9375, 0.7500, 0.2500, 0.0000],
[0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000]]]])
>>> m = nn.Upsample(scale_factor=2, mode='bilinear', align_corners=True)
>>> # Notice that values in top left corner are now changed
>>> m(input_3x3)
tensor([[[[1.0000, 1.4000, 1.8000, 1.6000, 0.8000, 0.0000],
[1.8000, 2.2000, 2.6000, 2.2400, 1.1200, 0.0000],
[2.6000, 3.0000, 3.4000, 2.8800, 1.4400, 0.0000],
[2.4000, 2.7200, 3.0400, 2.5600, 1.2800, 0.0000],
[1.2000, 1.3600, 1.5200, 1.2800, 0.6400, 0.0000],
[0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000]]]])
nn.UpsamplingNearest2d
>>> input = torch.arange(1, 5, dtype=torch.float32).view(1, 1, 2, 2)
>>> input
tensor([[[[1., 2.],
[3., 4.]]]])
>>> m = nn.UpsamplingNearest2d(scale_factor=2)
>>> m(input)
tensor([[[[1., 1., 2., 2.],
[1., 1., 2., 2.],
[3., 3., 4., 4.],
[3., 3., 4., 4.]]]])
nn.UpsamplingBilinear2d
>>> input = torch.arange(1, 5, dtype=torch.float32).view(1, 1, 2, 2)
>>> input
tensor([[[[1., 2.],
[3., 4.]]]])
>>> m = nn.UpsamplingBilinear2d(scale_factor=2)
>>> m(input)
tensor([[[[1.0000, 1.3333, 1.6667, 2.0000],
[1.6667, 2.0000, 2.3333, 2.6667],
[2.3333, 2.6667, 3.0000, 3.3333],
[3.0000, 3.3333, 3.6667, 4.0000]]]])
小白学Pytorch系列--Torch.nn API Shuffle Layers(16)
小白学Pytorch系列–Torch.nn API Shuffle Layers(16)
方法 | 注释 |
---|---|
nn.ChannelShuffle | 将形状为 ( ∗ , C , H , W ) (*,C,H,W) (∗,C,H,W)的张量中的通道划分为g组,并将它们重新排列为 ( ∗ , C g , g , H , W ) (*,C^g,g,H,W) (∗,Cg,g,H,W),同时保持原始张量形状。 |
nn.ChannelShuffle
>>> channel_shuffle = nn.ChannelShuffle(2)
>>> input = torch.randn(1, 4, 2, 2)
>>> print(input)
[[[[1, 2],
[3, 4]],
[[5, 6],
[7, 8]],
[[9, 10],
[11, 12]],
[[13, 14],
[15, 16]],
]]
>>> output = channel_shuffle(input)
>>> print(output)
[[[[1, 2],
[3, 4]],
[[9, 10],
[11, 12]],
[[5, 6],
[7, 8]],
[[13, 14],
[15, 16]],
]]
以上是关于小白学Pytorch系列--Torch.nn API Vision Layers(15)的主要内容,如果未能解决你的问题,请参考以下文章
[Pytorch系列-28]:神经网络基础 - torch.nn模块功能列表
[Pytorch系列-30]:神经网络基础 - torch.nn库五大基本功能:nn.Parameternn.Linearnn.functioinalnn.Modulenn.Sequentia(代码片
[Pytorch系列-53]:循环神经网络 - torch.nn.LSTM()参数详解
[Pytorch系列-54]:循环神经网络 - torch.nn.GRU()参数详解