[PyTorch] テンソルのリサイズ (Upsample)

前回に引き続き、今度はUpsampleの使い方とモードの比較を行います。

構文

Upsampleのモードは下のようになります。Interpolateにあったareaがなくなっています。4階テンソルで選択できるのは、Interpolate同様※のついたところだろうと思います。

  • nearest※
  • linear
  • bilinear※
  • bicubic※
  • trilinear

interpolateと違い、インスタンス化して呼び出すことにりますので、もしかしたらこっちのほうが使い勝手がいいかもしれません。(前回と比較すると分かりますが、結果そのものはinterpolateとUpsampleとで差異はありません)

  • size: 出力データサイズ(タプル)
  • scale_factor: データの拡大(縮小)率
  • mode: 補間モード
  • align_corners: 入出力データの端っこのピクセルの位置を合わせる (default: False)
  • recompute_scale_factor: scale_factorを再計算するかどうか(default: False)
torch.nn.Upsample(size=None, scale_factor=None, mode='nearest', align_corners=None, recompute_scale_factor=None)

動作確認

まずはリサイズ用のテンソルを作成します。これは前回と同じです。

x = torch.arange(0, 16, dtype=torch.float32).view(-1, 1, 4, 4)

# tensor([[[[ 0.,  1.,  2.,  3.],
#           [ 4.,  5.,  6.,  7.],
#           [ 8.,  9., 10., 11.],
#           [12., 13., 14., 15.]]]])

アップサンプリング

  • nearest
import torch.nn as nn

upsample = nn.Upsample(scale_factor=2, mode='nearest')
scaled_x = upsample(x)

# tensor([[[[ 0.,  0.,  1.,  1.,  2.,  2.,  3.,  3.],
#           [ 0.,  0.,  1.,  1.,  2.,  2.,  3.,  3.],
#           [ 4.,  4.,  5.,  5.,  6.,  6.,  7.,  7.],
#           [ 4.,  4.,  5.,  5.,  6.,  6.,  7.,  7.],
#           [ 8.,  8.,  9.,  9., 10., 10., 11., 11.],
#           [ 8.,  8.,  9.,  9., 10., 10., 11., 11.],
#           [12., 12., 13., 13., 14., 14., 15., 15.],
#           [12., 12., 13., 13., 14., 14., 15., 15.]]]])
  • bilinear
upsample = nn.Upsample(scale_factor=2, mode='bilinear')
scaled_x = upsample(x)

# tensor([[[[ 0.0000,  0.2500,  0.7500,  1.2500,  1.7500,  2.2500,  2.7500,
#             3.0000],
#           [ 1.0000,  1.2500,  1.7500,  2.2500,  2.7500,  3.2500,  3.7500,
#             4.0000],
#           [ 3.0000,  3.2500,  3.7500,  4.2500,  4.7500,  5.2500,  5.7500,
#             6.0000],
#           [ 5.0000,  5.2500,  5.7500,  6.2500,  6.7500,  7.2500,  7.7500,
#             8.0000],
#           [ 7.0000,  7.2500,  7.7500,  8.2500,  8.7500,  9.2500,  9.7500,
#            10.0000],
#           [ 9.0000,  9.2500,  9.7500, 10.2500, 10.7500, 11.2500, 11.7500,
#            12.0000],
#           [11.0000, 11.2500, 11.7500, 12.2500, 12.7500, 13.2500, 13.7500,
#            14.0000],
#           [12.0000, 12.2500, 12.7500, 13.2500, 13.7500, 14.2500, 14.7500,
#            15.0000]]]])
  • bicubic
upsample = nn.Upsample(scale_factor=2, mode='bicubic')
scaled_x = upsample(x)

# tensor([[[[-0.5273, -0.2305,  0.2461,  0.8750,  1.2812,  1.9102,  2.3867,
#             2.6836],
#           [ 0.6602,  0.9570,  1.4336,  2.0625,  2.4688,  3.0977,  3.5742,
#             3.8711],
#           [ 2.5664,  2.8633,  3.3398,  3.9688,  4.3750,  5.0039,  5.4805,
#             5.7773],
#           [ 5.0820,  5.3789,  5.8555,  6.4844,  6.8906,  7.5195,  7.9961,
#             8.2930],
#           [ 6.7070,  7.0039,  7.4805,  8.1094,  8.5156,  9.1445,  9.6211,
#             9.9180],
#           [ 9.2227,  9.5195,  9.9961, 10.6250, 11.0312, 11.6602, 12.1367,
#            12.4336],
#           [11.1289, 11.4258, 11.9023, 12.5312, 12.9375, 13.5664, 14.0430,
#            14.3398],
#           [12.3164, 12.6133, 13.0898, 13.7188, 14.1250, 14.7539, 15.2305,
#            15.5273]]]])

ダウンサンプリング

  • nearest
upsample = nn.Upsample(scale_factor=1/2, mode='nearest')
scaled_x = upsample(x)

# tensor([[[[ 0.,  2.],
#           [ 8., 10.]]]])
  • bilinear
upsample = nn.Upsample(scale_factor=1/2, mode='bilinear')
scaled_x = upsample(x)

# tensor([[[[ 2.5000,  4.5000],
#           [10.5000, 12.5000]]]])
  • bicubic
upsample = nn.Upsample(scale_factor=1/2, mode='bicubic')
scaled_x = upsample(x)

# tensor([[[[ 2.0312,  4.2188],
#           [10.7812, 12.9688]]]])

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です