赞
踩
理论部分后面有空的时候补一下,这里先放代码和简要说明。
这里先对channel维度降低为原来 1 / 2 1/2 1/2,然后再对channel维度提升 r 2 r^2 r2 倍数, 这里 r = 2 r=2 r=2 (nn.PixelUnshuffle中的参数),同时特征图的宽度和高度都会缩减为原来的 1 / r 1/r 1/r
class Downsample(nn.Module):
def __init__(self, n_feat):
super(Downsample, self).__init__()
self.body = nn.Sequential(nn.Conv2d(n_feat, n_feat//2, kernel_size=3, stride=1, padding=1, bias=False),
nn.PixelUnshuffle(2))
def forward(self, x):
return self.body(x)
给个例子吧.
ds = Downsample(16)
# up = Upsample(16)
x = torch.randn(1, 16, 64, 64)
x = ds(x)
# x = up(x)
print(x.shape) # torch.Size([1, 32, 32, 32])
这里
[
1
,
16
,
64
,
64
]
[1, 16, 64, 64]
[1,16,64,64] 经过 conv 层后变为
[
1
,
8
,
64
,
64
]
[1, 8, 64, 64]
[1,8,64,64], 然后经过 PixelUnshuffle 层 变为
[
1
,
8
×
4
,
64
/
2
,
64
/
2
]
=
[
1
,
32
,
32
,
32
]
[1, 8 \times 4, 64 / 2, 64 / 2]=[1, 32, 32,32]
[1,8×4,64/2,64/2]=[1,32,32,32]
这里先对channel维度提升为原来的 2 2 2 倍,然后再对channel维度降低为原来的 1 / ( r 2 ) 1/(r^2) 1/(r2) , 这里 r = 2 r=2 r=2 (nn.PixelUnshuffle中的参数),同时特征图的宽度和高度都会扩大为原来的 2 2 2 倍。
class Upsample(nn.Module):
def __init__(self, n_feat):
super(Upsample, self).__init__()
self.body = nn.Sequential(nn.Conv2d(n_feat, n_feat*2, kernel_size=3, stride=1, padding=1, bias=False),
nn.PixelShuffle(2))
def forward(self, x):
return self.body(x)
给个例子吧
# ds = Downsample(16)
up = Upsample(16)
x = torch.randn(1, 16, 64, 64)
# x = ds(x)
x = up(x)
print(x.shape) # torch.Size([1, 8, 128, 128])
这里 [ 1 , 16 , 64 , 64 ] [1, 16, 64, 64] [1,16,64,64] 经过 conv 层后变为 [ 1 , 32 , 64 , 64 ] [1, 32, 64, 64] [1,32,64,64], 然后经过 PixelUnshuffle 层 变为 [ 1 , 32 / 4 , 64 × 2 , 64 × 2 ] = [ 1 , 8 , 128 , 128 ] [1, 32/4, 64 \times 2, 64 \times 2]=[1, 8, 128, 128] [1,32/4,64×2,64×2]=[1,8,128,128]
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。