web-dev-qa-db-ja.com

pytorchのパディングでテンソルを再形成する

次元(30, 35, 49)のテンソルがあります。形状(30, 35, 512)を持つ別のテンソルと乗算できるようにするために、(30, 35, 512)に形状を変更したいと思います。

(30, 35, 49)次元にするために、(30, 35, 512)次元でテンソルをパディングします。

これをどのように行うことができますか?

12
yusuf

最も簡単な解決策は、パディング値とターゲットディメンションでテンソルを割り当て、データがある部分を割り当てることです。

target = torch.zeros(30, 35, 512)
source = torch.ones(30, 35, 49)
target[:, :, :49] = source

テンソルにゼロをパディングし、それを別のテンソルで乗算することが最終的に意味をなすという保証はないことに注意してください、それはあなた次第です。

9
nemo

@nemoのソリューションは正常に機能しますが、pytorch内部ルーチン _torch.nn.functional.pad_ があります。これは同じことを行い、torch.ones(*sizes)*pad_valueソリューションが行ういくつかのプロパティがあります。そうではありません(つまり、反射パディングや複製パディングのような他のパディング形式...勾配関連のプロパティもチェックします):

_import torch.nn.functional as F
source = torch.Rand((5,10))
# now we expand to size (7, 11) by appending a row of 0s at pos 0 and pos 6, 
# and a column of 0s at pos 10
result = F.pad(input=source, pad=(0, 1, 1, 1), mode='constant', value=0)
_

引数のセマンティクスは次のとおりです。

  • input:ソーステンソル、
  • pad:フォームの長さ2 * len(source.shape)のリスト(最後の軸の開始、最後の軸の終了、2番目から最後の軸の開始、2番目から最後の軸の終了、3番目から最後の軸の開始など) )各軸の最初と最後に追加する次元の数を示します。
  • mode:_'constant'_、_'reflect'_、または_'replicate'_。デフォルト:さまざまな種類のパディングの_'constant'_
  • valueは定数パディング用です。
14
cleros