{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# TensorFlow y Redes Neuronales"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"*Esta notebook fue creada originalmente como un blog post por [Raúl E. López Briega](http://relopezbriega.com.ar/) en [Matemáticas, Analisis de datos y Python](http://relopezbriega.github.io). El contenido esta bajo la licencia BSD.*"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
""
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Sobre TensoFlow\n",
"\n",
"[TensorFlow](https://www.tensorflow.org/) es una biblioteca open source desarrollada por Google que nos permite realizar cálculos numéricos usando diagramas de flujo de datos. Los nodos del [grafo](https://es.wikipedia.org/wiki/Grafo) representan operaciones matemáticas, mientras que los arcos del [grafo](https://es.wikipedia.org/wiki/Grafo) representan los arreglos de datos multidimensionales ([tensores](https://es.wikipedia.org/wiki/C%C3%A1lculo_tensorial)) comunicados entre ellos. Esta arquitectura flexible nos permite realizar los cálculos en más de un CPU o GPU utilizando la misma API.\n",
"\n",
"## ¿Qué es un diagrama de flujo de datos?\n",
"\n",
"Los diagramas de flujo de datos describen cálculos matemáticos con un [grafo](https://es.wikipedia.org/wiki/Grafo) de nodos y arcos. Los nodos normalmente implementan operaciones matemáticas, pero también pueden representar los puntos para alimentarse de datos, devolver resultados, o leer / escribir variables persistentes. Los arcos o aristas describen las relaciones de entrada / salida entre los nodos. Estos arcos están representados por los arreglos de datos multidimensionales o [tensores](https://es.wikipedia.org/wiki/C%C3%A1lculo_tensorial). El flujo de los tensores a través del [grafo](https://es.wikipedia.org/wiki/Grafo) es de donde [TensorFlow](https://www.tensorflow.org/) recibe su nombre. Los nodos se asignan a los dispositivos computacionales y se ejecutan de forma asincrónica y en paralelo una vez que todos los [tensores](https://es.wikipedia.org/wiki/C%C3%A1lculo_tensorial) en los arcos de entrada están disponibles.\n",
"\n",
""
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Introducción a TensorFlow\n",
"\n",
"Para poder utilizar [TensorFlow](https://www.tensorflow.org/) primero es necesario entender cómo la librería:\n",
"\n",
"* Representa cálculos en forma de [grafos](https://es.wikipedia.org/wiki/Grafo).\n",
"* Ejecuta los [grafos](https://es.wikipedia.org/wiki/Grafo) en el contexto de Sesiones.\n",
"* Representa los datos como [tensores](https://es.wikipedia.org/wiki/C%C3%A1lculo_tensorial).\n",
"* Mantiene el estado con variables.\n",
"* Se alimenta de datos y devuelve los resultados de cada operación.\n",
"\n",
"\n",
"### Funcionamiento general\n",
"\n",
"[TensorFlow](https://www.tensorflow.org/) es un sistema de programación en el que representamos cálculos en forma de [grafos](https://es.wikipedia.org/wiki/Grafo). Los nodos en el [grafo](https://es.wikipedia.org/wiki/Grafo) se llaman *ops* (abreviatura de operaciones). Una *op* tiene cero o más [tensores](https://es.wikipedia.org/wiki/C%C3%A1lculo_tensorial), realiza algún cálculo, y produce cero o más [tensores](https://es.wikipedia.org/wiki/C%C3%A1lculo_tensorial).\n",
"\n",
"Un [grafo](https://es.wikipedia.org/wiki/Grafo) de [TensorFlow](https://www.tensorflow.org/) es una descripción de cálculos. Para calcular cualquier cosa dentro de [TensorFlow](https://www.tensorflow.org/), el [grafo](https://es.wikipedia.org/wiki/Grafo) debe ser lanzado dentro de una *sesión*. La *Sesión* coloca las operaciones del [grafo](https://es.wikipedia.org/wiki/Grafo) en los diferentes *dispositivos*, tales como CPU o GPU, y proporciona métodos para ejecutarlas.\n",
"\n",
"### Creando un Grafo \n",
"\n",
"Para construir un [grafo](https://es.wikipedia.org/wiki/Grafo) simple, podemos comenzar con *ops* que no necesitan ningún dato de entrada, como son las *constantes* y luego le pasamos su salida a *ops* que realizan cálculos. "
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"# importamos la libreria\n",
"import tensorflow as tf\n",
"\n",
"# importamos librerías adicionales\n",
"import numpy as np\n",
"import matplotlib.pyplot as plt\n",
"import matplotlib.cm as cm\n",
"import pandas as pd\n",
"\n",
"%matplotlib inline"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Constantes\n",
"\n",
"Podemos construir *ops* de *constantes* utilizando `constant`, su API es bastante simple:\n",
"\n",
"`constant(value, dtype=None, shape=None, name='Const')`\n",
"\n",
"Le debemos pasar un valor, el cual puede ser cualquier tipo de [tensor](https://es.wikipedia.org/wiki/C%C3%A1lculo_tensorial) (un escalar, un vector, una matriz, etc) y luego opcionalmente le podemos pasar el tipo de datos, la forma y un nombre."
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"# Creación de Constantes\n",
"# El valor que retorna el constructor es el valor de la constante.\n",
"\n",
"# creamos constantes a=2 y b=3\n",
"a = tf.constant(2)\n",
"b = tf.constant(3)\n",
"\n",
"# creamos matrices de 3x3\n",
"matriz1 = tf.constant([[1, 3, 2],\n",
" [1, 0, 0],\n",
" [1, 2, 2]])\n",
"\n",
"matriz2 = tf.constant([[1, 0, 5],\n",
" [7, 5, 0],\n",
" [2, 1, 1]])"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"# Realizamos algunos cálculos con estas constantes\n",
"suma = tf.add(a, b)\n",
"mult = tf.mul(a, b)\n",
"cubo_a = a**3\n",
"\n",
"# suma de matrices\n",
"suma_mat = tf.add(matriz1, matriz2)\n",
"\n",
"# producto de matrices\n",
"mult_mat = tf.matmul(matriz1, matriz2)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Sesiones\n",
"\n",
"Ahora que ya definimos algunas *ops constantes* y algunos cálculos con ellas, debemos lanzar el [grafo](https://es.wikipedia.org/wiki/Grafo) dentro de una *Sesión*. Para realizar esto utilizamos el objeto `Session`. Este objeto va a encapsular el ambiente en el que las operaciones que definimos en el [grafo](https://es.wikipedia.org/wiki/Grafo) van a ser ejecutadas y los [tensores](https://es.wikipedia.org/wiki/C%C3%A1lculo_tensorial) son evaluados."
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Suma de las constantes: 5\n",
"Multiplicación de las constantes: 6\n",
"Constante elevada al cubo: 8\n",
"Suma de matrices: \n",
"[[2 3 7]\n",
" [8 5 0]\n",
" [3 3 3]]\n",
"Producto de matrices: \n",
"[[26 17 7]\n",
" [ 1 0 5]\n",
" [19 12 7]]\n"
]
}
],
"source": [
"# Todo en TensorFlow ocurre dentro de una Sesión\n",
"\n",
"# creamos la sesion y realizamos algunas operaciones con las constantes\n",
"# y lanzamos la sesión\n",
"with tf.Session() as sess: \n",
" print(\"Suma de las constantes: {}\".format(sess.run(suma)))\n",
" print(\"Multiplicación de las constantes: {}\".format(sess.run(mult)))\n",
" print(\"Constante elevada al cubo: {}\".format(sess.run(cubo_a)))\n",
" print(\"Suma de matrices: \\n{}\".format(sess.run(suma_mat)))\n",
" print(\"Producto de matrices: \\n{}\".format(sess.run(mult_mat)))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Las *Sesiones* deben ser cerradas para liberar los recursos, por lo que es una buena práctica incluir la *Sesión* dentro de un bloque \"with\" que la cierra automáticamente cuando el bloque termina de ejecutar.\n",
"\n",
"Para ejecutar las *operaciones* y evaluar los [tensores](https://es.wikipedia.org/wiki/C%C3%A1lculo_tensorial) utilizamos `Session.run()`."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Variables persistentes \n",
"\n",
"Las *Variables* mantienen el estado a través de las ejecuciones del [grafo](https://es.wikipedia.org/wiki/Grafo). Son buffers en memoria que contienen [tensores](https://es.wikipedia.org/wiki/C%C3%A1lculo_tensorial). Se deben inicializar explícitamente y se pueden guardar en el disco para luego restaurar su estado de necesitarlo. Se crean utilizando el objeto `Variable`."
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"0\n",
"1\n",
"2\n",
"3\n"
]
}
],
"source": [
"# Creamos una variable y la inicializamos con 0\n",
"estado = tf.Variable(0, name=\"contador\")\n",
"\n",
"# Creamos la op que le va a sumar uno a la Variable `estado`.\n",
"\n",
"uno = tf.constant(1)\n",
"nuevo_valor = tf.add(estado, uno)\n",
"actualizar = tf.assign(estado, nuevo_valor)\n",
"\n",
"# Las Variables deben ser inicializadas por la operación `init` luego de \n",
"# lanzar el grafo. Debemos agregar la op `init` a nuestro grafo.\n",
"init = tf.initialize_all_variables()\n",
"\n",
"# Lanzamos la sesion y ejecutamos las operaciones\n",
"with tf.Session() as sess:\n",
" # Ejecutamos la op `init`\n",
" sess.run(init)\n",
" # imprimir el valor de la Variable estado.\n",
" print(sess.run(estado))\n",
" # ejecutamos la op que va a actualizar a `estado`.\n",
" for _ in range(3):\n",
" sess.run(actualizar)\n",
" print(sess.run(estado))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Variables simbólicas (contenedores)\n",
"\n",
"Las *Variables simbólicas* o *Contenedores* nos van a permitir alimentar a las operaciones con los datos durante la ejecución del [grafo](https://es.wikipedia.org/wiki/Grafo). Estos *contenedores* deben ser alimentados antes de ser evaluados en la sesión, sino obtendremos un error. "
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[[ 2.27301431 2.39163661 1.22738445 1.87839973]\n",
" [ 2.66718912 2.76533985 1.08909523 1.96862805]\n",
" [ 2.38245845 2.37843513 1.0873785 1.67218387]\n",
" [ 1.68678236 1.77147484 1.0363127 1.36901033]]\n"
]
}
],
"source": [
"# Ejemplo variables simbólicas en los grafos\n",
"# El valor que devuelve el constructor representa la salida de la \n",
"# variable (la entrada de la variable se define en la sesion)\n",
"\n",
"# Creamos un contenedor del tipo float. Un tensor de 4x4.\n",
"x = tf.placeholder(tf.float32, shape=(4, 4))\n",
"y = tf.matmul(x, x)\n",
"\n",
"with tf.Session() as sess:\n",
"# print(sess.run(y)) # ERROR: va a fallar porque no alimentamos a x.\n",
" rand_array = np.random.rand(4, 4)\n",
" print(sess.run(y, feed_dict={x: rand_array})) # ahora esta correcto."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Ahora ya conocemos en líneas generales como es la mecánica detrás del funcionamiento de [TensorFlow](https://www.tensorflow.org/) y como deberíamos proceder para crear las *operaciones* dentro de los [grafos](https://es.wikipedia.org/wiki/Grafo). Veamos si podemos implementar modelos de neuronas simples con la ayuda de esta librería.\n",
"\n",
"## Ejemplo de neuronas simples\n",
"\n",
"Una neurona simple, va a tener una forma similar al siguiente diagrama:\n",
"\n",
"\n",
"\n",
"En donde sus componentes son:\n",
"\n",
"* $x_1, x_2, \\dots, x_n$: son los datos de entrada en la neurona, los cuales también puede ser que sean producto de la salida de otra neurona de la red.\n",
"\n",
"* $x_0$: Es la unidad de sesgo; un valor constante que se le suma a la entrada de la función de activación de la neurona. Generalmente tiene el valor 1. Este valor va a permitir cambiar la función de activación hacia la derecha o izquierda, otorgándole más flexibilidad para aprender a la neurona.\n",
"\n",
"* $w_0, w_1, w_2, \\dots, w_n$: Los pesos relativos de cada entrada. Tener en cuenta que incluso la unidad de sesgo tiene un peso.\n",
"\n",
"* a: La salida de la neurona. Que va a ser calculada de la siguiente forma:\n",
"\n",
"$$a = f\\left(\\sum_{i=0}^n w_i \\cdot x_i \\right)$$\n",
"\n",
"Aquí $f$ es la ***función de activación*** de la neurona. Esta función es la que le otorga tanta flexibilidad a las [redes neuronales](https://es.wikipedia.org/wiki/Red_neuronal_artificial) y le permite estimar complejas relaciones no lineales en los datos. Puede ser tanto una [función lineal](https://es.wikipedia.org/wiki/Funci%C3%B3n_lineal), una [función logística](https://es.wikipedia.org/wiki/Funci%C3%B3n_log%C3%ADstica), [hiperbólica](https://es.wikipedia.org/wiki/Funci%C3%B3n_hiperb%C3%B3lica), etc.\n",
"\n",
"Ahora que ya conocemos como se construye una neurona tratemos de implementar con este modelo las funciones lógicas **AND, OR y XNOR**. Podemos pensar a estas funciones como un problema de clasificación en el que la salida va a ser 0 o 1, de acuerdo a la combinación de las diferentes entradas.\n",
"\n",
"Las podemos modelar linealmente con la siguiente función de activación:\n",
"\n",
"$$f(x) = \\left\\{\n",
"\t\\begin{array}{ll}\n",
"\t\t0 & \\mbox{si } x < 0 \\\\\n",
"\t\t1 & \\mbox{si } x \\ge 0\n",
"\t\\end{array}\n",
"\\right.$$\n",
"\n",
"### Neurona AND\n",
"\n",
"La neurona AND puede ser modelada con el siguiente esquema:\n",
"\n",
"\n",
"\n",
"La salida de esta neurona entonces va a ser:\n",
"\n",
"$$a = f(-1.5 + x_1 + x_2)$$\n",
"\n",
"Veamos como la podemos implementar en [TensorFlow](https://www.tensorflow.org/)."
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"# Neurona con TensorFlow\n",
"# Defino las entradas\n",
"entradas = tf.placeholder(\"float\", name='Entradas')\n",
"datos = np.array([[0, 0]\n",
" ,[1, 0]\n",
" ,[0, 1]\n",
" ,[1, 1]])\n",
"\n",
"# Defino las salidas\n",
"uno = lambda: tf.constant(1.0)\n",
"cero = lambda: tf.constant(0.0)\n",
"\n",
"with tf.name_scope('Pesos'):\n",
" # Definiendo pesos y sesgo\n",
" pesos = tf.placeholder(\"float\", name='Pesos')\n",
" sesgo = tf.placeholder(\"float\", name='Sesgo')\n",
"\n",
"with tf.name_scope('Activacion'):\n",
" # Función de activación\n",
" activacion = tf.reduce_sum(tf.add(tf.matmul(entradas, pesos), sesgo))\n",
"\n",
"with tf.name_scope('Neurona'):\n",
" # Defino la neurona\n",
" def neurona():\n",
" return tf.case([(tf.less(activacion, 0.0), cero)], default=uno)\n",
" \n",
" # Salida\n",
" a = neurona()\n",
"\n",
"# path de logs\n",
"logs_path = '/tmp/tensorflow_logs/neurona'"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/html": [
"
\n",
"
\n",
" \n",
" \n",
" | \n",
" x1 | \n",
" x2 | \n",
" f(x) | \n",
" x1 AND x2 | \n",
"
\n",
" \n",
" \n",
" \n",
" 0 | \n",
" 0.0 | \n",
" 0.0 | \n",
" -1.5 | \n",
" 0.0 | \n",
"
\n",
" \n",
" 1 | \n",
" 1.0 | \n",
" 0.0 | \n",
" -0.5 | \n",
" 0.0 | \n",
"
\n",
" \n",
" 2 | \n",
" 0.0 | \n",
" 1.0 | \n",
" -0.5 | \n",
" 0.0 | \n",
"
\n",
" \n",
" 3 | \n",
" 1.0 | \n",
" 1.0 | \n",
" 0.5 | \n",
" 1.0 | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" x1 x2 f(x) x1 AND x2\n",
"0 0.0 0.0 -1.5 0.0\n",
"1 1.0 0.0 -0.5 0.0\n",
"2 0.0 1.0 -0.5 0.0\n",
"3 1.0 1.0 0.5 1.0"
]
},
"execution_count": 8,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Lanzar la Sesion\n",
"with tf.Session() as sess:\n",
" # para armar el grafo\n",
" summary_writer = tf.train.SummaryWriter(logs_path, \n",
" graph=sess.graph)\n",
" # para armar tabla de verdad\n",
" x_1 = []\n",
" x_2 = []\n",
" out = []\n",
" act = []\n",
" for i in range(len(datos)):\n",
" t = datos[i].reshape(1, 2)\n",
" salida, activ = sess.run([a, activacion], feed_dict={entradas: t,\n",
" pesos:np.array([[1.],[1.]]),\n",
" sesgo: -1.5})\n",
" # armar tabla de verdad en DataFrame\n",
" x_1.append(t[0][0])\n",
" x_2.append(t[0][1])\n",
" out.append(salida)\n",
" act.append(activ)\n",
" tabla_info = np.array([x_1, x_2, act, out]).transpose()\n",
" tabla = pd.DataFrame(tabla_info, \n",
" columns=['x1', 'x2', 'f(x)', 'x1 AND x2'])\n",
"tabla"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Aquí podemos ver los datos de entrada de $x_1$ y $x_2$, el resultado de la función de activación y la decisión final que toma la neurona de acuerdo este último resultado. Como podemos ver en la tabla de verdad, la neurona nos dice que $x_1$ `and` $x_2$ solo es verdad cuando ambos son verdaderos, lo que es correcto.\n",
"\n",
"### Neurona OR\n",
"\n",
"La neurona OR puede ser modelada con el siguiente esquema:\n",
"\n",
"\n",
"\n",
"La salida de esta neurona entonces va a ser:\n",
"\n",
"$$a = f(-0.5 + x_1 + x_2)$$\n",
"\n",
"Como se puede ver a simple vista, el modelo de esta neurona es similar a la de la neurona AND, con el único cambio en el valor del *sesgo*, por lo tanto solo tendríamos que cambiar ese valor en nuestro modelo anterior para crear esta nueva neurona."
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/html": [
"\n",
"
\n",
" \n",
" \n",
" | \n",
" x1 | \n",
" x2 | \n",
" f(x) | \n",
" x1 OR x2 | \n",
"
\n",
" \n",
" \n",
" \n",
" 0 | \n",
" 0.0 | \n",
" 0.0 | \n",
" -0.5 | \n",
" 0.0 | \n",
"
\n",
" \n",
" 1 | \n",
" 1.0 | \n",
" 0.0 | \n",
" 0.5 | \n",
" 1.0 | \n",
"
\n",
" \n",
" 2 | \n",
" 0.0 | \n",
" 1.0 | \n",
" 0.5 | \n",
" 1.0 | \n",
"
\n",
" \n",
" 3 | \n",
" 1.0 | \n",
" 1.0 | \n",
" 1.5 | \n",
" 1.0 | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" x1 x2 f(x) x1 OR x2\n",
"0 0.0 0.0 -0.5 0.0\n",
"1 1.0 0.0 0.5 1.0\n",
"2 0.0 1.0 0.5 1.0\n",
"3 1.0 1.0 1.5 1.0"
]
},
"execution_count": 9,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Neurona OR, solo cambiamos el valor del sesgo\n",
"with tf.Session() as sess:\n",
" # para armar el grafo\n",
" summary_writer = tf.train.SummaryWriter(logs_path, \n",
" graph=sess.graph)\n",
" # para armar tabla de verdad\n",
" x_1 = []\n",
" x_2 = []\n",
" out = []\n",
" act = []\n",
" for i in range(len(datos)):\n",
" t = datos[i].reshape(1, 2)\n",
" salida, activ = sess.run([a, activacion], feed_dict={entradas: t,\n",
" pesos:np.array([[1.],[1.]]),\n",
" sesgo: -0.5}) # sesgo ahora -0.5\n",
" # armar tabla de verdad en DataFrame\n",
" x_1.append(t[0][0])\n",
" x_2.append(t[0][1])\n",
" out.append(salida)\n",
" act.append(activ)\n",
" tabla_info = np.array([x_1, x_2, act, out]).transpose()\n",
" tabla = pd.DataFrame(tabla_info, \n",
" columns=['x1', 'x2', 'f(x)', 'x1 OR x2'])\n",
"tabla"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Como vemos, cambiando simplemente el peso del *sesgo*, convertimos a nuestra neurona AND en una neurona OR. Como muestra la tabla de verdad, el único caso en que $x_1$ `OR` $x_2$ es falso es cuando ambos son falsos.\n",
"\n",
"### Red Neuronal XNOR\n",
"\n",
"El caso de la función XNOR, ya es más complicado y no puede modelarse utilizando una sola neurona como hicimos con los ejemplos anteriores. $x_1$ `XNOR` $x_2$ va a ser verdadero cuando ambos son verdaderos o ambos son falsos, para implementar esta función lógica debemos crear una red con dos capas, la primer capa tendrá dos neuronas cuya salida servirá de entrada para una nueva neurona que nos dará el resultado final. Esta red la podemos modelar de acuerdo al siguiente esquema:\n",
"\n",
"\n",
"\n",
"Veamos entonces si podemos implementar este modelo en [TensorFlow](https://www.tensorflow.org/)."
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"# Red Neuronal XNOR con TensorFlow\n",
"# Defino las entradas\n",
"entradas = tf.placeholder(\"float\", name='Entradas')\n",
"datos = np.array([[0, 0]\n",
" ,[1, 0]\n",
" ,[0, 1]\n",
" ,[1, 1]])\n",
"\n",
"# Defino las salidas\n",
"uno = lambda: tf.constant(1.0)\n",
"cero = lambda: tf.constant(0.0)\n",
"\n",
"with tf.name_scope('Pesos'):\n",
" # Definiendo pesos y sesgo\n",
" pesos = {\n",
" 'a1': tf.constant([[-1.0], [-1.0]], name='peso_a1'),\n",
" 'a2': tf.constant([[1.0], [1.0]], name='peso_a2'),\n",
" 'a3': tf.constant([[1.0], [1.0]], name='peso_a3')\n",
" }\n",
" sesgo = {\n",
" 'a1': tf.constant(0.5, name='sesgo_a1'),\n",
" 'a2': tf.constant(-1.5, name='sesgo_a2'),\n",
" 'a3': tf.constant(-0.5, name='sesgo_a3')\n",
" }\n",
"\n",
"\n",
"with tf.name_scope('Red_neuronal'):\n",
" # Defino las capas\n",
" def capa1(entradas, pesos, sesgo):\n",
" # activacion a1\n",
" a1 = tf.reduce_sum(tf.add(tf.matmul(entradas, pesos['a1']), sesgo['a1']))\n",
" a1 = tf.case([(tf.less(a1, 0.0), cero)], default=uno)\n",
" # activacion a2\n",
" a2 = tf.reduce_sum(tf.add(tf.matmul(entradas, pesos['a2']), sesgo['a2']))\n",
" a2 = tf.case([(tf.less(a2, 0.0), cero)], default=uno)\n",
" return a1, a2\n",
" \n",
" def capa2(entradas, pesos, sesgo):\n",
" # activacion a3\n",
" a3 = tf.reduce_sum(tf.add(tf.matmul(entradas, pesos['a3']), sesgo['a3']))\n",
" a3 = tf.case([(tf.less(a3, 0.0), cero)], default=uno)\n",
" return a3\n",
"\n",
"# path de logs\n",
"logs_path = '/tmp/tensorflow_logs/redXNOR'"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/html": [
"\n",
"
\n",
" \n",
" \n",
" | \n",
" x1 | \n",
" x2 | \n",
" x1 XNOR x2 | \n",
"
\n",
" \n",
" \n",
" \n",
" 0 | \n",
" 0.0 | \n",
" 0.0 | \n",
" 1.0 | \n",
"
\n",
" \n",
" 1 | \n",
" 1.0 | \n",
" 0.0 | \n",
" 0.0 | \n",
"
\n",
" \n",
" 2 | \n",
" 0.0 | \n",
" 1.0 | \n",
" 0.0 | \n",
"
\n",
" \n",
" 3 | \n",
" 1.0 | \n",
" 1.0 | \n",
" 1.0 | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" x1 x2 x1 XNOR x2\n",
"0 0.0 0.0 1.0\n",
"1 1.0 0.0 0.0\n",
"2 0.0 1.0 0.0\n",
"3 1.0 1.0 1.0"
]
},
"execution_count": 11,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Sesion red neuronal XNOR\n",
"with tf.Session() as sess:\n",
" # para armar el grafo\n",
" summary_writer = tf.train.SummaryWriter(logs_path, \n",
" graph=sess.graph)\n",
" # para armar tabla de verdad\n",
" x_1 = []\n",
" x_2 = []\n",
" out = []\n",
" for i in range(len(datos)):\n",
" t = datos[i].reshape(1, 2)\n",
" # obtenos resultados 1ra capa\n",
" a1, a2 = sess.run(capa1(entradas, pesos, sesgo), feed_dict={entradas: t})\n",
" # pasamos resultados a la 2da capa\n",
" ent_a3 = np.array([[a1, a2]])\n",
" salida = sess.run(capa2(ent_a3, pesos, sesgo))\n",
" # armar tabla de verdad en DataFrame\n",
" x_1.append(t[0][0])\n",
" x_2.append(t[0][1])\n",
" out.append(salida)\n",
" tabla_info = np.array([x_1, x_2, out]).transpose()\n",
" tabla = pd.DataFrame(tabla_info, \n",
" columns=['x1', 'x2', 'x1 XNOR x2'])\n",
"tabla"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Como vemos, la [red neuronal](https://es.wikipedia.org/wiki/Red_neuronal_artificial) nos da el resultado correcto para la función lógica XNOR, solo es verdadera si ambos valores son verdaderos, o ambos son falsos.\n",
"\n",
"Hasta aquí implementamos simples neuronas y les pasamos los valores de sus pesos y sesgo a mano; esto es sencillo para los ejemplos; pero en la vida real, si queremos utilizar [redes neuronales](https://es.wikipedia.org/wiki/Red_neuronal_artificial) necesitamos implementar un procesos que vaya actualizando los pesos a medida que la red vaya aprendiendo con el entrenamiento. Este proceso se conoce con el nombre de [propagación hacia atrás](https://es.wikipedia.org/wiki/Propagaci%C3%B3n_hacia_atr%C3%A1s) o [backpropagation](https://es.wikipedia.org/wiki/Propagaci%C3%B3n_hacia_atr%C3%A1s).\n",
"\n",
"### Propagación hacia atrás\n",
"\n",
"La [propagación hacia atrás](https://es.wikipedia.org/wiki/Propagaci%C3%B3n_hacia_atr%C3%A1s) o [backpropagation](https://es.wikipedia.org/wiki/Propagaci%C3%B3n_hacia_atr%C3%A1s) es un algoritmo que funciona mediante la determinación de la pérdida (o error) en la salida y luego propagándolo de nuevo hacia atrás en la red. De esta forma los pesos se van actualizando para minimizar el error resultante de cada neurona. Este algoritmo es lo que les permite a las [redes neuronales](https://es.wikipedia.org/wiki/Red_neuronal_artificial) aprender.\n",
"\n",
"Veamos un ejemplo de como podemos implementar una [red neuronal](https://es.wikipedia.org/wiki/Red_neuronal_artificial) que pueda aprender por sí sola con la ayuda de [TensorFlow](https://www.tensorflow.org/).\n",
"\n",
"## Ejemplo de Perceptron multicapa para reconocer dígitos escritos\n",
"\n",
"En este ejemplo vamos a construir un [peceptron multicapa](https://es.wikipedia.org/wiki/Perceptr%C3%B3n_multicapa) para clasificar dígitos escritos. Antes de pasar a la construcción del modelo, exploremos un poco el conjunto de datos con el que vamos a trabajar en la clasificación.\n",
"\n",
"\n",
"### MNIST dataset\n",
"\n",
"[MNIST](http://colah.github.io/posts/2014-10-Visualizing-MNIST/) es un simple conjunto de datos para reconocimiento de imágenes por computadora. Se compone de imágenes de dígitos escritos a mano como los siguientes:\n",
"\n",
"\n",
"\n",
"Para más información sobre el dataset pueden visitar el siguiente [enlace](http://colah.github.io/posts/2014-10-Visualizing-MNIST/), en donde hacen un análisis detallado del mismo."
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Successfully downloaded train-images-idx3-ubyte.gz 9912422 bytes.\n",
"Extracting MNIST_data/train-images-idx3-ubyte.gz\n",
"Successfully downloaded train-labels-idx1-ubyte.gz 28881 bytes.\n",
"Extracting MNIST_data/train-labels-idx1-ubyte.gz\n",
"Successfully downloaded t10k-images-idx3-ubyte.gz 1648877 bytes.\n",
"Extracting MNIST_data/t10k-images-idx3-ubyte.gz\n",
"Successfully downloaded t10k-labels-idx1-ubyte.gz 4542 bytes.\n",
"Extracting MNIST_data/t10k-labels-idx1-ubyte.gz\n"
]
}
],
"source": [
"# importando el dataset\n",
"from tensorflow.examples.tutorials.mnist import input_data\n",
"mnist = input_data.read_data_sets(\"MNIST_data/\", one_hot=True)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Explorando MNIST dataset"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"(55000, 784)"
]
},
"execution_count": 13,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# forma del dataset 55000 imagenes\n",
"mnist.train.images.shape"
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"# cada imagen es un array de 28x28 con cada pixel \n",
"# definido como escala de grises.\n",
"digito1 = mnist.train.images[0].reshape((28, 28))"
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# visualizando el primer digito\n",
"plt.imshow(digito1, cmap = cm.Greys)\n",
"plt.show()"
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"7"
]
},
"execution_count": 16,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# valor correcto\n",
"mnist.train.labels[0].nonzero()[0][0]"
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"# visualizando imagenes de 5 en 5\n",
"def visualizar_imagenes(dataset, cant_img):\n",
" img_linea = 5\n",
" lineas = int(cant_img / img_linea)\n",
" imagenes = []\n",
" for i in range(lineas):\n",
" datos = []\n",
" for img in dataset[img_linea* i:img_linea* (i+1)]:\n",
" datos.append(img.reshape((28,28)))\n",
" imgs = np.hstack(datos)\n",
" imagenes.append(imgs)\n",
" data = np.vstack(imagenes)\n",
" plt.imshow(data, cmap = cm.Greys )\n",
" plt.show()"
]
},
{
"cell_type": "code",
"execution_count": 18,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# visualizando los primeros 30 dígitos\n",
"plt.figure(figsize=(8, 8))\n",
"visualizar_imagenes(mnist.train.images, 30)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Construyendo el perceptron multicapa\n",
"\n",
"Ahora que ya conocemos los datos con los que vamos a trabajar, ya estamos en condiciones de construir el modelo. Vamos a construir un [peceptron multicapa](https://es.wikipedia.org/wiki/Perceptr%C3%B3n_multicapa) que es una de las redes neuronales más simples. El modelo va a tener dos capas ocultas, que se van a activar con la [función de activación](https://es.wikipedia.org/wiki/Funci%C3%B3n_de_activaci%C3%B3n) ReLU y vamos a optimizar los pesos reduciendo la [entropía cruzada](https://es.wikipedia.org/wiki/Entrop%C3%ADa_cruzada) utilizando el algoritmo [Adam](http://arxiv.org/abs/1412.6980) que es un método para [optimización estocástica](https://en.wikipedia.org/wiki/Stochastic_optimization). "
]
},
{
"cell_type": "code",
"execution_count": 19,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"# Parametros\n",
"tasa_aprendizaje = 0.001\n",
"epocas = 15\n",
"lote = 100\n",
"display_step = 1\n",
"logs_path = \"/tmp/tensorflow_logs/perceptron\"\n",
"\n",
"# Parametros de la red\n",
"n_oculta_1 = 256 # 1ra capa de atributos\n",
"n_oculta_2 = 256 # 2ra capa de atributos\n",
"n_entradas = 784 # datos de MNIST(forma img: 28*28)\n",
"n_clases = 10 # Total de clases a clasificar (0-9 digitos)\n",
"\n",
"# input para los grafos\n",
"x = tf.placeholder(\"float\", [None, n_entradas], name='DatosEntrada')\n",
"y = tf.placeholder(\"float\", [None, n_clases], name='Clases')"
]
},
{
"cell_type": "code",
"execution_count": 20,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"# Creamos el modelo\n",
"def perceptron_multicapa(x, pesos, sesgo):\n",
" # Función de activación de la capa escondida\n",
" capa_1 = tf.add(tf.matmul(x, pesos['h1']), sesgo['b1'])\n",
" # activacion relu\n",
" capa_1 = tf.nn.relu(capa_1)\n",
" # Función de activación de la capa escondida\n",
" capa_2 = tf.add(tf.matmul(capa_1, pesos['h2']), sesgo['b2'])\n",
" # activación relu\n",
" capa_2 = tf.nn.relu(capa_2)\n",
" # Salida con activación lineal\n",
" salida = tf.matmul(capa_2, pesos['out']) + sesgo['out']\n",
" return salida"
]
},
{
"cell_type": "code",
"execution_count": 21,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"# Definimos los pesos y sesgo de cada capa.\n",
"pesos = {\n",
" 'h1': tf.Variable(tf.random_normal([n_entradas, n_oculta_1])),\n",
" 'h2': tf.Variable(tf.random_normal([n_oculta_1, n_oculta_2])),\n",
" 'out': tf.Variable(tf.random_normal([n_oculta_2, n_clases]))\n",
"}\n",
"sesgo = {\n",
" 'b1': tf.Variable(tf.random_normal([n_oculta_1])),\n",
" 'b2': tf.Variable(tf.random_normal([n_oculta_2])),\n",
" 'out': tf.Variable(tf.random_normal([n_clases]))\n",
"}\n",
"\n",
"with tf.name_scope('Modelo'):\n",
" # Construimos el modelo\n",
" pred = perceptron_multicapa(x, pesos, sesgo)\n",
"\n",
"with tf.name_scope('Costo'):\n",
" # Definimos la funcion de costo\n",
" costo = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(pred, y))\n",
" \n",
"with tf.name_scope('optimizador'):\n",
" # Algoritmo de optimización\n",
" optimizar = tf.train.AdamOptimizer(\n",
" learning_rate=tasa_aprendizaje).minimize(costo)\n",
"\n",
"with tf.name_scope('Precision'):\n",
" # Evaluar el modelo\n",
" pred_correcta = tf.equal(tf.argmax(pred, 1), tf.argmax(y, 1))\n",
" # Calcular la precisión\n",
" Precision = tf.reduce_mean(tf.cast(pred_correcta, \"float\"))\n",
" \n",
"# Inicializamos todas las variables\n",
"init = tf.initialize_all_variables()\n",
"\n",
"# Crear sumarización para controlar el costo\n",
"tf.scalar_summary(\"Costo\", costo)\n",
"# Crear sumarización para controlar la precisión\n",
"tf.scalar_summary(\"Precision\", Precision)\n",
"# Juntar los resumenes en una sola operación\n",
"merged_summary_op = tf.merge_all_summaries()"
]
},
{
"cell_type": "code",
"execution_count": 22,
"metadata": {
"collapsed": false,
"scrolled": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Iteración: 001 costo = 190.739139247\n",
"Iteración: 002 costo = 42.639138275\n",
"Iteración: 003 costo = 26.239370855\n",
"Iteración: 004 costo = 18.236157751\n",
"Iteración: 005 costo = 13.129509245\n",
"Iteración: 006 costo = 9.765473726\n",
"Iteración: 007 costo = 7.159448563\n",
"Iteración: 008 costo = 5.309303818\n",
"Iteración: 009 costo = 3.940411947\n",
"Iteración: 010 costo = 2.904317733\n",
"Iteración: 011 costo = 2.179349244\n",
"Iteración: 012 costo = 1.597618810\n",
"Iteración: 013 costo = 1.215200688\n",
"Iteración: 014 costo = 0.875238173\n",
"Iteración: 015 costo = 0.760177279\n",
"Optimización Terminada!\n",
"\n",
"Precisión: 0.94\n",
"Ejecutar el comando:\n",
" --> tensorboard --logdir=/tmp/tensorflow_logs \n",
"Luego abir http://0.0.0.0:6006/ en el navegador\n"
]
}
],
"source": [
"# Lanzamos la sesión\n",
"with tf.Session() as sess:\n",
" sess.run(init)\n",
" \n",
" # op to write logs to Tensorboard\n",
" summary_writer = tf.train.SummaryWriter(\n",
" logs_path, graph=tf.get_default_graph())\n",
"\n",
" # Entrenamiento\n",
" for epoca in range(epocas):\n",
" avg_cost = 0.\n",
" lote_total = int(mnist.train.num_examples/lote)\n",
"\n",
" for i in range(lote_total):\n",
" lote_x, lote_y = mnist.train.next_batch(lote)\n",
" # Optimización por backprop y funcion de costo\n",
" _, c, summary = sess.run([optimizar, costo, merged_summary_op],\n",
" feed_dict={x: lote_x, y: lote_y})\n",
" # escribir logs en cada iteracion\n",
" summary_writer.add_summary(summary, epoca * lote_total + i)\n",
" # perdida promedio\n",
" avg_cost += c / lote_total\n",
" # imprimir información de entrenamiento\n",
" if epoca % display_step == 0:\n",
" print(\"Iteración: {0: 04d} costo = {1:.9f}\".format(epoca+1, \n",
" avg_cost))\n",
" print(\"Optimización Terminada!\\n\")\n",
"\n",
" \n",
" print(\"Precisión: {0:.2f}\".format(Precision.eval({x: mnist.test.images,\n",
" y: mnist.test.labels})))\n",
"\n",
" print(\"Ejecutar el comando:\\n\",\n",
" \"--> tensorboard --logdir=/tmp/tensorflow_logs \",\n",
" \"\\nLuego abir http://0.0.0.0:6006/ en el navegador\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Como vemos [TensorFlow](https://www.tensorflow.org/) nos da mucha flexibilidad para construir el modelo, modificando muy pocas líneas podríamos cambiar el algoritmo de optimización o el calculo del error y obtener otros resultados; de esta forma vamos a poder personalizar el modelo para alcanzar mayores niveles de precisión.\n",
"\n",
"## TensorBoard\n",
"\n",
"Otra gran herramienta que nos proporciona [TensorFlow](https://www.tensorflow.org/) es [TensorBoard](https://www.tensorflow.org/versions/r0.8/how_tos/graph_viz/index.html) que nos permite visualizar nuestros [grafos](https://es.wikipedia.org/wiki/Grafo) y nos ayudan a alcanzar un mayor entendimiento del flujo de cálculos que ocurre en nuestro modelo.\n",
"\n",
"Para crear la información de la que se va a nutrir el [TensorBoard](https://www.tensorflow.org/versions/r0.8/how_tos/graph_viz/index.html), podemos definir algunos *scopes* utilizando `tf.name_scope`; también podemos incluir algunos gráficos sumarizados con `tf.scalar_summary` y luego llamamos a la función `tf.train.SummaryWriter` dentro de una *Sesión*.\n",
"\n",
"Luego podemos iniciar el *board* con el comando `tensorboard --logdir=logpath` como se puede ver en la salida del último ejemplo.\n",
"\n",
"Los [grafos](https://es.wikipedia.org/wiki/Grafo) de los casos que vimos por ejemplo, se ven así.\n",
"\n",
"\n",
"\n",
"Los invito a explorar la herramienta y adentrarse en el fascinante mundo de las [redes neuronales](https://es.wikipedia.org/wiki/Red_neuronal_artificial).\n",
"\n",
"Saludos!"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"*Este post fue escrito utilizando IPython notebook. Pueden descargar este [notebook](https://github.com/relopezbriega/relopezbriega.github.io/blob/master/downloads/IntroTensorFlow.ipynb) o ver su version estática en [nbviewer](http://nbviewer.ipython.org/github/relopezbriega/relopezbriega.github.io/blob/master/downloads/IntroTensorFlow.ipynb).*"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.5.1+"
}
},
"nbformat": 4,
"nbformat_minor": 0
}