¿Tengo una pregunta? Conéctese con la comunidad en el foro de TensorFlow Visit Forum

Formas y diseño

El proto 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 rango real de una matriz es el número de dimensiones que tienen un tamaño superior a 1.

  • Las dimensiones se numeran desde 0 hasta 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 menor / mayor particular 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 de XLA también admiten la indexación negativa, de forma 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 de la API de 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 consta de 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;
}

Orden de dimensión menor a mayor

El único campo obligatorio es minor_to_major . Este campo describe el orden de menor a mayor de las dimensiones dentro de una forma. Los valores de minor_to_major son un orden de las dimensiones de la matriz ( 0 a N-1 para una matriz de N dimensiones), siendo el primer valor la dimensión más pequeña hasta el último valor que es la dimensión más importante. La dimensión más pequeña 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 menor y la dimensión 1 es la dimensión mayor. Esto corresponde al siguiente diseño en la 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 monótono 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 hasta 0 para una matriz de N dimensiones es similar a la fila mayor (en el rango 2). Suponiendo un orden monótono de dimensiones, otro nombre que podemos usar para referirnos a este diseño en el código es simplemente "dim 0 es mayor".

Orden 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 dados 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 indexa en el búfer que contiene la matriz. Consulte shape_util.h layout_util.h en el mismo directorio para conocer las utilidades que simplifican la creación y manipulación de formas y diseños.