ディープ ラーニングのアップサンプリングとダウンサンプリングの概念と実装

#pic_center = 400x
シリーズの記事:



参考ブログ

[ディープラーニング] アップサンプリング、ダウンサンプリング、コンボリューション

torch.nn.functional.interpolate 関数

コンセプト

アップサンプリング

簡単に言えば、ピクセルキーにデータを挿入することで画像を拡大します

1. 補間, 一般的に双一次補間を使用します, 効果が最高であるため, 計算は他の補間方法よりも複雑ですが, 畳み込み計算と比較すると, 言及する価値はないと言えます. 他の補間方法には最近傍法が含まれます.補間、三重線形補間など。

2. 転置畳み込みまたは逆畳み込み (Transpose Conv)、入力特徴マップの間隔を 0 で埋めてから標準の畳み込み計算を実行することにより、出力特徴マップのサイズを入力よりも大きくすることができます; 上記のプーリングと比較して、デコンボリューションを使用した画像の「アップサンプリング」を学習できます (畳み込み演算が使用され、そのパラメーターは学習可能です)。

ダウンサンプリング

簡単に言えば、画像を縮小することであり、
主な目的は 1. 表示領域のサイズに画像を合わせる 2. 対応する画像のサムネイルを生成する 2.

1. ストライド 2 の畳み込み層で実装: 畳み込みプロセスによって引き起こされる画像の縮小は、特徴を抽出することです。ダウンサンプリング プロセスは情報損失のプロセスであり、プーリング層は学習可能ではありません. プーリングの代わりにストライド 2 の学習可能な畳み込み層を使用すると、より良い結果を得ることができますが、当然、ある程度の計算量も増加します.

2. ストライド 2 のプーリング レイヤーで実装: プーリング ダウンサンプリングは、フィーチャの次元を削減することです。Max-pooling や Average-pooling など、現在は Max-pooling が通常使用されています。これは、計算が簡単で、テクスチャ機能をより適切に保持できるためです。

達成

完全なコードは DDIM/models/diffusion.py にあります

class Upsample(nn.Module):
    def __init__(self, in_channels, with_conv):
        super().__init__()
        self.with_conv = with_conv
        if self.with_conv:
            self.conv = torch.nn.Conv2d(in_channels,
                                        in_channels,
                                        kernel_size=3,
                                        stride=1,
                                        padding=1)

    def forward(self, x):
        x = torch.nn.functional.interpolate(
            x, scale_factor=2.0, mode="nearest")
        if self.with_conv:
            x = self.conv(x)
        return x


class Downsample(nn.Module):
    def __init__(self, in_channels, with_conv):
        super().__init__()
        self.with_conv = with_conv
        if self.with_conv:
            # no asymmetric padding in torch conv, must do it ourselves
            self.conv = torch.nn.Conv2d(in_channels,
                                        in_channels,
                                        kernel_size=3,
                                        stride=2,
                                        padding=0)

    def forward(self, x):
        if self.with_conv:
            pad = (0, 1, 0, 1)
            x = torch.nn.functional.pad(x, pad, mode="constant", value=0)
            x = self.conv(x)
        else:
            x = torch.nn.functional.avg_pool2d(x, kernel_size=2, stride=2)
        return x

アップサンプリング

Interpolate は補間を意味します

 x = torch.nn.functional.interpolate(
            x, scale_factor=2.0, mode="nearest")

デフォルト補間(

入力: 任意,
サイズ: 任意 | なし = …,
scale_factor: 任意 | なし = …,
モード: str = …,
align_corners: 任意 | なし = …,
recompute_scale_factor: 任意 | なし = …,
アンチエイリアス: bool = …) -> なし

パラメータ:

  • input ( Tensor ) – 入力テンソル。

  • size ( int or Tuple *[ int ] or* Tuple *[ int ,* int ] or Tuple *[ int ,* int , int ] ) – 大小。

  • scale_factor ( float または Tuple *[ float ]*) – 出力が入力である回数を指定します。入力がタプルの場合は、タプル タイプとしても指定する必要があります。

    • 注: size と scale_factor はいずれかを指定できます
  • モード(文字列) –可使用的上采样算法,有'nearest', 'linear', 'bilinear', 'bicubic' , 'trilinear'和'area'. 默认使用'nearest'。

  • align_corners ( bool , optional ) – 几何上,我们认为输入和输出的像素是正方形,而不是点。True に設定されている場合、入力テンソルと出力テンソルはコーナー ピクセルの中心点によって整列され、コーナー ピクセルの値が保持されます。False に設定すると、入力テンソルと出力テンソルはそれらのコーナー ピクセルのコーナーによって整列され、補間は範囲外の値のエッジ値でパディングされ、この操作は入力サイズに依存しなくなります当scale_factor保持不变时

ダウンサンプリング

# 池化方式
x = torch.nn.functional.avg_pool2d(x, kernel_size=2, stride=2)
#卷积形式
x = np.random.randint(1,10, [1,5,5])
x = torch.FloatTensor(x)
print(x)
in_channels = 1
conv = torch.nn.Conv2d(in_channels, in_channels, kernel_size=3, stride=2, padding=0)
print(conv)
x = conv(x)
print(x.shape)

おすすめ

転載: blog.csdn.net/weixin_42382758/article/details/130420658