Copyright 2020 The TensorFlow Authors.
Introducción a los tensores
Los tensores son matrices multidimensionales con un tipo uniforme (llamado dtype
). Puede ver todos los dtypes
admitidos en tf.dtypes.DType
.
Si está familiarizado con NumPy{:.external}, los tensores son (más o menos) como np.arrays
.
Todos los tensores son inmutables, como los números y las cadenas de Python: nunca se puede actualizar el contenido de un tensor, sólo crear uno nuevo.
Conceptos básicos
En primer lugar, cree algunos tensores básicos.
Se trata de un "escalar" o tensor de "rango 0". Un escalar contiene un valor único y ningún "eje".
Un "vector" o tensor de "rango 1" es como una lista de valores. Un vector tiene un eje:
Una "matriz" o tensor de "rango 2" tiene dos ejes:
Un escalar, con forma: [] |
Un vector, con forma: [3] |
Una matriz, con forma: [3, 2] |
---|---|---|
![]() |


Los tensores pueden tener más ejes; aquí se muestra un tensor con tres ejes:
Hay muchas formas de visualizar un tensor con más de dos ejes.
Un tensor de 3 ejes, con forma: [3, 2, 5] |
|
---|---|
![]() |
![]() |

Puede convertir un tensor en un arreglo NumPy utilizando np.array
o el método tensor.numpy
:
Los tensores a menudo contienen valores decimales e integrales, pero tienen muchos otros tipos, incluyendo:
números complejos
cadenas
La clase base tf.Tensor
requiere que los tensores sean "rectangulares"--es decir, a lo largo de cada eje, cada elemento tiene el mismo tamaño. Sin embargo, hay tipos especializados de tensores que pueden manejar diferentes formas:
Tensores irregulares (consulte RaggedTensor a continuación)
Tensores dispersos (consulte SparseTensor a continuación)
Puede realizar operaciones matemáticas básicas con tensores, como la suma, la multiplicación por elementos y la multiplicación de matrices.
Los tensores se utilizan en todo tipo de operaciones (u "Ops").
Nota: Típicamente, en cualquier lugar donde una función TensorFlow espere un Tensor
como entrada, la función también aceptará cualquier cosa que pueda ser convertida a un Tensor
usando tf.convert_to_tensor
. Vea a continuación un ejemplo.
Sobre las formas
Los tensores tienen formas. Algo de vocabulario:
Forma: La longitud (número de elementos) de cada uno de los ejes de un tensor.
Rango: Número de ejes del tensor. Un escalar tiene rango 0, un vector tiene rango 1, una matriz es de rango 2.
Eje o Dimensión: Una dimensión particular de un tensor.
Tamaño: El número total de elementos del tensor, el producto de los elementos del vector de forma.
Nota: Aunque se haga referencia a un "tensor de dos dimensiones", un tensor de rango 2 normalmente no describe un espacio 2D.
Los objetos tensores y tf.TensorShape
tienen propiedades convenientes para acceder a ellos:
Un tensor de rango 4, con forma: [3,2,4,5] |
|
---|---|
![]() |
![]() |
Pero tenga en cuenta que los atributos Tensor.ndim
y Tensor.shape
no devuelven objetos Tensor
. Si necesita un Tensor
utilice la función tf.rank
o tf.shape
. Esta diferencia es sutil, pero puede ser importante a la hora de construir grafos (más adelante).
Aunque a menudo se hace referencia a los ejes por sus índices, siempre hay que tener en cuenta el significado de cada uno. Con frecuencia, los ejes se ordenan de global a local: El eje del lote primero, seguido de las dimensiones espaciales, y las características de cada localización en último lugar. De este modo, los vectores de características son regiones contiguas de la memoria.
Orden típico de los ejes |
---|
![]() |
Indexación
Indexación de un solo eje
TensorFlow sigue las reglas estándar de indexación de Python, similares a indexar una lista o una cadena en Python{:.external}, y las reglas básicas de indexación de NumPy.
los índices comienzan en
0
los índices negativos cuentan en sentido inverso desde el final
los dos puntos,
:
, se utilizan para los segmentos:start:stop:step
La indexación con un escalar elimina el eje:
La indexación con un segmento :
mantiene el eje:
Indexación multieje
Los tensores de rango superior se indexan pasando varios índices.
Las mismas reglas que en el caso de un solo eje se aplican a cada eje de forma independiente.
Pasando un entero por cada índice, el resultado es un escalar.
Puede indexar mediante cualquier combinación de enteros y segmentos:
Este es un ejemplo con un tensor de 3 ejes:
Selección de la última característica en todas las ubicaciones de cada ejemplo del lote | |
---|---|
![]() |
![]() |
Lea la guía de segmentación de tensores para aprender cómo puede aplicar la indexación para manipular elementos individuales en sus tensores.
Manipulación de las formas
Modificar la forma de un tensor es de gran utilidad.
Puede volver a dar forma a un tensor en una nueva forma. La operación tf.reshape
es rápida y barata, ya que no es necesario duplicar los datos subyacentes.
Los datos mantienen su disposición en la memoria y se crea un nuevo tensor, con la forma solicitada, apuntando a los mismos datos. TensorFlow utiliza la clasificación de memoria "row-major" de estilo C, en la que el incremento del índice situado en el extremo derecho corresponde a un único paso en la memoria.
Si comprime un tensor, podrá ver en qué orden está almacenado en la memoria.
Normalmente, el único uso razonable de tf.reshape
es combinar o dividir ejes adyacentes (o agregar/eliminar 1
).
Para este tensor 3x2x5, es razonable cambiar la forma a (3x2)x5 o 3x(2x5), ya que los segmentos no se mezclan:
Algunas buenas rediseños. | ||
---|---|---|
![]() |
![]() |
![]() |
La remodelación "funcionará" para cualquier forma nueva con el mismo número total de elementos, pero no hará nada útil si no se respeta el orden de los ejes.
Intercambiar ejes en tf.reshape
no funciona; para eso se necesita tf.transpose
.
Algunos malos rediseños. | ||
---|---|---|
![]() |
![]() |
![]() |
Puede encontrarse con formas no especificadas completamente. O bien la forma contiene un None
(se desconoce la longitud de un eje) o toda la forma es None
(se desconoce el rango del tensor).
Excepto para tf.RaggedTensor, tales formas sólo se producirán en el contexto de las API simbólicas de construcción de grafos de TensorFlow:
Más información sobre DTypes
Para inspeccionar el tipo de datos de un tensor
utilice la propiedad Tensor.dtype
.
Cuando se crea un tf.Tensor
a partir de un objeto Python se puede especificar opcionalmente el tipo de datos.
Si no lo hace, TensorFlow elige un tipo de datos que pueda representar sus datos. TensorFlow convierte números enteros de Python a tf.int32
y números decimales de Python a tf.float32
. Por otra parte TensorFlow utiliza las mismas reglas que NumPy para convertir a matrices.
Puede pasar de un tipo a otro.
Transmisión
La difusión es un concepto tomado de la función equivalent de NumPy{:.external}. En resumen, en determinadas condiciones, los tensores más pequeños se "estiran" automáticamente para ajustarse a tensores más grandes cuando se ejecutan operaciones combinadas sobre ellos.
El caso más sencillo y común es cuando se intenta multiplicar o sumar un tensor a un escalar. En ese caso, el escalar se emite para que tenga la misma forma que el otro argumento.
Del mismo modo, los ejes con longitud 1 pueden estirarse para que coincidan con los demás argumentos. Ambos argumentos pueden estirarse en el mismo cálculo.
En este caso, una matriz de 3x1 se multiplica elemento a elemento por una matriz de 1x4 para obtener una matriz de 3x4. Observe cómo el 1 inicial es opcional: La forma de y es [4]
.
Una adición transmitida: un [3, 1] por un [1, 4] da un [3,4] |
---|
![]() |
Esta es la misma operación sin transmisión:
La mayoría de las veces, la difusión es eficiente tanto en tiempo como en espacio, ya que la operación de difusión nunca materializa los tensores expandidos en la memoria.
Puede ver el aspecto de la difusión utilizando tf.broadcast_to
.
A diferencia de una operación matemática, por ejemplo, broadcast_to
no hace nada especial para ahorrar memoria. Aquí, está materializando el tensor.
Puede ser aún más complicado. Esta sección{:.external} del libro de Jake VanderPlas Python Data Science Handbook muestra más trucos de transmisión (de nuevo en NumPy).
tf.convert_to_tensor
La mayoría de las operaciones, como tf.matmul
y tf.reshape
toman argumentos de la clase tf.Tensor
. Sin embargo, notará que en el caso anterior, se aceptan objetos de Python con forma de tensores.
La mayoría de las operaciones, pero no todas, llaman a convert_to_tensor
en argumentos que no son tensores. Hay un registro de conversiones, y la mayoría de las clases de objetos como ndarray
de NumPy, TensorShape
, listas de Python, y tf.Variable
se convertirán automáticamente.
Consulte tf.register_tensor_conversion_function
para obtener más detalles, y si tiene su propio tipo que le gustaría convertirlo automáticamente a un tensor.
Tensores irregulares
Un tensor con números variables de elementos a lo largo de algún eje se llama "ragged". Utilice tf.ragged.RaggedTensor
para obtener datos irregulares.
Por ejemplo, esto no puede representarse como un tensor regular:
Un `tf.RaggedTensor`, con forma: [4, None] |
---|
![]() |
En cambio, crea un tf.RaggedTensor
utilizando tf.ragged.constant
:
La forma de un tf.RaggedTensor
contendrá algunos ejes con longitudes desconocidas:
Tensores de cadenas
tf.string
es un dtype
, es decir, se pueden representar datos como cadenas (matrices de bytes de longitud variable) en tensores.
Las cadenas son atómicas y no pueden indexarse como las cadenas de Python. La longitud de la cadena no es uno de los ejes del tensor. Consulte tf.strings
para ver las funciones que permiten manipularlas.
Este es un tensor de cadena escalar:
Y un vector de cadenas:
Un vector de cadenas, con forma: [3,] |
---|
![]() |
En la impresión anterior, el prefijo b
indica que el dtype tf.string
no es una cadena unicode, sino una cadena de bytes. Consulte el Tutorial Unicode para obtener más información sobre cómo trabajar con texto unicode en TensorFlow.
Si introduce caracteres unicode, se codifican en utf-8.
Algunas funciones básicas con cadenas se pueden encontrar en tf.strings
, incluyendo tf.strings.split
.
Tres cadenas divididas, con forma: [3, None] |
---|
![]() |
Y tf.string.to_number
:
Aunque no se puede utilizar tf.cast
para convertir un tensor de cadenas en números, se puede convertir en bytes, y después en números.
El dtype tf.string
se utiliza para todos los datos en bytes en TensorFlow. El módulo tf.io
contiene funciones para convertir datos a y desde bytes, incluyendo la decodificación de imágenes y el parseo de csv.
Tensores dispersos
En algunas ocasiones, sus datos son dispersos, como un espacio de incorporación muy amplio. TensorFlow es compatible con tf.sparse.SparseTensor
y las operaciones relacionadas para almacenar datos dispersos de manera eficiente.
Un `tf.SparseTensor`, con forma: [3, 4] |
---|
![]() |