Upsampling- und Downsampling-Ebenen nn.pixelshuffle und nn.pixelunshuffle

Vorwort

Bitte füllen Sie den theoretischen Teil aus, wenn Sie Zeit haben. Hier finden Sie zunächst den Code und eine kurze Beschreibung.


Downsampling

Hier zunächst das Kanalmaß auf das ursprüngliche 1/2 1/2 reduzieren1/2 und erhöhen Sie dann die Kanalabmessung umr 2 r^2RVielfaches von 2 , hierr = 2 r=2R=2 (Parameter in nn.PixelUnshuffle) und die Breite und Höhe der Feature-Map werden auf das 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)

Gib ein Beispiel.

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

Hier [ 1 , 16 , 64 , 64 ] [1, 16, 64, 64][ 1 ,16 ,64 ,64 ] , nachdem die Conv-Ebene[1, 8, 64, 64] [1, 8, 64, 64][ 1 ,8 ,64 ,64 ] und dann, nachdem die PixelUnshuffle-Ebene zu[ 1 , 8 × 4 , 64 / 2 , 64 / 2 ] = [ 1 , 32 , 32 , 32 ] [1, 8 \times 4, 64 / 2, 64 / 2] wird ] =[1, 32, 32, 32][ 1 ,8×4 ,64/2 ,64/2 ]=[ 1 ,32 ,32 ,32 ]

Upsampling

Erhöhen Sie hier zunächst die Kanaldimension auf die ursprünglichen 2 22 -mal, und reduzieren Sie dann die Kanalabmessung auf das Original1 / ( r 2 ) 1/(r^2)1/ ( r2 ), wobeir = 2 r=2R=2 (Parameter in nn.PixelUnshuffle) und die Breite und Höhe der Feature-Map werden auf die ursprünglichen2 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)

gib ein Beispiel

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

Hier [ 1 , 16 , 64 , 64 ] [1, 16, 64, 64][ 1 ,16 ,64 ,64 ] , nachdem die Conv-Ebene[1, 32, 64, 64] [1, 32, 64, 64][ 1 ,32 ,64 ,64 ] und dann, nachdem die PixelUnshuffle-Ebene zu[ 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 ]

Guess you like

Origin blog.csdn.net/weixin_43850253/article/details/131531524