Tensores en TensorFlow

imagen


El objeto principal manipulado en Tensorflow es el tensor. Qué son los tensores, qué tensores son, qué propiedades tienen y cómo manipularlos, lea la guía de traducción de tensorflow.org.


TensorFlow, como su nombre lo indica, es una plataforma para definir y realizar cálculos con tensores. Un tensor es una generalización de vectores y matrices a dimensiones superiores. Dentro de TensorFlow, los tensores se representan como matrices n-dimensionales de tipos de datos básicos.


Al escribir un programa TensorFlow, el objeto principal que manipula y pasa es tf.Tensor . Los programas TensorFlow funcionan creando primero un gráfico de tf.Tensor objetos y describiendo en detalle cómo se calcula cada tensor en función de los otros tensores disponibles, y luego ejecutando partes de este gráfico para obtener los resultados del cálculo.


tf.Tensor tiene las siguientes opciones:


  • tipo de datos ( float32 , int32 o string , por ejemplo)
  • tamaños (forma)

Todos los elementos tensoriales tienen el mismo tipo de datos, y siempre se sabe. Las dimensiones (el número de mediciones y el tamaño de cada medición) solo pueden conocerse parcialmente. El resultado de la mayoría de las operaciones son tensores con dimensiones conocidas, si las dimensiones en la entrada también son completamente conocidas, pero en algunos casos es posible averiguar las dimensiones del tensor solo durante la ejecución del gráfico.


Los principales tipos de tensores son los siguientes:


  • tf.Variable
  • tf.constant
  • tf.placeholder
  • tf.SparseTensor

Con la excepción de tf.Variable , el valor del tensor no cambia, es decir en el contexto de una ejecución, un tensor solo puede tener un valor. Sin embargo, calcular el mismo tensor dos veces puede devolver valores diferentes; por ejemplo, el mismo tensor puede ser el resultado de leer datos de un disco o generar un número aleatorio.


Grado


El rango del objeto tf.Tensor es el número de sus dimensiones. Los sinónimos de un rango son orden , grado , dimensión . Tenga en cuenta que un rango en TensorFlow no es lo mismo que un rango de matriz en matemáticas. Como muestra la siguiente tabla, cada rango en Tensorflow corresponde a alguna entidad matemática:


GradoEntidad matemática
0 0Escalar (solo valor)
1Vector (magnitud y dirección)
2Matriz (tabla de números)
33-Tensor (cubo de números)
nn-tensor (bueno, entiendes la idea)

Rango 0


El siguiente fragmento muestra la creación de varias variables de rango 0:


 mammal = tf.Variable("Elephant", tf.string) ignition = tf.Variable(451, tf.int16) floating = tf.Variable(3.14159265359, tf.float64) its_complicated = tf.Variable(12.3 - 4.85j, tf.complex64) 

Nota: Una cadena se considera un solo objeto en TensorFlow, no una secuencia de caracteres. Es posible tener escalares de cuerda, vectores de fila, etc.

Rango 1


Para crear un objeto tf.Tensor de rango 1, puede pasar una lista de elementos como valores iniciales. Por ejemplo:


 mystr = tf.Variable(["Hello"], tf.string) cool_numbers = tf.Variable([3.14159, 2.71828], tf.float32) first_primes = tf.Variable([2, 3, 5, 7, 11], tf.int32) its_very_complicated = tf.Variable([12.3 - 4.85j, 7.5 - 6.23j], tf.complex64) 

Rangos superiores


El rango 2 del objeto tf.Tensor consta de al menos una fila y una columna:


 mymat = tf.Variable([[7],[11]], tf.int16) myxor = tf.Variable([[False, True],[True, False]], tf.bool) linear_squares = tf.Variable([[4], [9], [16], [25]], tf.int32) squarish_squares = tf.Variable([ [4, 9], [16, 25] ], tf.int32) rank_of_squares = tf.rank(squarish_squares) mymatC = tf.Variable([[7],[11]], tf.int32) 

Los tensores de rango superior, del mismo modo, consisten en matrices n-dimensionales. Por ejemplo, cuando se procesan imágenes, se utilizan muchos tensores de rango 4, con dimensiones correspondientes al número de ejemplo en el paquete, la altura de la imagen, el ancho de la imagen y el canal de color.


 my_image = tf.zeros([10, 299, 299, 3]) #   x  x  x    

Obteniendo el tf.Tensor objeto tf.Tensor


Para determinar el rango del objeto tf.Tensor , llame al método tf.rank . Por ejemplo, el siguiente método determina mediante programación el rango de tf.Tensor especificado anteriormente:


 r = tf.rank(my_image) #   , r   4. 

Enlaces a tf.Tensor


Dado que tf.Tensor es una matriz de celdas n-dimensionales, para acceder a una sola celda en tf.Tensor necesita especificar n índices.


Para los tensores de rango 0 (escalares), los índices no son necesarios, ya que esto ya es solo un número.


Para un tensor de rango 1 (vector), pasar un solo índice le dará acceso al número:


 my_scalar = my_vector[2] 

Tenga en cuenta que el índice pasado a [] puede ser un escalar tf.Tensor si desea seleccionar dinámicamente un elemento de un vector.


Para tensores de rango 2 o superior, la situación es más interesante. Para tf.Tensor rango 2, pasar dos números devuelve como lo espera un escalar:


 my_scalar = my_matrix[1, 2] 

Sin embargo, pasar un solo número devuelve un subvector de la matriz de la siguiente manera:


 my_row_vector = my_matrix[2] my_column_vector = my_matrix[:, 3] 

Notación : en la sintaxis, la asignación de subarreglos en python se usa como "dejar esta dimensión en paz". Esto es útil en tensores de alto rango, ya que permite el acceso a subvectores, submatrices e incluso otros subtensores.


