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