El comprender como funcionan los gráficos computacionales en Tensorflow pasa por conocer a fondo los placeholders y las variables, conocer sus diferencias, y saber cuando usar una u otra.
¿diferencia entre placeholders y variables?
Como resumen podemos decir que las variables las usa tensorflow para modificarlas y así optimizar el algoritmo, por ejemplo, los pesos de las redes neuronales son variables, las cuales se van modificando a medida que se ajusta el modelo.
Por otro lado los placeholders, podemos definirlos las posiciones donde se introducirán los datos con los que entrenamos el modelo y luego nos devuelve el modelo luego de hacer la predicción.
Variables en tensorflow
Para crear las variables lo hacemos con tf.variable() que toma un tensor como entrada y genera una variable, no obstante aún necesitamos inicializar la variable. Esta inicialización es lo que coloca la variable con los métodos correspondientes en el gráfico computacional. Veamos un ejemplo de creación e inicialización de una variable:
Antes de pasar a ver los placeholders, es importante decirle a Tensorflow cuando inicializar las variables, usando del método initializer, sobretodo en casos donde la inicialización de una variable depende del resultado de la inicialización de otra u otras.
En el ejemplo anterior con tf.global_vatiables_initializer(), tenemos la forma correcta para inicializar TODAS las variables en el gráfico computacional. Ahora veremos un ejemplo donde tenemos que inicializar cada variable por separado ya que unas dependen de la inicialización de otras:
Placeholders en Tensorflow
Los placeholders solo mantienen la posición para que los datos se introduzcan en el gráfico computacional. Estos placeholders obtienen datos de un argumento feed_dict en la sesión. Para poner un placeholder en el gráfico computacional debemos realizar al menos una operación en el marcador de posición. En el siguiente ejemplo inicializamos el gráfico, declaramos a:
- x como un placeholder
- y como la operación de identidad en x
- dataX son los datos para alimentar el placeholder
Para finalizar ejecutamos la operación con sess.run()
Usando matrices con TensorFlow
Al igual que los placeholders y las variables, aprender a usar las matrices dentro de tensorflow es importante para comprender el flujo de trabajo de los gráficos computacionales de tensorflow.
Dentro de Tensorflow, muchísimos algoritmos dependen de operaciones matriciales. Veamos al igual que hicimos con las matrices en numpy y en pandas, usos básicos dentro de tensorflow.
Creando matrices con TensorFlow
tf.convert_to_tensor()
Si ya tenemos matrices creadas con numpy, podemos añadirla a nuestra sesión de tensorflow con la función tf.convert_to_tensor():
tf.random_uniform([4,5])
Podemos inicializar una matriz de dos dimensiones con números aleatorios a partir de una distribución uniforme usando tf.random_uniform():
tf.truncated_normal()
Otra forma de inicializar una matriz en dos dimensiones con números aleatorios es con el método tf.truncated_normal() donde se generan números aleatorios a partir de una distribución normal especificando la media y la desviación estándar:
tf.fill()
Si queremos crear una matriz con números iguales podemos usar tf.fill():
Operaciones con matrices en TensorFlow
Podemos ejecutar operaciones con matrices dentro de la sesión de tensorflow:
Adición
Sustracción
Multiplicación
Antes de ver el ejemplo, recordad que para multiplicar una matriz A con dimensiones (m x n), con otra matriz B con dimensiones (l x r), n y r tienen que ser iguales. Si tenéis dudas podéis consultarlo aquí. Precisamente por esto la función tf.matmul() que vamos a utilizar, a parte de tener las dos matrices a multiplicar como los dos primers argumentos también podemos especificar si transponemos alguna de las dos matrices:
No obstante, tensorflow tiene reservada una función para transponer:
Calcular el determinante de matrices con Tensorflow
Para calcular el determinante de una matriz dentro de tensorflow lo podemos hacer con la función tf.matrix_determinant():
Calcular la inversa de una matriz con tensorflow
También podemos obtener la inversa de una matriz:
Operaciones aritméticas con TensorFlow
Por supuesto que tensorflow tiene incorporada las operaciones a través de tf.math estándar:
tf.math.add()
Con tf.math.add() tenemos la suma:
tf.math.subtract()
Con tf.math.subtract() tenemos la sustracción:
tf.math.multiply()
Con tf.math.multiply() tenemos la multiplicación:
División en TensorFlow
En el caso de la división tenemos varias opciones teniendo en cuenta el tipo número del dividendo, divisor y cociente. Para no tener millones de ejemplos y combinatorias vamos a definir dos funciones, tf.truediv() si quieremos un resultado de tipo flotante y tf.floordiv() si quieremos un resultado entero. Tener en cuenta que generalmente, tanto el dividendo como el divisor tienen que ser del mismo tipo numérico, o sea integer o float. Veamos varios ejemplos:
Existen más funciones para realizar divisiones en tensorflow, pero creo que con estás podemos resolver.
Solamente me gustaría añadir la función tf.mod() la cual me devuelve el resto de la división:
Existen muchísimas más funciones matemáticas dentro de tf. Podéis consultar muchas más desde aquí.