Dimensiones


Las dimensiones del tensor son el número de elementos en cada dimensión. La documentación de TensorFlow utiliza tres convenciones para describir la dimensión de un tensor: rango, dimensiones y número de dimensiones. La siguiente tabla muestra cómo se relacionan entre sí:


GradoDimensionesNumero de medicionesEjemplo
0 0[]0-DTensor 0-D. Escalar
1[D0]1-DTensor de tamaño 1-D [5].
2[D0, D1]2-DTensor de tamaño 2D [3, 4].
3[D0, D1, D2]3-DTensor de tamaño tridimensional [1, 4, 3].
n[D0, D1, ... Dn-1]nDTensor de tamaño [D0, D1, ... Dn-1].

Los tamaños se pueden representar como listas de Python / tuplas de enteros, o usando
tf.TensorShape .


Obteniendo el tamaño del objeto tf.Tensor


Hay dos formas de obtener dimensiones de tf.Tensor . Al construir un gráfico, a menudo es útil preguntar qué se sabe sobre el tamaño del tensor. Esto se puede hacer leyendo la propiedad de shape del objeto tf.Tensor . Este método devuelve un objeto TensorShape , que es una forma conveniente.
representaciones de tamaños parcialmente definidos (ya que cuando se construye un gráfico, no todos los tamaños pueden ser completamente conocidos).


También puede obtener tf.Tensor que representa las dimensiones completamente definidas de otro tf.Tensor en tiempo de ejecución. Esto se realiza tf.shape operación tf.shape . De esta manera, puede construir un gráfico que manipule los tamaños de los tensores construyendo otros tensores dependiendo de los tamaños dinámicos de la entrada tf.Tensor .


Por ejemplo, puede hacer un vector de ceros del mismo tamaño que el número de columnas de una matriz dada:


 zeros = tf.zeros(my_matrix.shape[1]) 

Cambiar el tamaño del tf.Tensor


El número de elementos tensoriales es el producto de todas sus medidas. El número de elementos escalares es siempre 1 . Dado que muchos tamaños diferentes pueden dar el mismo número de elementos, a menudo es conveniente cambiar el tamaño de tf.Tensor sin cambiar sus elementos. Esto se puede hacer usando tf.reshape .


Los siguientes ejemplos muestran cómo cambiar el tamaño de un tensor:


 rank_three_tensor = tf.ones([3, 4, 5]) matrix = tf.reshape(rank_three_tensor, [6, 10]) #    #   6x10 matrixB = tf.reshape(matrix, [3, -1]) #     #  3x20. -1  reshape   #    . matrixAlt = tf.reshape(matrixB, [4, 3, -1]) #     #  4x3x5 # ,         #   .     #         #     . yet_another = tf.reshape(matrixAlt, [13, 2, -1]) # ERROR! 

Tipos de datos


Además de la dimensión, los tensores tienen un tipo de datos. Un tf.Tensor particular no puede tener más de un tipo de datos. Sin embargo, es posible serializar estructuras de datos arbitrarias en una string y almacenarlas en tf.Tensor .


Puede convertir tf.Tensor de un tipo de datos a otro usando tf.cast :


 #         . float_tensor = tf.cast(tf.constant([1, 2, 3]), dtype=tf.float32) 

Para ver el tipo de datos tf.Tensor , use la propiedad Tensor.dtype .


Al crear tf.Tensor partir de un objeto python, puede especificar opcionalmente un tipo de datos. Si no lo hace, TensorFlow seleccionará un tipo de datos que puede representar sus datos. TensorFlow convierte los enteros de Python en tf.int32 y los números de coma flotante en tf.float32 . En otros casos, TensorFlow usa las mismas reglas que numpy al convertir matrices.


Evaluación tensorial


Una vez que se ha creado un gráfico computacional, puede ejecutar un cálculo que
generará un tf.Tensor específico y extraerá el valor asignado a él. Esto suele ser útil para la depuración, así como para trabajar la mayor parte de TensorFlow.


La forma más fácil de evaluar Tensor es usar el método Tensor.eval . Por ejemplo:


 constant = tf.constant([1, 2, 3]) tensor = constant * constant print(tensor.eval()) 

El método eval solo funciona cuando el tf.Session predeterminado tf.Session . Tensor.eval devuelve una matriz numpy con el mismo contenido que el tensor.


A veces es imposible evaluar tf.Tensor sin contexto, porque su valor puede depender de información dinámica que no está disponible. Por ejemplo, los tensores dependientes del placeholder no pueden evaluarse sin proporcionar un valor para el placeholder .


 p = tf.placeholder(tf.float32) t = p + 1.0 t.eval() #   ,   placeholder   . t.eval(feed_dict={p:2.0}) #  ,     #   placeholder. 

Tenga en cuenta que puede utilizar cualquier tf.Tensor , no solo el marcador de posición.


Otros diseños de modelos pueden hacer que tf.Tensor más difícil de evaluar. TensorFlow no puede evaluar directamente tf.Tensor definido dentro de funciones o dentro de construcciones de flujo de control. Si tf.Tensor depende del valor de la cola, la puntuación del tf.Tensor solo funcionará cuando se coloque algo en la cola; de lo contrario, la estimación del tensor se congelará. Cuando trabaje con colas, recuerde llamar a tf.train.start_queue_runners antes de evaluar cualquier tf.Tensor .


Después de la verificación, la traducción también aparecerá en Tensorflow.org. Si desea participar en la traducción de la documentación del sitio web de Tensorflow.org al ruso, comuníquese personalmente o envíe sus comentarios. Cualquier corrección o comentario son apreciados.

Source: https://habr.com/ru/post/484214/


All Articles