Capas de muestreo ascendente y descendente nn.pixelshuffle y nn.pixelunshuffle

prefacio

Complete la parte teórica cuando tenga tiempo, aquí está el código y una breve descripción primero.


Reducir la muestra

Aquí primero reduzca la dimensión del canal al original 1 / 2 1/21/2 y luego aumente la dimensión del canal enr 2 r^2rMúltiplo de 2 , aquír = 2 r=2r=2 (parámetros en nn.PixelUnshuffle), y el ancho y alto del mapa de funciones se reducirá al original1 / r 1/r1/ 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)

Dar un ejemplo.

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])

Aquí [ 1 , 16 , 64 , 64 ] [1, 16, 64, 64][ 1 ,16 ,64 ,64 ] después de que la capa de conversión se convierta en[1, 8, 64, 64] [1, 8, 64, 64][ 1 ,8 ,64 ,64 ] , y luego, después de que la capa PixelUnshuffle se convierta en[ 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 ]

Sobremuestreo

Aquí, primero aumente la dimensión del canal al original 2 22 veces, y luego reduzca la dimensión del canal al original1 / ( r 2 ) 1/(r^2)1/ ( r2 ), donder = 2 r=2r=2 (parámetros en nn.PixelUnshuffle), y el ancho y alto del mapa de características se expandirá al original2 22x .

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)

dar un ejemplo

# 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])

Aquí [ 1 , 16 , 64 , 64 ] [1, 16, 64, 64][ 1 ,16 ,64 ,64 ] después de que la capa de conversión se convierta en[1, 32, 64, 64] [1, 32, 64, 64][ 1 ,32 ,64 ,64 ] , y luego, después de que la capa PixelUnshuffle se convierta en[ 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 ]

Supongo que te gusta

Origin blog.csdn.net/weixin_43850253/article/details/131531524
Recomendado
Clasificación