Se usó la API de Cloud Translation para traducir esta página.
Switch to English

Formas y diseño

El protocolo XLA Shape ( xla_data.proto ) describe el rango, el tamaño y el tipo de datos de una matriz N-dimensional ( matriz en resumen).

Terminología, notación y convenciones

  • El rango de una matriz es igual al número de dimensiones. El verdadero rango de una matriz es el número de dimensiones que tienen un tamaño mayor que 1.

  • Las dimensiones están numeradas de 0 a N-1 para una matriz de N dimensiones. Los números de dimensión son etiquetas arbitrarias por conveniencia. El orden de estos números de dimensión no implica un orden particular menor / mayor en el diseño de la forma. El diseño está determinado por el Layout .

  • Por convención, las dimensiones se enumeran en orden creciente de número de dimensión. Por ejemplo, para una matriz tridimensional de tamaño [A x B x C] , la dimensión 0 tiene el tamaño A , la dimensión 1 tiene el tamaño B y la dimensión 2 tiene el tamaño C

    Algunas utilidades en XLA también admiten indexación negativa, de manera similar a Python; dimensión -1 es la última dimensión (equivalente a N-1 para una matriz de N dimensiones). Por ejemplo, para la matriz tridimensional descrita anteriormente, la dimensión -1 tiene el tamaño C , la dimensión -2 tiene el tamaño B y así sucesivamente.

  • Las matrices de dos, tres y cuatro dimensiones a menudo tienen letras específicas asociadas con las dimensiones. Por ejemplo, para una matriz 2D:

    • dimensión 0: y
    • dimensión 1: x

    Para una matriz 3D:

    • dimensión 0: z
    • dimensión 1: y
    • dimensión 2: x

    Para una matriz 4D:

    • dimensión 0: p
    • dimensión 1: z
    • dimensión 2: y
    • dimensión 3: x
  • Las funciones en la API XLA que toman dimensiones lo hacen en orden creciente de número de dimensión. Esto coincide con el orden utilizado al pasar dimensiones como initializer_list ; p.ej

    ShapeUtil::MakeShape(F32, {A, B, C, D})

    Creará una forma cuya matriz de tamaño de dimensión consiste en la secuencia [A, B, C, D] .

Diseño

El Layout describe cómo se representa una matriz en la memoria. El Layout incluye los siguientes campos:

 message Layout {
  repeated int64 minor_to_major = 1;
  repeated int64 padded_dimensions = 2;
  optional PaddingValue padding_value = 3;
}
 

Pedido de dimensiones de menor a mayor

El único campo requerido es minor_to_major . Este campo describe el orden de menor a mayor de las dimensiones dentro de una forma. Los valores en minor_to_major son un orden de las dimensiones de la matriz (de 0 a N-1 para una matriz de N dimensiones), siendo el primer valor la dimensión más menor hasta el último valor, que es la dimensión más importante. La dimensión más menor es la dimensión que cambia más rápidamente al recorrer los elementos de la matriz dispuestos en la memoria lineal.

Por ejemplo, considere la siguiente matriz 2D de tamaño [2 x 3] :

 a b c
d e f
 

Aquí la dimensión 0 es el tamaño 2 y la dimensión 1 es el tamaño 3. Si el campo minor_to_major en el diseño es [0, 1] entonces la dimensión 0 es la dimensión más menor y la dimensión 1 es la dimensión más importante. Esto corresponde al siguiente diseño en memoria lineal:

 a d b e c f
 

Este orden de dimensión menor a mayor de 0 a N-1 es similar a la columna mayor (en el rango 2). Suponiendo un orden monotónico de dimensiones, otro nombre que podemos usar para referirnos a este diseño en el código es simplemente "dim 0 es menor".

Por otro lado, si el campo minor_to_major en el diseño es [1, 0] entonces el diseño en la memoria lineal es:

 a b c d e f
 

Un orden de dimensión menor a mayor de N-1 a 0 para una matriz de N dimensiones es similar a la fila mayor (en el rango 2). Suponiendo un orden monotónico de dimensiones, otro nombre que podemos usar para referirnos a este diseño en el código es simplemente "dim 0 is major".

Pedido predeterminado de menor a mayor

El diseño predeterminado para las formas recién creadas es "el orden de dimensión es mayor a menor" (similar a la fila mayor en el rango 2).

Relleno

El relleno se define en los padded_dimensions opcionales padded_dimensions y padding_value . El campo padded_dimensions describe los tamaños (anchos) a los que se rellena cada dimensión. Si está presente, el número de elementos en padded_dimensions debe ser igual al rango de la forma.

Por ejemplo, dada la matriz [2 x 3] definida anteriormente, si padded_dimensions es [3, 5] , la dimensión 0 se rellena con un ancho de 3 y la dimensión 1 se rellena con un ancho de 5. El diseño en la memoria lineal (suponiendo un valor de relleno de 0 y diseño de columna principal) es:

 a d 0 b e 0 c f 0 0 0 0 0 0 0
 

Esto es equivalente al diseño de la siguiente matriz con el mismo orden de dimensión menor a mayor:

 a b c 0 0
d e f 0 0
0 0 0 0 0
 

Indexación en matrices

La clase IndexUtil en index_util.h proporciona utilidades para convertir entre índices multidimensionales e índices lineales dada una forma y diseño. Los índices multidimensionales incluyen un índice int64 para cada dimensión. Los índices lineales son un único valor int64 que se indexa en el búfer que contiene la matriz. Consulte shape_util.h y layout_util.h en el mismo directorio para ver las utilidades que simplifican la creación y la manipulación de formas y diseños.