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