Tensor 演算では、同等の形状を持つテンソルや空のテンソルが整列されます

.NET 11 以降では、テンソル操作では一貫した形状アラインメント規則が使用されます。 既定のランクゼロの空のテンソルとスパンは、計算中に [0] の有効な形状を持ち、形状を整合させるときに冗長な先行シングルトン ディメンションを無視できます。

この変更は、サポートされているターゲット フレームワークを含め、 System.Numerics.Tensors パッケージで提供されます。 パッケージを更新すると、以前の.NETバージョンを対象とするアプリに影響する可能性があります。

導入されたバージョン

.NET 11

以前の動作

Tensor 演算では、形状の扱いに一貫性がありませんでした。 一部の操作では正確な形状の一致が必要ですが、他の操作では次元の揃え方が異なります。 その結果、[1, 1, 3] や [3] のように、先頭に重複する単一の寸法を持つ同等の形状は、処理ごとに却下されたり、異なる解釈がなされたりする可能性があります。

デフォルトで空のテンソルおよびスパンはランク ゼロのメタデータを保持していましたが、演算ではそれらを有効な形状が [0] のベクトルとして整合的に扱うわけではありませんでした。 スタック操作と連結操作では、入力ランクに基づいて軸を異なる方法で解釈することもできます。

また、一部の操作では論理要素数やオフセットが int 未満に制限されていたため、要素数が int.MaxValue を超えるネイティブバックのテンソル スパンが正しく走査されなくなっていました。 EqualsAny、GreaterThanAny、GreaterThanOrEqualAny、LessThanAny、LessThanOrEqualAnyの操作では、空の入力の場合も含め、完全な論理入力の長さを一貫して検査していませんでした。

新しい動作

Tensor 操作で、共有形状整列ルールが使用されるようになりました。

  • 既定のランクゼロの空のテンソルとスパンの実効的な形状は、計算では [0] です。 保存されている Rank、Lengths、Strides は変化せず、明示的にランク付けされた空の形状はその寸法を維持します。
  • 操作では、形状を揃えるときに、冗長な先行シングルトン ディメンションを追加または削除できます。 たとえば、[1, 1, 3] は [3] と一致しますが、[2, 1] と [1, 2] は区別されます。 長さ 0 の寸法と非先頭シングルトン寸法は引き続き重要です。
  • 図形の等価性では、冗長な先頭のシングルトン ディメンションのみが無視されます。 他のディメンションはブロードキャストされません。
  • 積み上げ操作と連結操作では、最初の入力の有効な形状を使用して軸が解釈されます。 その他の入力や出力先も、その形状に合わせて配置されます。
  • デフォルトの空の値は、[2, 0] にブロードキャストされる可能性があります。 有効な形状 [0] と [0, 2] 間の二項演算では、互換性のない末尾の次元が除外されます。
  • ソースと宛先は、操作によって位置合わせが行われる際、要求された形状メタデータを保持します。

ネイティブ形式のテンソル スパンは、ネイティブサイズの長さとオフセットを使用して走査できるようになりました。これには、int.MaxValue 個以上の論理要素を含むスパンも含まれます。 空のビューも、そのソース内にストレージのオリジンを保持しています。 EqualsAny、GreaterThanAny、GreaterThanOrEqualAny、LessThanAny、LessThanOrEqualAnyの各操作で、完全な論理入力範囲が検査され、空の入力が正しく処理されるようになりました。

破壊的変更の種類

これは動作の 変化です。

変更理由

整合性のある形状ルールにより、テンソル演算の挙動が予測しやすくなり、明示的に要求された次元が維持されると同時に、同等の形状を持つ要素同士を組み合わせて使用できるようになります。 ネイティブ サイズのトラバーサルを使用すると、操作は、より大きなストレージによってサポートされるスパンの完全な論理範囲をカバーすることもできます。

詳細については、 dotnet/runtime#135060 を参照してください。

特定の形状の組み合わせを受け入れるか拒否するテンソル操作に依存するコードを確認します。 デフォルトのランク 0 の空の値については、実質的な形状が [0] であるとみなす。また、冗長な先頭のシングルトン次元については、配置と形状比較の際には無視します。 明示的な長さ 0 のディメンションと、先頭以外のシングルトンディメンションは引き続き意味を持ちます。

スタック操作と連結操作の場合は、最初の入力の有効な形状を基準に軸を解釈します。 コードで正確なランクや長さの保存が求められる場合は、操作を呼び出す前にそのメタデータを検証してください。 既定の空の値の格納されたメタデータは変更されません。

影響を受ける API