Python - AI - Tensor - リサイズ(interpolate)

 クラウディア
1. 概要
2. モード
3. やってみる
4. わかったこと

1. 概要

 「Torch」で学習するためには、それぞれの「Tensor」のサイズを合わせなければならない。  サイズを変更するメソッドがあります。  本ページは、下記のサイトを参考にさせていただきました。
[PyTorch] テンソルのリサイズ (interpolate)」
「Pytorch で tensor のリサイズ

2. モード

 リサイズするメソッドは、「interpolate」で、基本的な形式は。

torch.nn.functional.interpolate(input, size=None, scale_factor=None, mode='nearest')
 それぞれの引数の意味は。 ・input 入力 tensor ・size 出力サイズ tuple ・scale_factor 拡大(縮小)率 ・mode 補完モード  補完モードには、下記のいずれかの値を設定できます。 ・nearest ・linear ・bilinear ・bicubic ・trilinear ・area  で、それぞれの値の意味をどこかで見かけたのですが・・・。  現在(2024年11月11日)見つからない。  追而書。

3. やってみる

 下記ようなコードを書いてみました。  サイズを少し広げて、どのように差分を埋めていくかを見たいわけです。  2x2 のものを 5x5 もしくは 2x5 に広げます。

import os
import torch

x = torch.tensor([[[[0.0, 1.0],[2.0, 3.0]]]])
print(x, os.linesep)

y = torch.tensor([[[0.0, 1.0],[2.0, 3.0]]])
print(y, os.linesep)

z = torch.tensor([[[[[0.0, 1.0],[2.0, 3.0]]]]])
print(z, os.linesep)

nearest   = torch.nn.functional.interpolate(x, (5, 5), mode='nearest')
print('nearest')
print(nearest, os.linesep)

linear    = torch.nn.functional.interpolate(y, (5), mode='linear', align_corners=False)
print('linear')
print(linear, os.linesep)

bilinear  = torch.nn.functional.interpolate(x, (5, 5), mode='bilinear', align_corners=False)
print('bilinear')
print(bilinear, os.linesep)

bicubic   = torch.nn.functional.interpolate(x, (5, 5), mode='bicubic', align_corners=False)
print('bicubic')
print(bicubic, os.linesep)

trilinear = torch.nn.functional.interpolate(z, (1, 5, 5), mode='trilinear', align_corners=False)
print('trilinear')
print(trilinear, os.linesep)

area      = torch.nn.functional.interpolate(x, (5, 5), mode='area')
print('area')
print(area, os.linesep)
 実行すると、下記の出力結果が得られます。

tensor([[[[0., 1.],
          [2., 3.]]]])

tensor([[[0., 1.],
         [2., 3.]]])

tensor([[[[[0., 1.],
           [2., 3.]]]]])

nearest
tensor([[[[0., 0., 0., 1., 1.],
          [0., 0., 0., 1., 1.],
          [0., 0., 0., 1., 1.],
          [2., 2., 2., 3., 3.],
          [2., 2., 2., 3., 3.]]]])

linear
tensor([[[0.0000, 0.1000, 0.5000, 0.9000, 1.0000],
         [2.0000, 2.1000, 2.5000, 2.9000, 3.0000]]])

bilinear
tensor([[[[0.0000, 0.1000, 0.5000, 0.9000, 1.0000],
          [0.2000, 0.3000, 0.7000, 1.1000, 1.2000],
          [1.0000, 1.1000, 1.5000, 1.9000, 2.0000],
          [1.8000, 1.9000, 2.3000, 2.7000, 2.8000],
          [2.0000, 2.1000, 2.5000, 2.9000, 3.0000]]]])

bicubic
tensor([[[[-0.3307, -0.1385,  0.2795,  0.6975,  0.8898],
          [ 0.0538,  0.2460,  0.6640,  1.0820,  1.2743],
          [ 0.8898,  1.0820,  1.5000,  1.9180,  2.1103],
          [ 1.7258,  1.9180,  2.3360,  2.7540,  2.9463],
          [ 2.1103,  2.3025,  2.7205,  3.1385,  3.3308]]]])

trilinear
tensor([[[[[0.0000, 0.1000, 0.5000, 0.9000, 1.0000],
           [0.2000, 0.3000, 0.7000, 1.1000, 1.2000],
           [1.0000, 1.1000, 1.5000, 1.9000, 2.0000],
           [1.8000, 1.9000, 2.3000, 2.7000, 2.8000],
           [2.0000, 2.1000, 2.5000, 2.9000, 3.0000]]]]])

area
tensor([[[[0.0000, 0.0000, 0.5000, 1.0000, 1.0000],
          [0.0000, 0.0000, 0.5000, 1.0000, 1.0000],
          [1.0000, 1.0000, 1.5000, 2.0000, 2.0000],
          [2.0000, 2.0000, 2.5000, 3.0000, 3.0000],
          [2.0000, 2.0000, 2.5000, 3.0000, 3.0000]]]])

4. わかったこと

 あれこれやってみて、わかったことをメモしておきます。  「nearest」「area」は、ほぼ同じ値のまま、サイズを増やしているようです。  「area」は、値の補完が少々あるようです。  「bilinear」「trilinear」は、間を中間的な値で、埋めながら補完して、サイズを増やしているようです。  「linear」は、次元が異なるものの、ほぼ上と同じ。  「bicubic」は、元のあたいも変えつつ、サイズを増やしているようです。  これは、法則が非常にわかりにくいというか、理解できない。  以下、制限的なもの。  「mode」に「linear」を設定する際は、入力に、4次元のものが必要なようです。  4次元でないと、下記のようなエラーになります。

NotImplementedError: Got 4D input, but linear mode needs 3D input
 「mode」に「trilinear」を設定する際は、入力に、5次元のものが必要なようです。  5次元でないと、下記のようなエラーになります。

NotImplementedError: Got 4D input, but trilinear mode needs 5D input
 基本形に記載していませんが。  「align_corners=False」という引数が、必要なものと、つけてはいけないものがあるようです。  「mode」が「nearest」「area」の場合は、つけてはいけないようで、つけちゃうと下記のようなエラーになります。

ValueError: align_corners option can only be set with the interpolating modes: linear | bilinear | bicubic | trilinear
AbemaTV 無料体験
JETBOY