{"id":1499,"date":"2019-02-14T15:45:06","date_gmt":"2019-02-14T14:45:06","guid":{"rendered":"https:\/\/evenbytes.com\/?p=1499"},"modified":"2019-02-14T15:45:07","modified_gmt":"2019-02-14T14:45:07","slug":"construccion-de-un-modelo-de-machine-learning-usando-tensorflow-parte-2","status":"publish","type":"post","link":"https:\/\/evenbytes.com\/es\/construccion-de-un-modelo-de-machine-learning-usando-tensorflow-parte-2\/","title":{"rendered":"Construcci\u00f3n de un modelo de Machine Learning usando TensorFlow (parte 2)"},"content":{"rendered":"\n<p>Una vez preparado los datos de entrenamiento, llega la parte entretenida, programar nuestro modelo. Pero para ello empezar necesitamos elegir primero una herramienta que nos permita ejecutar el c\u00f3digo Python, aunque Python nos ofrece su propio compilador, en mi caso al no tener un ordenador con una tarjeta gr\u00e1fica lo suficientemente buena para entrenar el modelo de Machine Learning, he decidido utilizar una herramienta online que nos proporciona Google de forma totalmente gratuita llamada Google Colaboratory para esta labor. Este producto de Google est\u00e1 totalmente integrada en la nube y no consumir\u00e1 nada de nuestro CPU. Adem\u00e1s de ofrecer una GPU o TPU sin coste alguno que nos permitir\u00e1 acelerar nuestro proceso de entrenamiento para el modelo. <\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh6.googleusercontent.com\/o5ZGcpG8gKfm72EUZzXnxJ0dAoKvgtMx5qPU2HWq3ehfHMW9Uadnuz7ovuX8THhzJEwb7Dvf63QIZBaPf956WRP_AldQpmV7_vyahdslUsQ7d1-QY6aOEf0LLSodQFAMoxzdK0Hq\" alt=\"\"\/><figcaption><br><\/figcaption><\/figure>\n\n\n\n<p>Cabe mencionar que las TPU o tambi\u00e9n conocidas como Tensor Processing Unit, son unas unidades de procesamiento dedicadas especialmente al entrenamiento de modelos en TensorFlow, sin embargo en mi ejemplo usaremos las GPU ya que son las m\u00e1s comunes y las m\u00e1s sencillas de usar.<br><\/p>\n\n\n\n<p>Ahora si, es el momento de programar. Para ello accedemos a nuestro cuaderno vac\u00edo de Google Colab y accedemos al men\u00fa de editar y configuramos el cuaderno, yo para mi ejemplo he usado como entorno Python 2 y GPU como hardware de aceleraci\u00f3n.<br><\/p>\n\n\n\n<p>Una vez definido el entorno, necesitamos instalar la librer\u00eda de Tensorflow y las dependencias para poder ejecutarla.<br><\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh4.googleusercontent.com\/DPW6YIB471-b0S9N9KEqJNYkAQ2pNYuy4G_qJQFC_uJ4Ota2FIPeqQJGUUI5lYOGDujddl-hLGN056YEYall0zCzZfljpfks01oEa11Nq_o2BBvMYWTE7m9KsyNA-_cpjTIM2tEN\" alt=\"\"\/><\/figure>\n\n\n\n<p>Con las dependencias instaladas, el siguiente paso es cargar nuestros datos de entrenamiento en el cuaderno y para ello tenemos dos formas una mediante Google Drive o la de subir el archivo zip directamente desde nuestro ordenador local, yo para automatizar el proceso, he subido mis datos a Drive y lo he descargado utilizando la librer\u00eda que posee Python para bajarse los archivos de Drive, y una vez descargado se descomprime el archivo con la librer\u00eda zipFile.<br><\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh5.googleusercontent.com\/De3oFFIbDpF3qgYt2RO_DrWk4wx6YEnUTlGrvALz4jlYMNSX93Vh38MO_aIvT4NrprtrpmyK5vVVukwp_NF7cOQjuN--UFyvM-sz5WX8gdBljaQczBY98yQRX-iWD8tOAG0U0MYq\" alt=\"\"\/><\/figure>\n\n\n\n<p>Con los datos ya cargados y la librer\u00eda de TensorFlow podemos generar los archivos TFRecord para entrenar el modelo, estos archivos son los \u00fanicos que entiende TensorFlow y por tanto son imprecindibles para poder entrenar nuestor modelo, ya que contiene toda la informaci\u00f3n de los datos de entrenamiento que ser\u00e1n utilizados por el modelo para ser entrenado. <br><\/p>\n\n\n\n<p>As\u00ed que para generar estos archivos tenemos que escoger uno de los varios scripts que nos ofrece Tensorflow para crearlos, en mi ejemplo he usado create_pet_tf_record.py. Para generar los archivos solamente hace falta ejecutar al script en el cuaderno como si fuese un comando de la terminal con los p\u00e1rametros necesarios:<br><\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh4.googleusercontent.com\/DNJX2tk8AcFc_EIxefYlfCp_x_joeA7qmMnZvi2KmxvAsbrur12RjMSGXK_Gm1zfFDxbZ2alEfcJsweXkIzujTaFwwLQlBvTBmbXbH2YLTUa4ePfFBGWrfhwT5CoU9Ngz0G-GOwP\" alt=\"\"\/><\/figure>\n\n\n\n<p>Este comando nos generar\u00e1 dos archivos, <em>pet_faces_train.record-00000-of-00001<\/em> y <em>pet_faces_val.record-00000-of-00001<\/em>, el nombre del archivo es est\u00e1ndar debido al script pero podemos renombrarlos a lo que queramos, yo en mi ejemplo los he renombrado a train.record y val.record.<br><\/p>\n\n\n\n<p>Ahora que tenemos todos los archivos para la entrada, a\u00fan necesitamos el modelo a ser entrenado. Lo normal ser\u00eda crear un modelo desde cero definiendo las capas y entrenarlo con nuestros propios datos. Pero este proceso nos llevar\u00eda d\u00edas o incluso semanas dependiendo de la cantidad de datos que hayamos recolectado. Por ello, para agilizar el proceso, he escogido uno de los modelos ya entrenados que nos proporciona TensorFlow, llamado faster_rcnn_inception_v2, que ya ha sido entrenado con millones de im\u00e1genes reales y que solamente necesitaremos re entrenarlo con los nuevos datos y adaptar la salida para la tarea que nosotros queremos.<br><\/p>\n\n\n\n<p>Por lo que solamente necesitamos descargar el archivo de configuraci\u00f3n del modelo y cambiarle los archivos de entrenamiento para entrenar nuestro propio modelo.<br><\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh6.googleusercontent.com\/jQZ7BPoVsGoB_kwDvA5t2DSqt9vlPbH8DWzFKNqJsN5geJWWGlmfSLwQKLjVCKu6LYd2U5xe7PwjVy1l80aCA608fwlyjJI76-lc5JYWidxfVHQNY103XhbJndOVOdDcHKs-zp_W\" alt=\"\"\/><\/figure>\n\n\n\n<p>Teniendo el modelo pre-entrenado y los archivos TFRecord, ha llegado el momento de entrenar nuestro modelo. Al igual que hemos hecho para generar los archivos TFRecord, TensorFlow tiene un script que facilita el entrenamiento del modelo nuevo donde solamente tiene que modificar los par\u00e1metros de entrada.<br><\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh6.googleusercontent.com\/ZYPo23Nh41JK4AEQ0h1ySOJzbCO7ONERN1qHJz-2hbSS-Hks7xhLPHSpjFMP1WO4ESj9HsjOz2_BYW2cochHE__m6mV5GzV5ueSIrQt3yzGzKVei6Ros5cCFBIYdxEKKmkNd7KI0\" alt=\"\"\/><\/figure>\n\n\n\n<p>El proceso de entrenamiento puede llevar un buen rato dependiendo de la cantidad de datos por lo que pod\u00e9is a tomar un caf\u00e9 mientras tanto. Una vez que haya terminado el entrenamiento TensorFlow nos mostrar\u00e1 la precisi\u00f3n media de nuestro modelo con datos de prueba. Y en caso de que no sea muy alta deber\u00edamos re-entrenar el modelo con m\u00e1s datos.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh4.googleusercontent.com\/L9nc5DLVsltMOsoAFsdq4G91Wmu5bM5lnVUVyUGp9qG-e9RD3jFMLxec_4x79OiZCX8tHSmIiC5lJL6CwPqB0mGw1HsZ13IpP486C8ywJsskHHlOb6dUhAiFmCNkBJ54Rfs-jWKn\" alt=\"\"\/><\/figure>\n\n\n\n<p>Despu\u00e9s de varios intentos intentando subir la precisi\u00f3n, lo m\u00e1ximo que he logrado ha sido un 95% que para los modelos actuales es bastante alta ya. Por lo que podemos ya pasar a la fase de prueba.<br><\/p>\n\n\n\n<p>Primero tenemos que exportar el modelo para obtener los pesos y el grafo del modelo que nos servir\u00e1 para la clasificaci\u00f3n de im\u00e1genes.<br><\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh4.googleusercontent.com\/AK5T_utzjrE1uqtfe_U16nRvyH9iWVxDMgli4pvTl7zp7_kWKIbvoNvFPBSOIlQKYqST121iTLK6UiaafI_y3DEq9Dp2NL58Rd1P0hYPKWF9fHm02upy5rXxsMh5iVawyWS_DVgY\" alt=\"\"\/><\/figure>\n\n\n\n<p>Una vez exportado, lo siguiente es cargar los ficheros del nuevo modelo en el cuaderno, adem\u00e1s del archivo label_map.pbtxt que creamos al principio del art\u00edculo para clasificar los distintos objetivos.<br><\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh6.googleusercontent.com\/8eUXyqY0UZrKVPh7M6qD3SOlYpHglQmxW9unUHtMBlFzHaOHyUHP_pXve2euDhLPc4yQyxEwKfFMs2MblX1EaLwta0G7Jh9IWGbOkf0D0ZChMrgnQRhTcVezj9zOFExHKcHWIEXu\" alt=\"\"\/><\/figure>\n\n\n\n<p>Ya con el modelo cargado, ha llegado el momento que todos esperamos, \u00bffuncionar\u00e1 bien?, para comprobarlo voy a usar una imagen aleatoria que he encontrado en Google y lo he cargado en el cuaderno con la librer\u00eda Image.<br><\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh4.googleusercontent.com\/GdgKDEH9eBqhhBrJBHJBPNShD4LzIuZFf0Ds19IzLJgAv-L2NnhSO4qysYwVcRBnyX_lRTAdsPKjYTy8GQJr8E0VSVsnJs_bxleut84Mo7yg9YOVuX9btSSkS_e_0yjoA69qMYKt\" alt=\"\"\/><\/figure>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh4.googleusercontent.com\/fzAmmtp7jk0dwtgvD19aZYVG3R_doIDslD_WRvv-S-hygX81vMLyS7tBRpHf-0rrf8MN4wAXGKhGRM9zBaDehQQlbkjb7MBRqr3bEgivWCChnvwNqg2aQayBJEzW-maYhrDXbjym\" alt=\"\"\/><\/figure>\n\n\n\n<p>Para clasificar lo que aparece en esta foto voy a crear un m\u00e9todo que mostrar\u00e1 los diferentes objetivos que se encuentran en la imagen.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh5.googleusercontent.com\/QQTbTubXCavIj0DmGnrdakEmb8uJQZtBqM7Rxq7VkHMHHxBKtzjZVJKSqnxwiHn8KwY2lmmiKz04ydlEERlu2iw7wOIFLujpQ9OLpxyRUUDZ-t2X8Ass9afYRvQDLHFZ5B5vaCPP\" alt=\"\"\/><\/figure>\n\n\n\n<p>Y despu\u00e9s de tanta espera, el resultado final ha sido \u2026\u2026<br><\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh5.googleusercontent.com\/KpAXv0XYIspaCWj9blKltwTv51-W2McYzd1xq7-JScA94FHG6a4lSmzTtoQgeJESWFtL-5j7uvKNWitUjiZJdg4cAZUAH78f1nuKsSL4B7O9bed5mpacIAtLzNXxZ74LVUeC4spe\" alt=\"\"\/><\/figure>\n\n\n\n<p>Podemos observar que nuestro modelo ha acertado con 99% de seguridad que es un humano y con un 68% y 98% respectivamente que hay dos monos. Pero en la imagen si nos fijamos bien hay 3 monos, por lo que nuestro modelo ha fallado en detectar a este tercero. Esto ha sido a causa de que al ser tan parecidos y estar uno encima del otro el modelo no ha sido capaz de diferenciar ambos por la falta de datos de entrenamiento con ejemplos parecidos o donde se produzcan casos que no tenemos en nuestros datos iniciales.<br><\/p>\n\n\n\n<p>Con esto podemos concluir que, aunque nuestro modelo no haya logrado clasificar totalmente la imagen, tiene una precisi\u00f3n bastante alta para los casos generales donde se diferencian bien al individuo, pero que a\u00fan as\u00ed, se puede mejorar m\u00e1s a\u00f1adiendo nuevos datos y situaciones diferentes para que nuestro modelo reconozca m\u00e1s casos, ayudando as\u00ed a elevar a\u00fan m\u00e1s la precisi\u00f3n.<\/p>\n\n\n\n<p><a href=\"https:\/\/evenbytes.com\/es\/construccion-de-un-modelo-de-machine-learning-usando-tensorflow-parte-1\/\">VOLVER A VER LA PARTE 1<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Una vez preparado los datos de entrenamiento, llega la parte entretenida, programar nuestro modelo. Pero para ello empezar necesitamos elegir primero una herramienta que nos permita ejecutar el c\u00f3digo Python, aunque Python nos ofrece su propio compilador, en mi caso al no tener un ordenador&#8230;<\/p>\n","protected":false},"author":2,"featured_media":1495,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[55,83],"tags":[86,84,85],"class_list":["post-1499","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-develop-es","category-machine-learning","tag-ia","tag-machine-learning","tag-tensorflow"],"_links":{"self":[{"href":"https:\/\/evenbytes.com\/es\/wp-json\/wp\/v2\/posts\/1499","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/evenbytes.com\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/evenbytes.com\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/evenbytes.com\/es\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/evenbytes.com\/es\/wp-json\/wp\/v2\/comments?post=1499"}],"version-history":[{"count":1,"href":"https:\/\/evenbytes.com\/es\/wp-json\/wp\/v2\/posts\/1499\/revisions"}],"predecessor-version":[{"id":1500,"href":"https:\/\/evenbytes.com\/es\/wp-json\/wp\/v2\/posts\/1499\/revisions\/1500"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/evenbytes.com\/es\/wp-json\/wp\/v2\/media\/1495"}],"wp:attachment":[{"href":"https:\/\/evenbytes.com\/es\/wp-json\/wp\/v2\/media?parent=1499"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/evenbytes.com\/es\/wp-json\/wp\/v2\/categories?post=1499"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/evenbytes.com\/es\/wp-json\/wp\/v2\/tags?post=1499"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}