Operacje tensorowe wyrównowują równoważne kształty i puste tensory

Począwszy od .NET 11, operacje tensorowe używają spójnych reguł wyrównania kształtu. Domyślne puste tensory i zakresy rangi zerowej mają efektywny kształt [0] podczas obliczeń, a operacje mogą ignorować nadmiarowe wiodące wymiary jednoelementowe podczas wyrównywania kształtów.

Zmiana jest dostarczana w pakiecie System.Numerics.Tensors, wraz z obsługiwanymi platformami docelowymi. Aktualizowanie pakietu może mieć wpływ na aplikacje przeznaczone dla wcześniejszych .NET wersji.

Wersja wprowadzona

.NET 11

Poprzednie zachowanie

Operacje na tensorach obsłużyły kształty niespójnie. Niektóre operacje wymagały dokładnego dopasowania kształtu, podczas gdy inne wyrównały wymiary inaczej. W związku z tym równoważne kształty z nadmiarowymi wiodącymi wymiarami jednoelementowymi, takimi jak [1, 1, 3] i [3], mogą zostać odrzucone lub zinterpretowane inaczej w ramach operacji.

Domyślne puste tensory i zakresy zachowywały metadane rangi zero, ale operacje nie traktowały ich spójnie jako wektorów o efektywnym kształcie [0]. Operacje stack i łączenia mogą również interpretować oś inaczej na podstawie rzędów danych wejściowych.

Niektóre operacje również zawęziły liczbę elementów logicznych lub przesunięcia do int, co uniemożliwiało prawidłowe przechodzenie przez zakresy tensora oparte na natywnej pamięci z więcej niż int.MaxValue elementami. Operacje EqualsAny, GreaterThanAny, GreaterThanOrEqualAny, LessThanAny i LessThanOrEqualAny nie sprawdzały spójnie pełnej logicznej długości danych wejściowych, w tym w przypadku pustych danych wejściowych.

Nowe zachowanie

Operacje na tensorach używają teraz współużytkowanych reguł wyrównania kształtu:

  • Domyślne puste tensory i zakresy rangi zerowej mają efektywny kształt [0] na potrzeby obliczeń. Ich przechowywane Rank, Lengths i Strides nie zmieniają się, a puste kształty z jawnym rankingiem zachowują swoje wymiary.
  • Operacje mogą dodawać lub usuwać nadmiarowe wiodące wymiary singletonowe podczas wyrównywania kształtów. Na przykład [1, 1, 3] jest wyrównany względem [3], ale [2, 1] i [1, 2] pozostają odrębne. Wymiary o zerowej długości i niewiodące wymiary singletonowe pozostają znaczące.
  • Równość kształtu ignoruje tylko nadmiarowe wiodące wymiary singletonowe. Nie rozgłasza innych wymiarów.
  • Operacje stack i łączenia interpretują oś przy użyciu efektywnego kształtu pierwszego wejścia. Inne dane wejściowe i miejsca docelowe są wyrównane do tego kształtu.
  • Domyślne puste wartości mogą być rozgłaszane do [2, 0]. Operacja binarna między efektywnymi kształtami [0] i [0, 2] odrzuca niezgodne wymiary końcowe.
  • Źródła i miejsca docelowe zachowują żądane metadane kształtu, gdy operacje je wyrównają.

Segmenty tensorów obsługiwane przez kod natywny można teraz przechodzić przy użyciu długości i przesunięć o rozmiarze natywnym, w tym segmentów z więcej niż int.MaxValue elementami logicznymi. Puste widoki również zachowują origin przechowywania w obrębie swojego źródła. Operacje EqualsAny, GreaterThanAny, GreaterThanOrEqualAny, LessThanAny i LessThanOrEqualAny teraz sprawdzają pełny logiczny zakres danych wejściowych i poprawnie obsługują puste dane wejściowe.

Typ zmiany przełamującej

Jest to zmiana behawioralna.

Przyczyna zmiany

Spójne reguły kształtów sprawiają, że operacje tensor są bardziej przewidywalne i zachowują jawnie żądane wymiary, umożliwiając jednocześnie współdziałanie kształtów równoważnych. Iterowanie w rozmiarze natywnym umożliwia również operacje obejmujące pełny logiczny zakres przedziałów obsługiwanych przez większy obszar pamięci.

Aby uzyskać więcej informacji, zobacz dotnet/runtime#135060.

Przejrzyj kod, który zależy od operacji na tensorze akceptującej lub odrzucającej określoną kombinację kształtu. Uwzględnij domyślne puste wartości rzędu zerowego jako mające skuteczny kształt [0], a nadmiarowe wiodące wymiary jednoelementowe powinny być ignorowane podczas wyrównywania oraz porównywania kształtów. Jawne wymiary o zerowej długości i niewiodące wymiary jednoelementowe pozostają znaczące.

W przypadku operacji stack i łączenia zinterpretuj oś względem efektywnego kształtu pierwszego wejścia. Jeśli kod wymaga dokładnych przechowywanych rang lub długości, przed wywołaniem operacji zweryfikuj te metadane. Przechowywane metadane domyślnych pustych wartości nie ulegają zmianie.

Interfejsy API, których dotyczy problem