Académique Documents
Professionnel Documents
Culture Documents
http://jorditorres.org/introduccion-practica-al-deep-learning-con-tensorflow-de-google-parte-1/
Por motivos de disponibilidad voy a realizar esta introduccin en varios das mediante varios
post en este blog. Hoy, para acabar esta primera entrega, les avanzo una breve reflexin en
voz alta sobre los motivos que puede tener Google para liberar un cdigo de tanto valor, creo
que es importante. Tambin aado los pasos a seguir para instalar este paquete en su
ordenador.
Pero estoy seguro que tambin hay en la decisin de Google el considerar el retorno que tiene
para cualquier empresa que libera un cdigo en cuanto a ideas que la comunidad aporta y la
empresa creadora tambin puede beneficiarse.
Pero tampoco hay que menospreciar el valor de marca que implica liberar un cdigo. Y si este
cdigo se usa, como estoy seguro que ser el caso TensorFlow, la compaa creadora del
software tiene mucha gente ya formada que puede incorporar en su empresa siempre que lo
necesite (y me imagino que esto va ha hacer Google pues todo pinta que continuar
creciendo).
2- Instalacin de TensorFlow
TensorFlow tiene una API Python que usaremos que requiere Python 2.7 instalado. La manera
ms fcil de instalar Su instalacin resulta bastante sencilla con el comando habitual pip install:
virtualenv ~/Virtualenvs/tensorflow
source ~/Virtualenvs/tensorflow/bin/activate
pip install https://storage.googleapis.com/tensorflow/mac/tensorflow-0.5.0-
py2-none-any.whl
git clone --recurse-submodules https://github.com/tensorflow/tensorflow
Si se opta por una instalacin a partir de fuentes pueden visitar esta pgina.
Para probar que tienen bien instalado el paquete, pueden hacer su primer programa Hello
World en TensorFlow. Cmo hemos comentado Tensorflow ofrece una fantstica API en
Python para poder ser usado. Despus de invocar el interprete de Python, puede teclear el
siguiente cdigo:
import tensorflow as tf
Hasta aqu he mostrado una manera de instalar el paquete TensorFlow para entrar de la
manera ms sencilla posible a usarlo. Pero hace falta remarcar que lo que ha liberado Google
es mucho ms y que podemos descargar el cdigo fuente de Tensorflow y compilarlo,
descargar la versin para GPUs, la versin que se ejecuta via Docker, entre muchas otras
cosas. Ms detalle de todas las posibilidades se puede encontrar en la pgina de Download
and Setup TensorFlow a la que invito al lector visitar una vez llegado al final de este post sin
haberse accidentado por el camino.
Parte 2
http://jorditorres.org/introduccion-practica-al-deep-learning-con-tensorflow-de-google-parte-2/
Sin duda las tcnicas de Deep Learning hasta hace pocos aos no han experimentado su
gran auge, a pesar que son tcnicas basadas en redes neuronales artificiales que ya aparecan
en la literatura cientfica de los aos 80 (por ejemplo con el Neocognitron de Kunihiko
Fukushima). Como dato, mencionar que en 1990, Yann LeCun junto con otros
investigadores, consiguieron aplicar el algoritmo estndar backpropagation (algoritmo creado a
mediados de los 70) a una deep red neuronal con varias capas con el propsito de reconocer
los dgitos de los cdigos postales del correo escritos a mano. A pesar del xito de aplicar el
algoritmo, el tiempo requerido para entrenar la red neuronal con ese conjunto de datos fue
aproximadamente de 3 das, hecho que lo haca impracticable para un uso generalizado.
El lector a estas alturas ya debe suponer que hay de nuevo en el escenario de hoy en da para
hacer posible la llegada del Deep Learning: una capacidad de computacin antes nunca
vista. Desde entonces la capacidad de clculo de los computadores ha experimentado un
crecimiento espectacular. Una muestra de ello lo podemos encontrar en la lista Top500 con los
quinientos ordenadores ms rpidos del planeta que se elabora dos veces al ao desde 1993.
La grfica resumen de las capacidades de clculo a que llegan estos ordenadores, llamados
supercomputadores, se muestra a continuacin:
En esta grfica indica dos veces al ao (Junio y Noviembre) la velocidad mxima de
procesado que consigue un supercomputador (en nmero de instrucciones en coma flotante
que un ordenador puede ejecutar por segundo) , indicando el ms rpido con un tringulo, el
ordenador nmero 500 con un cuadrado y la suma de todos ellos con un crculo. Tenemos
desde 1993 hasta la semana pasada, que se present la ltima lista, siendo el ms rpido del
mundo por sexta vez consecutiva, el supercomputador Tianhe-2, desarrollado por la National
University of Defense Technology de China que llega a una velocidad de 33.86
PetaFlop/segundo, es decir, realizar 33.860.000.000.000.000 operaciones por segundo. Qu
les parece?
Cmo podemos observar en la grfica, desde que Yann LeCun creo su red neuronal para
interpretar cdigos postales, a hoy en da, la potencia de los ordenadores se ha multiplicado
por 1.000.000.000 aproximadamente. Nada despreciable, Verdad?. Otro tema es que
seamos capaces de usar toda esta potencia de clculo disponible para poder entrenar una red
neuronal. Cmo sufren mis colegas tericos, de momento queda bastante margen para
mejorar. Sin duda hace falta tambin el conocimiento de los ingenieros de
computadores (hardware y software) en este nuevo mundo del aprendizaje automtico. Hoy
en dia hay una gran diversidad de componentes y de arquitectura de computadores. Por
ejemplo TensorFlow ya tiene libreras para explotar las ventajas de trabajar con arquitecturas
especiales basadas en GPUs, que presentan un gran rendimiento para entrenar redes
neuronales. Sin duda todo un mundo que se escapa de este tutorial.
5- Un sunami de datos
Una pregunta para acabar, Leyendo esto, qu empresas creen que concentran una gran parte
de estos datos generados? Cmo decamos en la anterior entrega de este tutorial de
introduccin a Deep Learning, el poder est en los datos y no en el software. Otra cosa es que
tengas la capacidad econmica para comprar los sistemas informticos y lo ms importante,
poder pagar la energa que estos consumen. Saben cuanto consume el supercomputador
Tianhe-2? La pequea cantidad de 17,808 W/h, estando conectado 24 horas al dia todos los
das del ao. Calculen!
Parte 3
http://jorditorres.org/introduccion-practica-al-deep-learning-con-tensorflow-de-google-parte-3/
Con los datos que presentbamos en la segunda entrega el lector se sentir abrumado por
los cifras que aparecen , siendo probable que aun no tenga datos y se pregunte que datos
puedo usar para entrenar a mis redes neuronales si mi empresa aun no ha acumulado
suficientes? Por suerte en la comunidad de machine learning, y en el caso que nos ocupa la de
Deep Learning, dispone de un gran nmero de conjuntos de datos de acceso abierto para
poder crear modelos a partir de ellos si no se dispone de datos propios para empezar. En el
portal DeepLearning.net se puede encontrar una lista de conjuntos de datos disponibles con
diferentes caracterstica y tamaos.
Aqu les comentamos algunos de los datasets de la lista que pueden ser tiles para empezar a
trabajar y que podran ser usados como conjunto de datos para experimentar con lo que
iremos explicando en este tutorial introductorio.
El dataset CIFAR-10
El dataset CIFAR10 subconjunto de imgenes del conjunto del 80 million tiny images, contiene
60.000 imgenes a color de 3232 pertenecientes a 10 clases de 6.000 images cada una de
ellas. (las clases son exclusivas entre ellas, es decir no existe un caso que sea automvil y
camin a la vez). Estas imgenes se reparten en 50.000 para entrenar y 10.000 para testear.
Un ejemplo con 10 imgenes por clase puede ser:
aviones
automviles
pjaros
gatos
ciervos
perros
ranas
caballos
barcos
camiones
El dataset CIFAR-100
El dataset CIFAR100 es como el CIFAR-10, excepto que tiene 100 clases que contienen 600
imagenes cada clase. Las CIFAR100 las 100 clase estn agrupadas en 20 superclases. Cada
imagen est etiquetada con la clase que pertenece y la subclase a que pertenece.
El dataset MNIST
Otro dataset muy interesante para iniciarse en estos temas de reconocimiento de patrones
es SVHN. SVHN, acrnimo de Street View House Numbers, es un dataset formado
por imgenes de fotografas a color de los nmeros de casa en las fachadas de los edificios
obtenidas a partir de imgenes del Google Street View. La ventaja de este dataset es que
requiere mnimo preprocesado y formateado de los datos. En realidad es similar
al dataset MNIST pero incorporado un order de magnitud con sus 600.000 imgenes de dgitos
con una complejidad adicional al ser reconocimiento de dgitos y imgenes extrados de
escenas naturales. En su pgina web pueden encontrar ms detalle y descargar los datos. A
continuacin se puede ver un ejemplo de estas imgenes.
Imagenet
Finalmente mencionar Imagenet. Se trata de un conjunto de imgenes que sirve para realizar
una competicin anual de visualizacin a gran escala, la ImageNet Large Scale Visual
Recognition Challenge (ILSVRC). Esta competicin anual se ha convertido en el laboratorio
para probar ideas en este tema de Deep Learning. Propongo al lector que de momento no se
adentre en este dataset pero que lo tenga en cuenta por si ms adelante se plantea participar y
ganar la ILSVRC!
Parte 4
http://jorditorres.org/introduccion-practica-al-deep-learning-con-tensorflow-de-google-parte-
4/
Hoy, en esta cuarta entrega de la introduccin prctica al Deep Learning con TensorFlow
de Google (primera entrega, segunda entrega, tercera entrega) presentaremos en detalle uno
de los datasets que presentamos en la tercera entrega y que usaremos en este primera parte
del tutorial para crear nuestra primera red neuronal.
7- Dataset MNIST
Una de las aplicaciones habituales de Deep Learning incluyen reconocimiento de patrones. Por
ello, de la misma manera que cuando uno empieza a programar existe la tradicin de empezar
por un print Hello World, en Deep Learning se crea un modelo de reconocimiento de
nmeros escritos a mano. Se usa habitualmente el conjunto de imgenes de dgitos hechos a
mano contenidos en el dataset MNIST comentado en la anterior entrega. Recordemos que
cada imagen es del siguiente estilo:
Adems para cada imagen se incluye una etiqueta, indicando que dgito representa. Como
hemos visto los datos MNIST se puede encontrar en la pgina de Yann LeCuns. LeCun (de
NYU), Bengio (Montreal), Hinton (Toronto) y Ng (Stanford) son grandes nombres
de acadmicos que en 2006 empezaron esta ola de deep learning en que nos encontramos
ahora. Pero esta parte de historia la dejo ya para otra serie de posts.
La base de datos MNIST de dgitos realizados a mano que usaremos est formado por un
conjunto de entreno de 60.000 ejemplares y un conjunto de test de 10.000 ejemplares . Para
descargar los datos proponemos que usen este cdigo que para su comodidad hemos puesto
en nuestro github (obtenido de Google). Simplemente descarguen el cdigo input_data.py en
el mismo directorio de trabajo en que se encuentran y lo importen en su programa con
import input_data
mnist = input_data.read_data_sets("MNIST_data/", one_hot=True)
En este momento disponen de los datos de entreno en mnist.train y los datos de test
en mint.test. Cmo ya hemos dicho anteriormente, cada elemento est compuesto por una
imagen que la referenciaremos como xs y su correspondiente etiqueta con notacin ys,
para facilitar expresar el cdigo de procesado. Recordar que tanto los datos de entreno como
de test contienen xs y ys. Por ejemplo las imgenes de entreno estn
en mnist.train.images y las etiquetas de entreno estn en mnist.train.labels.
Entrando un poco ms en detalle con las imgenes, estas son de 2828 pixels que se pueden
representar como una matriz de nmeros. Por ejemplo, una de las imgenes del nmero 1 se
podra representar como:
donde cada posicin indica la intensidad del pixel entre 0 y 1. Esta matrix se puede representar
con un array de 2828 = 784 nmeros. En realidad la imagen se ha convertido en un montn
de puntos en un espacio vectorial de 784 dimensiones. Solo mencionar que el reducir una
estructura de 2D a este espacio estamos perdiendo parte de informacin, y algunos algoritmos
de visin por computador avanzados podra afectar a su resultado, pero para el mtodo ms
simple que usaremos en este tutorial esto no es un problema.
La primera dimensin indexa la imagen y la segunda indexa el pixel en cada imagen. Cada
entrada en el tensor es la intensidad del pixel entre 0 y 1, para un pixel particular en una
imagen concreta.
Por otro lado tenemos las etiquetas, que recordemos son nmeros entre 0 y 9, que indican que
dgito representa la imagen. En este tutorial vamos a representar esta etiqueta con un vector de
10 posiciones donde la posicin correspondiente al dgito que representa la imagen contiene un
1 y el resto son 0. Por tanto, mnist.train.labels es una matriz de de 0 y 1 con una forma
de 60.000 x 10.
En estos momentos estamos ya preparados para hacer nuestro modelo. Nos vemos en la
prxima entrega.
Parte 5
http://jorditorres.org/introduccion-practica-al-deep-learning-con-tensorflow-de-google-parte-
5/
Hoy, en esta quinta entrega de la introduccin prctica al Deep Learning con TensorFlow
de Google (primera entrega, segunda entrega, tercera entrega, cuarta entrega) vamos una
nociones mnimas sobre redes neuronales y introducir el modelo sencillo que vamos a usar en
este tutorial.
La funcin bsica de una neurona en una red neuronal consiste, a partir de un determinado
nmero de valores de entrada x1,x2,xn, multiplicar cada uno de ellos por un peso
(weight) especfico w1,w2, wn. A continuacin se suman todos ellos para producir un valor
entre 0 y 1 como resultado:
En muchos casos, tal como ya hemos avanzado la neurona aade un parmetro de sesgo
(bias) que es una constante.
Veamos un ejemplo muy simple que creo que puede ser muy ilustrativo. Supongamos que
tenemos n puntos en un plano etiquetados con cuadrado y redonda. Dado un nuevo punto
x, queremos saber que etiqueta le corresponde:
Una aproximacin razonable es dibujar una lnea que separe los dos grupos y usar esta lnea
como clasificador:
En este caso los datos de entrada sern representados por un vector (x1,x2) y nuestra funcin
retornar 0 o 1 (encima o debajo de la lnea). Matemticamente la lnea (el clasificador)
puede ser definido por un vector de pesos w y un offset vertical (o sesgo) b.
Para ello nuestra funcin debe calcular primero una suma ponderada de las entradas adems
del sesgo y el resultado sera entonces la entrada a una funcin de activacin para producir un
etiquetado. En el ejemplo anterior, nuestra funcin de activacin es un punto de corte de
umbral (por ejemplo, 1 si es mayor que un cierto valor):
Pero recordemos que nuestro problema a resolver consiste en ser capaces de dada una
imagen de entrada, obtener las probabilidades de que sea cada uno de los 9 posibles dgito.
Por ejemplo, nuestro modelo podra predecir en una imagen un nueve y estar seguro en
un 80% de que es un nueve, pero asignar un 5% de posibilidades de que sea un ocho (debido
al bucle superior) y asignar una cierta probabilidad de poder ser cualquier otro nmero. Esto
es debido a una cierta incertidumbre por no ser seguro, es decir, no podemos reconocer los
dgitos con un 100% de confianza (confidence). En este caso usar una distribucin de
probabilidades nos puede dar una mejor idea de cunto de confiados estamos de nuestra
prediccin.
Es decir, queremos como vector de salida una distribucin de probabilidad sobre un conjunto
de etiquetas mutuamente excluyentes. Nuestro vector de outputs es de la forma
La regresin softmax se realiza en dos pasos principales. Primero calculamos las evidencias
de que una determinada imagen pertenece a una clase en particular y despus convertimos
estas evidencias en probabilidades de que pertenezca a cada una de las 10 clases. En la
siguiente entrega entramos en ms detalle.
Parte 6
http://jorditorres.org/introduccion-practica-al-deep-learning-con-tensorflow-de-google-parte-
6/
Hoy, en esta sexta entrega de la introduccin prctica al Deep Learning con TensorFlow
de Google (primera entrega, segunda entrega, tercera entrega, cuarta entrega, quinta
entrega) vamos a presentar un poco de teora para poder entender cmo se construye un
modelo que nos permita reconocer las imgenes MNIST.
La regresin softmax se realiza en dos pasos principales. Primero calculamos las evidencias
de que una determinada imagen pertenece a una clase en particular y despus convertimos
estas evidencias en probabilidades de que pertenezca a cada una de las 10 clases.
Para medir la evidencia de que una determinada imagen pertenece a una clase en particular,
una aproximacin muy usada consiste en realizar una suma ponderada de las intensidades de
los pxeles. El peso es negativo si ese pxel que tiene una alta intensidad es evidencia en
contra de la imagen de estar en esa clase, y positivo si es evidencia a favor.
Para explicarlo con un ejemplo grfico supongamos que disponemos del modelo aprendido
para el nmero cero (ms adelante veremos cmo se aprenden estos modelos). Por el
momento podemos ver un modelo como algo que contiene informacin para saber si un
nmero es de una determinada clase. En este caso hemos escogido un modelo como el que
presentamos a continuacin, donde el rojo (en b/n es el gris ms claro) representa pesos
negativos (es decir reducir la evidencia de que pertenece), mientras que el azul (en b/n es el
gris ms oscuro) representa los pesos positivos.
Imaginemos una hoja en blanco de 2828 pixels y trazamos un cero en ella. En general el trazo
de nuestro cero caera sobre la zona azul (recordemos que en la segunda entrega comentamos
que las imgenes haban sido normalizadas a 2020 pixels y posteriormente centradas a una
imagen de 2828).
Resulta intuitivamente bastante claro que si nuestro trazo pasa por encima de la zona roja, lo
ms probable es que no estemos trazando un cero (recordemos que los nmeros estn
centrados en el juego de pruebas). Por tanto usar una mtrica basada en sumar si estamos en
zona azul y restar si nuestro trazo pasa por zona roja puede parecer razonable.
Imaginemos que trazamos un tres, est claro que la zona roja del centro del anterior modelo de
referencia va a penalizar la mtrica del sumario antes mencionada. Pero en cambio, si el
modelo de referencia es el siguiente
podemos observar que en general, los diferentes posibles trazos que representan a un tres se
mantienen en la zona azul. En este caso el trazado de un cero quedara en parte en zona
roja. Espero que el lector, viendo estos dos casos concretos, pueda ver como la aproximacin
de los pesos indicados anteriormente nos permite hacer una estimacin de qu nmero se
trata.
El siguiente diagrama muestra los pesos de un ejemplo concreto de modelo aprendido (ms
adelante veremos cmo se aprenden estos modelos) para cada una de estas diez clases del
MNIST. Recordemos que hemos escogido el rojo en esta representacin visual de los pesos
negativos, mientras que usaremos el azul para representa los pesos positivos.
De manera ms matemtica podramos expresar que la evidencia para una clase i dado un
input x se puede calcular como:
donde i indica la clase (en nuestro caso entre 0 y 9), j es un ndice para sumar a lo largo de los
pixels de nuestra imagen de entrada x, y finalmente Wi representa los pesos anteriormente
mencionados.
Recordemos que en general los modelos incluyen un parmetro extra que representa el sesgo
(bias en ingls) indicando un cierto marge de incertidumbre. En nuestro caso la frmula final
quedara como:
donde bi representa este sesgo descrito (ms adelante volveremos en ms detalle sobre este
parmetro).
Recordemos que hemos comentado que el segundo paso consista en calcular unas
probabilidades. En concreto se trata de convertir el recuento de evidencias en probabilidades
predichas, que indicaremos con la variable y, usando la funcin softmax:
A diferencia del ejemplo de la neurona del apartado anterior que el output era una funcin lineal
con valor 0 o 1, ahora requerimos que el vector de output sea una distribucin de probabilidad
que la suma de todos sus componentes sume 1. Para conseguir normalizar cada componente
de tal manera que sume 1, la funcin softmax usa el valor exponencial de sus entradas y
luego las normaliza como se muestra en la siguiente expresin:
El efecto que se consigue con el uso de exponenciales es que una unidad ms de evidencia
tiene un efecto multiplicador en el peso. Y a la inversa, una unidad menos de evidencia
significa que una hiptesis obtiene una fraccin de su peso anterior. A la
vez softmax normaliza estos pesos, de modo que sumen uno, formando una distribucin de
probabilidad vlida.
Lo interesante de esta funcin es que una buena prediccin tendr una sola entrada en el
vector con valor cercano a 1, mientras que las entradas restantes estarn cerca de 0. En
una prediccin dbil tendrn varias etiquetas posibles, que tendrn ms o menos la misma
probabilidad.
De forma grfica podramos pintar la funcin softmax de la siguiente forma, aunque en el caso
de MNIST tendra 10 variables de entrada y salida.
Para cada variable de salida yi, se calcula la suma ponderada de las entradas xs, se suma el
sesgo, y luego se aplicar softmax. Si lo escribimos en forma de ecuaciones tendramos (para
este ejemplo de 3):
Y finalmente lo podemos reescribir en este formato que usamos en clase de multiplicacin de
matrices y suma de vector:
import tensorflow tf
A partir de este momento podemos empezar a especificar como ser nuestro modelo.
En realidad Tensorflow nos permite en lenguaje Python describir las operaciones que
queremos realizar. A partir de aqu el crear un grafo interno de estas operaciones y
las interacciones entre estas que ser usado durante la ejecucin de todas las operaciones.
Una vez finalizada toda la especificacin es cuando Tensorflow empieza a ejecutar todas las
operaciones. Remarcar que esto se hace totalmente fuera del contexto de Python. Ms
adelante ya hablaremos de esta pieza tan importante como es el grafo, pero por ahora
podemos avanzar sin entrar en ms detalle.
Primero empecemos a ver cmo se pueden definir variables simblicas para poder
manipularlas durante la ejecucin del programa. Podemos hacerlo de la siguiente manera:
W = tf.Variable(tf.zeros([784,10]))
b = tf.Variable(tf.zeros([10]))
Se crean estas Variables dando a tf.Variable el valor inicial de la variable, que en este caso se
inician con ceros, puesto que como se va a aprender el valor de W y b, no es muy no importa
mucho cual es el valor inicial. Debemos fijarnos que W tiene una forma de [784, 10] porque
queremos multiplicar el vector de imagen de 784 dimensiones por cada clase de 10
dimensiones, para producir un vector de evidencias. Por otro lado b tiene la forma de [10]
puesto que debemos sumar cada una de sus componentes a las componentes respectivas de
la variable de output. La forma de expresarlo en TensorFlow es:
y = tf.nn.softmax(tf.matmul(x,W) + b)
Una vez tenemos la implementacin del modelo debemos pasar a encontrar los pesos y
sesgos de la red mediante lo que se conoce como algoritmo de training. Para entrenar una red
neuronal hay varios algoritmos disponibles que buscan un peso ptimo para los parmetros de
cada neurona mediante iteraciones (tambin conocidas como epochs). Para cada iteracin, el
algoritmo de training vuelve a coger los datos de entrenamiento, aplica la red neuronal y
compara el resultado obtenido con el esperado.
Con el fin de entrenar a nuestro modelo y saber cundo ya tenemos un buen modelo, tenemos
que definir de alguna manera lo que significa que el modelo sea bueno. Lo que se
hace habitualmente es definir lo contrario, es decir calcular lo malo que es ese modelo con
funciones de coste (cost) o prdida (loss). En este caso el objetivo es intentar conseguir valores
de los parmetros W y b que minimicen el valor de la mtrica que indica cuan malo es el
modelo.
Hay diferentes mtricas del grado de error entre salidas calculadas y las salidas deseadas de
los datos de entrenamiento. Una medida comn de error es el conocido error cuadrtico medio
(mean squared error). Sin embargo, hay algunos resultados de las investigaciones que
sugieren utilizar otras mtricas diferentes para estas redes neuronales. Un ejemplo puede ser
el llamado error de entropa cruzada (cross entropy error) y es el que usaremos en nuestro
ejemplo. Esta mtrica se define como:
y_ = tf.placeholder("float", [None,10])
cross_entropy = -tf.reduce_sum(y_*tf.log(y))
Primero se calcula el logaritmo de cada elemento y con tf.log y despus se multiplica por cada
elemento y_ . Finalmente, tf.reduce_sum suma todos los elementos del tensor (un detalle: ms
adelante veremos que se mira por paquetes las imgenes, y en este caso el valor de cross-
entropy corresponde a la suma de las cross-entropies de las imgenes y no a la de una sola).
Para entrenar una red neuronal hay varios algoritmos disponibles en la literatura. Todos estos
algoritmos buscan los pesos ptimos para cada neurona. Esto lo hacen mediante iteraciones
(tambin conocidas como epochs). Para cada iteracin, el algoritmo de training vuelve a coger
los datos de entrenamiento, aplica la red neuronal y compara el resultado obtenido con el
esperado.
Este mtodo se usa conjuntamente con algn mtodo de optimizacin como puede ser
el gradient descent, que mediante el clculo del gradiente de la funcin de error nos permite ir
calculando el mnimo error en cada iteracin de acuerdo a la informacin local que se
dispone . Dado el carcter introductorio de este tutorial no entraremos en detalle de estos
mtodos, pero intuitivamente consiste en cambiar el valor de cada variable un poquito
(expresado con un parmetro llamado learning rate) en la direccin que reduce la funcin de
error.
train_step = tf.train.GradientDescentOptimizer(0.01).minimize(cross_entropy)
Solo nos falta un paso final antes de empezar, especificar la inicializacin de todas las
variables:
init = tf.initialize_all_variables()
A continuacin veremos cmo lanzar la ejecucin, pero antes echemos un vistazo rpido a la
estructura interna de Tensorflow. TensorFlow representa la computacin en forma de grafo,
donde los nodos del grafo se llaman ops (diminutivo de operaciones) que reciben y se envan
datos entre ellos en forma de Tensors. En este contexto se puede entender que en realidad,
cuando TensorFlow recibe la lnea de cdigo anterior
train_step = tf.train.GradientDescentOptimizer(0.01).minimize(cross_entropy)
lo que hace es aadir una nueva operacin al grafo interno que tiene, adems de todo lo
necesario para implementar el backpropagation y el gradientdescent. Entonces se devuelve
una simple operacin que, cuando se ejecuta, va a realizar un paso del entrenamiento
del gradientdescent, ajustando ligeramente las variables para reducir la mtrica de error o
coste definida.
Empecemos lanzando la ejecucin de nuestro modelo definido creando primero una sesin:
sess = tf.Session()
sess.run(init)
A partir de este momento ya podemos entrenar nuestro modelo. Por ejemplo supongamos que
lo queremos ejecutar 1.000 veces:
for i in range(1000):
batch_xs, batch_ys = mnist.train.next_batch(100)
sess.run(train_step, feed_dict={x: batch_xs, y_: batch_ys})
En la primera lnea del bucle se especifica que en cada paso de este bucle se coge un lote de
100 datos escogidos al azar del conjunto de datos de entreno. Podramos usar todos los datos
en cada iteracin pero para hacer ms rpido este primer programa usamos solo un pequeo
conjunto en cada iteracin. En la segunda lnea se indica que se ejecute train_step indicndole
que los datos ledos anteriormente alimenten a los respectivos placeholders.
Finalmente nos queda valorar cuan bueno es el modelo. Primero vamos a averiguar dnde
predijimos la etiqueta correcta. tf.argmax es una funcin muy til que retorna el ndice de la
entrada ms alta en un tensor lo largo de un eje. Por ejemplo, tf.argmax (y, 1) es la etiqueta de
nuestro modelo que es ms probable para cada entrada, mientras que tf.argmax (y_, 1) es la
etiqueta correcta. Podemos utilizar tf.equal comprobar si nuestra prediccin coincide con la
verdad:
Esto nos retorna una lista de booleanos. Para determinar que fraccin es correcta, podemos
pasarlos nmeros en coma flotante y entonces calcular la media.
Por ejemplo, [True, False, True, True] se convertirn en [1,0,1,1] que la media
sale 0.75 y que representa el porcentaje de exactitud (accuracy). Ahora podemos pedir
la accuracy de en nuestro datos de test.
A m me ha salido un valor alrededor del 91%. This should be about 91%. Son buenos estos
resultados? Yo creo que fantsticos porque esto significa que ya se ha programado y ejecutado
su primera red neuronal con TensorFlow. Otra cosa es que hay modelos que permiten mejorar
la accuracy mucho ms. Pero esto ya lo dejamos para ms adelante. Qu les parece?
Apndice: Cdigo:
import input_data
mnist = input_data.read_data_sets("MNIST_data/", one_hot=True)
import tensorflow as tf
x = tf.placeholder("float", [None, 784])
W = tf.Variable(tf.zeros([784,10]))
b = tf.Variable(tf.zeros([10]))
y = tf.nn.softmax(tf.matmul(x,W) + b)
y_ = tf.placeholder("float", [None,10])
cross_entropy = -tf.reduce_sum(y_*tf.log(y))
train_step = tf.train.GradientDescentOptimizer(0.01).minimize(cross_entropy)
init = tf.initialize_all_variables()
sess = tf.Session()
sess.run(init)
for i in range(1000):
batch_xs, batch_ys = mnist.train.next_batch(100)
sess.run(train_step, feed_dict={x: batch_xs, y_: batch_ys})
correct_prediction = tf.equal(tf.argmax(y,1), tf.argmax(y_,1))
accuracy = tf.reduce_mean(tf.cast(correct_prediction, "float"))
print sess.run(accuracy, feed_dict={x: mnist.test.images, y_:
mnist.test.labels})
Parte 8
http://jorditorres.org/introduccion-practica-al-deep-learning-con-tensorflow-de-google-parte-
8/
Hoy, en esta octava entrega de la introduccin prctica al Deep Learning con TensorFlow
de Google (primera, segunda , tercera, cuarta, quinta, sexta, sptima) finalizo con esta
serie de posts.
Hoy, para acabar, aadir una breve reflexin sobre la necesidad que al lado de cualquier
cientfico de datos (Data Scientist) se requiere un buen ingeniero de computadores (Computer
Engineer) y otro ingeniero de datos (Data Enginyeer), en todo este proceso de extraccin de
valor del Big Data mediante analticas avanzadas.
Hasta aqu hemos hablado de las herramientas de analtica avanzada, poniendo un ejemplo de
cdigo en TensorFlow. Sin duda son herramientas fundamentales y la clave de la nueva era de
computacin que se avecina: Computacin Cognitiva (o Cognitive Computing). Pero como ya
hemos dejado claro, sin unos sistemas de computacin de altas prestaciones que permitan
ejecutar estos potentes algoritmos nada seria posible. Sin duda los conocimientos de
los ingenieros de computadores son esenciales, (y especialmente los formados en
Barcelona), para poder crear y manejar estos nuevos sistemas de computacin que
presentbamos en la entrega 2.
Pero falta comentar una pieza importante en este puzle: los frameworks de Big
Data que permiten simplificar la manipulacin y el procesado de los datos en procesos
de anlisis, sin ellos sera totalmente imposible aplicar la analtica avanzada a las ingentes
cantidades de datos que se analizan hoy en da.
En los ltimos aos hemos sido testigos de la llegada de una oleada de nuevos frameworks Big
Data alrededor de los dos entornos de procesamiento distribuido ms populares en estos
momentos, Hadoop y Spark, acompaados de una amplia variedad de bases de datos NoSQL.
Cada herramienta tiene sus propias fortalezas y debilidades, y no hay una solucin de talla
nica para todos para cada caso de uso.
La comprensin de estas tecnologas y cmo encajan juntas puede ser uno de los mayores
retos para alguien nuevo en el campo de datos. Adjunto pueden encontrar un esquema que
uso en mis clases en la UPC (cada semestre se tiene que actualizar! ) donde se
enumero (intentando agrupar por categoras) las diferentes alternativas que tenemos (las ms
conocidas, hay ms, no, muchas ms!) cuando montamos un sistema completo para tratar un
problema Big Data real.
El lector puede intuir la complejidad de una buena eleccin, incluso para un ingeniero de datos.
El lector se habr dado cuenta que no es trivial decidir cual es el mejor entorno para un
problema concreto, y que tampoco es fcil lidiar con cada una de sus piezas al juntarlas todas
juntas. Supongo que a estas alturas a nadie le queda la menor duda de la necesidad de
disponer de ingenieros de datos (Data Engineer) en el equipo al lado de cientficos de
datos (Data Scientist) expertos en algoritmos de analtica avanzada y ingenieros de
computadores (Computer Engineer) para conseguir un alto rendimiento de los sistemas tanto
a nivel hardware como software.
Para poner un nombre que lo englobe todo se usa el trmino de High-Performance Big-Data
Analytics para referirnos a la integracin de lo ms avanzado en conocimiento de Analtica,
con los nuevos frameworks Big Data y con la impresionante potencia que presenta el hardware
de los nuevos sistemas de computacin. Este trabajo conjunto ser la clave que nos permita
sacar valor de grandes volmenes de datos con una gran variedad de tipos a una velocidad sin
precedentes hasta ahora.
Estamos ante un reto que requiere un conocimiento multidisciplinar. Los que me conocen ya
me habrn visto dibujar en la pizarra o sobre un papel este esquema que resume de lo que
estamos hablando:
Una buena opcin es que cada uno de los miembros del equipo pudiera hacer una marathon
sprint por su cuenta y a la vez poder conseguir un buen resultado en una (solo una) de las tres
disciplinas en una ironman. Yo lo he conseguido! Para mi el Data Scientist es el nadador,
el Data Engineer el corredor y el Computer Engineer el ciclista . Y para ustedes, lo han
probado? Se lo recomiendo!
Con este pequeo tutorial de ocho entregas espero haber contribuido con mi granito de arena a
que los Data Engineers entendamos un poquito ms a los Data Scientists, tipos que hablan
un poco raro para un ingeniero de computacin como yo, al menos mis amigos cientficos de
datos!
Si el lector quiere avanzar un poco ms, aprendidas estas ideas bsicas aqu expuestas, les
propongo que continen con el tutorial de TensorFlow website con estos apartados:
En estos momentos existe muy escasa informacin de TensorFlow y creo que esta es la mejor
material de consulta disponible en este momento (si alguien encuentra una informacin ms til
e interesante le agradecera muchsimo que me lo indicara). Si estn interesados en detalles de
implementacin de TensorFlow les propongo que miren el artculo Large-Scale Machine
Learning on Heterogeneous Distributed System.
A partir del prximo febrero empezarn las actividades de un nuevo meetup en Barcelona
dedicado a TensorFlow a travs del cual pueden seguir los avances de esta tecnologa: http://w
ww.meetup.com/Barcelona-TensorFlow-Meetup/
Finalmente comentar que estoy pensando poner en orden varias de mis notas sobre el
tema. El escribir esta serie de posts me ha sido muy til y me gustara hacerlo con el resto de
notas que tengo. Les ir informando!
Espero que les parezca interesante esta ltima entrega de la Introduccin prctica al Deep
Learning con TensorFlow de Google.
Autor:
Professor JORDI TORRES | UPC Barcelona Tech & Barcelona Supercomputing Center