PyTorch torch.scatter_reduce 関数
torch.scatter_reducePyTorchにおいて、ソーステンソルの値を指定された方法で指定された位置に集約するための関数です。合計、積、最大値、最小値など、複数の集約方法をサポートしています。
関数定義
torch.scatter_reduce(input, dim, index, src, reduce='sum', *, include_self=True)
パラメータ:
input(Tensor): 入力テンソル。dim(int): 集約する次元。index(Tensor): インデックステンソル。srcの値をinputのどの位置に集約するかを指定します。src(Tensor): ソーステンソル。集約する値です。reduce(str): 集約方法。指定可能な値は'sum'、'prod'、'mean'、'amax'、'amin'、'multiply'です。デフォルトは'sum'です。include_self(bool, オプション): 集約時にインデックス位置自体の元の値を含めるかどうか。デフォルトはTrueです。
戻り値:
torch.Tensor: 集約後のテンソルを返します。
使用例
例
import torch
# 入力テンソルを作成
input = torch.ones(3, 5)
# インデックスとソースを作成
index = torch.tensor([[0, 1, 2, 0, 0],
[1, 2, 0, 1, 2],
[2, 0, 1, 2, 0]])
src = torch.tensor([[1, 1, 1, 1, 1],
[2, 2, 2, 2, 2],
[3, 3, 3, 3, 3]])
# sumで集約
output = torch.scatter_reduce(input, dim=0, index=index, src=src, reduce='sum')
print("入力:")
print(input)
print("n集約方法: sum")
print("結果:")
print(output)
# 入力テンソルを作成
input = torch.ones(3, 5)
# インデックスとソースを作成
index = torch.tensor([[0, 1, 2, 0, 0],
[1, 2, 0, 1, 2],
[2, 0, 1, 2, 0]])
src = torch.tensor([[1, 1, 1, 1, 1],
[2, 2, 2, 2, 2],
[3, 3, 3, 3, 3]])
# sumで集約
output = torch.scatter_reduce(input, dim=0, index=index, src=src, reduce='sum')
print("入力:")
print(input)
print("n集約方法: sum")
print("結果:")
print(output)
出力結果は次のとおりです:
输入:
tensor([[1., 1., 1., 1., 1.],
[1., 1., 1., 1., 1.],
[1., 1., 1., 1., 1.]])
聚合方式: sum
结果:
tensor([[4., 2., 3., 4., 4.],
[2., 2., 2., 2., 2.],
[3., 3., 2., 3., 3.]])
例
import torch
# 異なる集約方法をテスト
input = torch.zeros(3, 3)
index = torch.tensor([[0, 0, 0],
[1, 1, 1],
[2, 2, 2]])
src = torch.tensor([[2, 3, 4],
[5, 6, 7],
[8, 9, 10]])
# prod (積) を使用
output_prod = torch.scatter_reduce(input, 0, index, src, reduce='prod')
print("prod 集約:")
print(output_prod)
# amax (最大値) を使用
output_max = torch.scatter_reduce(input, 0, index, src, reduce='amax')
print("namax 集約:")
print(output_max)
# amin (最小値) を使用
output_min = torch.scatter_reduce(input, 0, index, src, reduce='amin')
print("namin 集約:")
print(output_min)
# 異なる集約方法をテスト
input = torch.zeros(3, 3)
index = torch.tensor([[0, 0, 0],
[1, 1, 1],
[2, 2, 2]])
src = torch.tensor([[2, 3, 4],
[5, 6, 7],
[8, 9, 10]])
# prod (積) を使用
output_prod = torch.scatter_reduce(input, 0, index, src, reduce='prod')
print("prod 集約:")
print(output_prod)
# amax (最大値) を使用
output_max = torch.scatter_reduce(input, 0, index, src, reduce='amax')
print("namax 集約:")
print(output_max)
# amin (最小値) を使用
output_min = torch.scatter_reduce(input, 0, index, src, reduce='amin')
print("namin 集約:")
print(output_min)
出力結果は次のとおりです:
prod 聚合:
tensor([[ 2., 3., 4.],
[ 5., 6., 7.],
[ 8., 9., 10.]])
amax 聚合:
tensor([[ 2., 3., 4.],
[ 5., 6., 7.],
[ 8., 9., 10.]])
amin 聚合:
tensor([[ 2., 3., 4.],
[ 5., 6., 7.],
[ 8., 9., 10.]])
例
import torch
# include_self パラメータを使用
input = torch.tensor([1.0, 2.0, 3.0])
index = torch.tensor([0, 0, 0])
src = torch.tensor([10.0, 20.0, 30.0])
# 自身の値を含める (デフォルト)
output1 = torch.scatter_reduce(input, 0, index, src, reduce='sum', include_self=True)
print("include_self=True:", output1)
# 自身の値を含めない
output2 = torch.scatter_reduce(input, 0, index, src, reduce='sum', include_self=False)
print("include_self=False:", output2)
# include_self パラメータを使用
input = torch.tensor([1.0, 2.0, 3.0])
index = torch.tensor([0, 0, 0])
src = torch.tensor([10.0, 20.0, 30.0])
# 自身の値を含める (デフォルト)
output1 = torch.scatter_reduce(input, 0, index, src, reduce='sum', include_self=True)
print("include_self=True:", output1)
# 自身の値を含めない
output2 = torch.scatter_reduce(input, 0, index, src, reduce='sum', include_self=False)
print("include_self=False:", output2)
出力結果は次のとおりです:
include_self=True: tensor([66., 2., 3.]) include_self=False: tensor([60., 2., 3.])
注意:torch.scatter_reduce元の入力テンソルは変更されず、新しいテンソルが返されます。複数のインデックスが同じ位置を指すことができ、値は指定された集約方法に従って集約されます。include_self=False特定のシナリオで役立ちます。例えば、グラフニューラルネットワークにおいてノード自身の特徴を重複して計算するのを防ぐ場合などです。
その他の拡張
Pytorch torch リファレンスマニュアル