Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
A partir do .NET 11, as operações tensoriais usam regras consistentes de alinhamento de forma. Tensores vazios e intervalos padrão de rank zero têm uma forma efetiva de [0] durante os cálculos, e as operações podem ignorar dimensões redundantes de singleton inicial quando alinham formas.
A alteração é entregue no pacote System.Numerics.Tensors , incluindo os seus frameworks-alvo suportados. Atualizar o pacote pode afetar aplicações que visam versões anteriores de .NET.
Versão introduzida
.NET 11
Comportamento anterior
As operações tensoriais lidavam com dimensões de forma inconsistente. Algumas operações exigiam correspondências exatas de formas, enquanto outras alinhavam as dimensões de forma diferente. Como resultado, formas equivalentes com dimensões redundantes singleton iniciais, como [1, 1, 3] e [3], podiam ser rejeitadas ou interpretadas de forma diferente de operação para operação.
Os tensores e intervalos vazios por defeito mantinham metadados de rank-zero, mas as operações não os tratavam consistentemente como vetores com uma forma efetiva de [0]. As operações de pilha e concatenação também podem interpretar um eixo de forma diferente consoante a dimensionalidade das entradas.
Algumas operações também restringiam contagens ou deslocamentos lógicos de elementos para int, o que impedia que intervalos de tensor com suporte nativo com mais de int.MaxValue elementos fossem percorridos corretamente. As operações EqualsAny, GreaterThanAny, GreaterThanOrEqualAny, LessThanAny e LessThanOrEqualAny não inspecionaram consistentemente o comprimento lógico total da entrada, incluindo para entradas vazias.
Novo comportamento
As operações tensoriais usam agora regras partilhadas de alinhamento de dimensões:
- Os tensores vazios e intervalos vazios de rank zero por defeito têm uma forma efetiva de
[0]para os cálculos. As suas formas vazias armazenadasRank,LengthseStridesnão mudam, e as formas vazias explicitamente ordenadas mantêm as suas dimensões. - As operações podem adicionar ou remover dimensões singleton redundantes no início quando alinham as shapes. Por exemplo,
[1, 1, 3]alinha-se com[3], mas[2, 1]e[1, 2]permanecem distintos. Dimensões de comprimento zero e dimensões singleton não líderes continuam significativas. - A igualdade de forma ignora apenas dimensões singleton redundantes iniciais. Não transmite outras dimensões.
- As operações de empilhamento e concatenação interpretam o eixo usando a forma efetiva da primeira entrada. Outros inputs e destinos alinham-se com essa forma.
- Valores vazios por defeito podem propagar para
[2, 0]. Uma operação binária entre formas[0]efetivas e[0, 2]rejeita as dimensões finais incompatíveis. - As fontes e destinos mantêm os metadados de forma solicitados quando as operações os alinham.
Os spans de tensores suportados por código nativo podem agora ser percorridos com comprimentos e deslocamentos de tamanho nativo, incluindo spans com mais do que int.MaxValue elementos lógicos. As vistas vazias também mantêm uma origem de armazenamento na sua origem. As operações EqualsAny, GreaterThanAny, GreaterThanOrEqualAny, LessThanAny e LessThanOrEqualAny agora inspecionam todo o intervalo lógico de entrada e tratam corretamente as entradas vazias.
Tipo de mudança disruptiva
Trata-se de uma mudança de comportamento.
Motivo da mudança
Regras de forma consistentes tornam as operações tensoriais mais previsíveis e preservam dimensões explicitamente solicitadas, permitindo que formas equivalentes funcionem em conjunto. A travessia de tamanho nativo também permite que as operações cubram toda a gama lógica de intervalos, apoiadas por armazenamento maior.
Para mais informações, consulte dotnet/runtime#135060.
Ação recomendada
Revê código que depende de uma operação tensorial aceitar ou rejeitar uma combinação particular de dimensões. Considere os valores vazios padrão de rank zero como tendo uma forma efetiva de [0], e as dimensões redundantes unitárias iniciais devem ser ignoradas durante o alinhamento e a comparação de formas. Dimensões explícitas de comprimento zero e dimensões singleton não líderes continuam significativas.
Para operações de stack e concatenação, interprete o eixo relativo à forma efetiva da primeira entrada. Se o seu código exigir ranks ou comprimentos armazenados exatos, valide esses metadados antes de chamar a operação. Os metadados armazenados relativos aos valores vazios predefinidos não mudam.
APIs afetadas
- Tensor.Broadcast, Tensor.BroadcastToe Tensor.TryBroadcastTo
- Operações elemento a elemento e de cópia em Tensor que alinham formas tensoriais ou escrevem para um destino fornecido pelo chamador
- Tensor.Concatenate, Tensor.ConcatenateOnDimension, Tensor.Stacke Tensor.StackAlongDimension
- Tensor.Reshape, Tensor.Split, Tensor.SqueezeDimension, Tensor.Unsqueeze, Tensor.PermuteDimensions, Tensor.SetSlice, Tensor.SequenceEqual, Tensor.ResizeTo, Tensor.Reverse, e Tensor.ReverseDimension
- Tensor.EqualsAny, Tensor.GreaterThanAny, Tensor.GreaterThanOrEqualAny, Tensor.LessThanAny, e Tensor.LessThanOrEqualAny
- Tensor.IndexOfMax, Tensor.IndexOfMaxMagnitude, Tensor.IndexOfMine Tensor.IndexOfMinMagnitude