Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
À compter de .NET 11, les opérations sur les tenseurs utilisent des règles d’alignement de formes cohérentes. Les tenseurs et étendues vides de rang zéro par défaut ont une forme effective de [0] pendant les calculs, et les opérations peuvent ignorer les dimensions singleton de début redondantes lorsqu’elles alignent les formes.
La modification est fournie dans le package System.Numerics.Tensors, y compris ses environnements cibles pris en charge. La mise à jour du package peut affecter les applications qui ciblent les versions antérieures de .NET.
Version introduite
.NET 11
Comportement antérieur
Les opérations Tensor ont géré les dimensions de manière incohérente. Certaines opérations nécessitaient des correspondances exactes de forme, tandis que d’autres avaient des dimensions alignées différemment. Par conséquent, les formes équivalentes avec des dimensions singleton redondantes, telles que [1, 1, 3] et [3], peuvent être rejetées ou interprétées différemment d’une opération à l’autre.
Les tenseurs vides et les étendues par défaut ont conservé des métadonnées de rang zéro, mais les opérations ne les ont pas toujours traitées comme des vecteurs avec une forme efficace de [0]. Les opérations d’empilement et de concaténation peuvent également interpréter un axe différemment en fonction des rangs d’entrée.
Certaines opérations ont également réduit le nombre d’éléments logiques ou les décalages vers int, ce qui empêchait les spans de tenseur adossés au natif avec plus de int.MaxValue éléments d’être parcourus correctement. Les opérations EqualsAny, LessThanAny, GreaterThanOrEqualAny, LessThanOrEqualAny et GreaterThanAny n’ont pas inspecté de manière cohérente la longueur d’entrée logique complète, y compris pour les entrées vides.
Nouveau comportement
Les opérations Tensor utilisent désormais des règles d’alignement des formes partagées :
- Les tenseurs et les étendues vides de rang zéro par défaut ont une forme efficace de
[0]pour les calculs. Leurs formes stockéesRank,LengthsetStridesne changent pas, et les formes vides ordonnées explicitement conservent leurs dimensions. - Les opérations peuvent ajouter ou supprimer des dimensions singleton de tête redondantes lorsqu’elles alignent les dimensions des tenseurs. Par exemple,
[1, 1, 3]s’aligne sur[3], mais[2, 1]et[1, 2]restent distincts. Les dimensions de longueur nulle et les dimensions singleton non principales restent significatives. - L’égalité des formes ignore uniquement les dimensions singleton redondantes de tête. Elle ne transmet pas d’autres dimensions.
- Les opérations d’empilement et de concaténation interprètent l’axe à l’aide de la forme effective de la première entrée. D’autres entrées et destinations s’alignent sur cette forme.
- Les valeurs vides par défaut peuvent être transmises à
[2, 0]. Une opération binaire entre les tenseurs[0]effectifs et[0, 2]rejette les dimensions de fin incompatibles. - Les sources et les destinations conservent leurs métadonnées de forme demandées lorsque les opérations les alignent.
Les segments tensoriels basés sur le natif peuvent désormais être parcourus avec des longueurs et des décalages de taille native, y compris des segments avec plus de int.MaxValue éléments logiques. Les vues vides conservent également une origine de stockage dans leur source. Les opérations EqualsAny, LessThanAny, GreaterThanAny, GreaterThanOrEqualAny et LessThanOrEqualAny inspectent désormais toute la plage d’entrée logique et gèrent correctement les entrées vides.
Type de changement avec rupture de compatibilité
Il s’agit d’un changement comportemental.
Raison du changement
Les règles de forme cohérentes rendent les opérations sur les tenseurs plus prévisibles et conservent les dimensions explicitement demandées tout en permettant aux formes équivalentes de fonctionner ensemble. Le parcours à taille native permet également aux opérations de couvrir la plage logique complète de spans soutenus par un stockage plus grand.
Pour plus d’informations, consultez dotnet/runtime#135060.
Action recommandée
Passez en revue le code qui dépend d’une opération sur un tenseur acceptant ou rejetant une combinaison de formes particulière. Considérez les valeurs vides de rang zéro par défaut comme ayant une forme effective de [0], et ignorez les dimensions singleton de début redondantes lors de l’alignement et de la comparaison des formes. Les dimensions explicites de longueur nulle et les dimensions singleton non principales restent significatives.
Pour les opérations d’empilement et de concaténation, interprétez l’axe par rapport à la forme effective de la première entrée. Si votre code nécessite des rangs ou des longueurs stockés exacts, vérifiez ces métadonnées avant d’appeler l’opération. Les métadonnées enregistrées pour les valeurs vides par défaut ne changent pas.
API affectées
- Tensor.Broadcast, Tensor.BroadcastTo et Tensor.TryBroadcastTo
- Opérations de copie et opérations élément par élément sur Tensor qui alignent les formes de tenseur ou écrivent dans une destination fournie par l’appelant
- Tensor.Concatenate, Tensor.ConcatenateOnDimension, Tensor.Stack et Tensor.StackAlongDimension
- Tensor.Reshape, Tensor.Split, Tensor.Unsqueeze, Tensor.SqueezeDimension, Tensor.PermuteDimensions, Tensor.SetSlice, Tensor.SequenceEqual, Tensor.ResizeTo, Tensor.Reverse et Tensor.ReverseDimension
- Tensor.EqualsAny, Tensor.GreaterThanAny, Tensor.GreaterThanOrEqualAny, Tensor.LessThanAny et Tensor.LessThanOrEqualAny
- Tensor.IndexOfMax, Tensor.IndexOfMaxMagnitude, Tensor.IndexOfMin et Tensor.IndexOfMinMagnitude