<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="3.9.0">Jekyll</generator><link href="https://ricardoamata.github.io/feed.xml" rel="self" type="application/atom+xml" /><link href="https://ricardoamata.github.io/" rel="alternate" type="text/html" /><updated>2021-08-21T20:14:15-07:00</updated><id>https://ricardoamata.github.io/feed.xml</id><title type="html">ricardoamata</title><subtitle>An amazing website.</subtitle><author><name>Ricardo E. Alvarado Mata</name></author><entry><title type="html">Sistemas de recomendaciones basados en contenido</title><link href="https://ricardoamata.github.io/Sistemas-recomendadores-basados-en-contenido/" rel="alternate" type="text/html" title="Sistemas de recomendaciones basados en contenido" /><published>2019-12-22T00:00:00-07:00</published><updated>2019-12-22T00:00:00-07:00</updated><id>https://ricardoamata.github.io/Sistemas-recomendadores-basados-en-contenido</id><content type="html" xml:base="https://ricardoamata.github.io/Sistemas-recomendadores-basados-en-contenido/">&lt;p&gt;Existen diversos métodos y estrategias utilizados a la hora de crear sistemas de recomendaciones, estos buscan hacer recomendaciones de ítems a usuarios ya sea con el fin de que interactúen con ellos, se trate de un video, una canción, una película, un producto etc. En este blog explicare varias formas en que se puede construir un sistema que recomiende dichos ítems a los usuarios, hablaré un poco del panorama general pero me centraré más en explicar aquellos sistemas que toman en cuenta las características de los items para hacer la recomendación.&lt;/p&gt;

&lt;p&gt;&lt;a title=&quot;Recomendaciones&quot; href=&quot;/images/recomendaciones.png&quot;&gt;
    &lt;img src=&quot;/images/recomendaciones.png&quot; alt=&quot;Recomendaciones&quot; /&gt;
&lt;/a&gt;&lt;/p&gt;

&lt;h2 id=&quot;qué-es-un-sistema-de-recomendaciones&quot;&gt;¿Qué es un sistema de recomendaciones?&lt;/h2&gt;

&lt;p&gt;Podríamos definir un sistema de recomendaciones como aquel que se encarga de hacerle sugerencias a los usuarios acerca de con que items del sistema interactuar, estos ítems pueden ser cualquier cosa, un vídeo, un blog, un post, un producto, etc.&lt;/p&gt;

&lt;p&gt;La forma más fácil de recomendar algo a un usuario es simplemente recomendado lo más popular, pero claro aquí estamos ignorando cualquier variable salvo que tan popular es un ítem, por lo tanto estamos recomendando lo mismo a todos los usuarios, esto puede funcionar en ciertas ocasiones, como cuando no tenemos muy poca información de un usuario, pero no es lo ideal, ya que cada quien tiene gustos diferentes y lo que es una buena recomendación para una persona puede no serlo para otra.&lt;/p&gt;

&lt;p&gt;Es en esos casos donde entran los algoritmos de aprendizaje, que nos permiten tomar datos datos de nuestros usuarios y los ítems del sistema y hacer recomendaciones más personalizadas para cada quien.&lt;/p&gt;

&lt;p&gt;Existe una gran variedad de metodos para hacer recomendaciones, en este blog no hablaremos mucho de ellos pero sí un poco de cada uno, ya que en particular profundizaremos en los basados en contenido, si quieres saber más sobre el panorama general para crear sistemas de recomendación este es un gran post para ello: &lt;a href=&quot;https://towardsdatascience.com/introduction-to-recommender-systems-6c66cf15ada&quot;&gt;Introduction to recommender systems&lt;/a&gt;&lt;/p&gt;

&lt;h2 id=&quot;tipos-de-sistemas-de-recomendación&quot;&gt;Tipos de sistemas de recomendación&lt;/h2&gt;

&lt;p&gt;Existen dos formas principales de crear un sistema de recomendaciones, una es usando el contenido de los ítems y la otra es a base de filtros colaborativos, se dará una breve explicación de la segunda para después profundizar en la primera.&lt;/p&gt;

&lt;h3 id=&quot;filtros-colaborativos&quot;&gt;Filtros colaborativos.&lt;/h3&gt;

&lt;p&gt;&lt;a title=&quot;Moshanin [CC BY-SA 3.0 (https://creativecommons.org/licenses/by-sa/3.0)], via Wikimedia Commons&quot; href=&quot;https://commons.wikimedia.org/wiki/File:Collaborative_filtering.gif&quot;&gt;&lt;img width=&quot;256&quot; alt=&quot;Collaborative filtering&quot; src=&quot;https://upload.wikimedia.org/wikipedia/commons/5/52/Collaborative_filtering.gif&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;en estos filtros tú no utilizas información acerca de los ítems del sistema o de los usuarios, más allá de sus interacciones, aquí se modelan dichas interacciones como una matriz, donde los renglones representan usuarios y las columnas ítems, y cada entrada es una interacción, las cuales pueden ser un megusta o no me gusta, una simple bandera, una calificación, el número de estrellas, el tiempo de interacción, etc. el objetivo es predecir los valores faltantes de la matriz y tomar esas predicciones para escoger ítems adecuados para cada usuario.&lt;/p&gt;

&lt;p&gt;Si tenemos una página donde se pueden leer artículos, y se puede calificar un artículo del uno al diez sería razonable pensar que los mejor es recomendarle al usuario aquellos artículos a los cuales el mismo usuario vaya ponerles una calificación alta, de modo que el primer paso para hacer la recomendación es estimar la calificación que tendrá cada artículo y luego ordenarlos para sugerirle al usuario que vea los que tengan la calificación más alta.&lt;/p&gt;

&lt;p&gt;Si nuestra interacción es un valor booleano, le gusto o no le gusto, entonces quizá lo mejor sea recomendarle aquellos con mayor probabilidad de que le gusten, o tomar una muestra aleatoria de todos los que sea probable que le gusten.&lt;/p&gt;

&lt;p&gt;Para hacer la predicción de cuánto valdrá la interacción existen dos maneras, una es haciendo búsquedas y la otra es utilizando un modelo. Las búsquedas se pueden realizar ya sea buscando usuarios parecidos a nuestro usuario y recomendando items que les haya gustado a esos usuarios, o buscando items similares a los que le gustaron al usuario.&lt;/p&gt;

&lt;p&gt;Si se buscan usuarios similares esto se hace usando las interacciones con otros ítems, si dos personas tienen muchos gustos en común, y a una le gusta algo, probablemente a la otra también le guste esto. Partiendo de esta idea se puede usar alguna métrica sobre los vectores renglones de la matriz de interacciones que representan a los usuarios y buscar a los usuarios más cercanos, luego simplemente recomendamos aquellos ítems que hayan sido popular entre los usuarios cercanos.&lt;/p&gt;

&lt;p&gt;En el caso de buscar ítems parecidos a los que le gustaron a un usuario, se hace lo mismo pero con los vectores columna de la matriz, es decir dos items se parecen mas cuantos mas usuarios en comun tengan.&lt;/p&gt;

&lt;p&gt;Ambas formas tienen sus ventajas y desventajas, por ejemplo que buscar usuarios similares es un método que genera resultados más personalizados, pero también es más sensible cuando hay pocos datos, en cambio buscar items similares genera resultados más personalizados ya que cada ítem está formado por las interacciones múltiples usuarios, que posiblemente no se parecen mucho entre sí.&lt;/p&gt;

&lt;p&gt;Una mejor forma de rellenar los valores faltantes de la matriz sin tener que guardar toda la información de las interacciones es buscar una forma de representar dicha matriz, para lo cual se puede hacer una variante de la descomposición en valores singulares (SVD) generando dos matrices cuyo producto nos da la matriz de interacciones, una de estas matrices representa la información de los usuarios y la otra de los ítems, si la matriz de interacciones tiene dimensiones n x m, estas dos nuevas matrices tienen dimensiones n x h y h x m, donde n es el número de usuarios, m el número de ítems y h el número de características de cada representación. Entonces una matriz está asociada a los usuarios y a los ítems.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://miro.medium.com/max/194/1*2n4LR_G9S3aGZYDFCuNKpA@2x.png&quot;&gt;
    &lt;img width=&quot;125&quot; src=&quot;https://miro.medium.com/max/194/1*2n4LR_G9S3aGZYDFCuNKpA@2x.png&quot; alt=&quot;formula&quot; /&gt;
&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Para encontrar estas dos matrices se pueden escoger dos matrices con valores aleatorios y luego optimizar para que su producto sea igual a los valores conocidos de la matriz de interacciones.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://miro.medium.com/max/737/1*WDlTqvO5Kcc-CDkdKgLwvQ@2x.png&quot;&gt;
    &lt;img width=&quot;470&quot; src=&quot;https://miro.medium.com/max/737/1*WDlTqvO5Kcc-CDkdKgLwvQ@2x.png&quot; alt=&quot;formula&quot; /&gt;
&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;en cada iteración se puede fijar el valor de una matriz y optimizar respecto a la otra. Hay que tomar en cuenta que X&lt;sub&gt;i&lt;/sub&gt; y Y&lt;sub&gt;j&lt;/sub&gt; podrían ser salidas de un regresor binario o softmax, incluso una red neuronal, dependiendo de que tipo de valores tenga la matriz M.&lt;/p&gt;

&lt;h3 id=&quot;sistema-basado-en-contenido&quot;&gt;Sistema basado en contenido&lt;/h3&gt;

&lt;p&gt;En estos se toman las características conocidas de los ítems para recomendar ítems similares a los ítems con los que el usuario ya interactúa, otra alternativa es crear un modelo para predecir dichos ítems. Las características pueden ser palabras claves o tags que se hayan asignado, un texto que funcione de descripción, un género, entre otras cosas. Se modifican las características en vector para poder usar alguna métrica entre vectores y encontrar vectores similares.&lt;/p&gt;

&lt;p&gt;Cuando se decide usar un modelo este puede predecir a qué tipos de usuario le gustara un ítem o que tipos de items le gustaran a un usuario, si decidimos hacer un predictor para cada usuario que recomiende items dadas sus características entonces tendremos tantos predictores como usuarios, si por el contrario queremos que cada ítem tenga un predictor que diga a cuales posibles usuarios sería bueno recomendarlo, entonces tendremos un predictor por ítem.&lt;/p&gt;

&lt;p&gt;El predictor que se escoja depende del tipo de las interacciones, si lo que quieres es saber si a un usuario le gustara un producto entonces lo indicado es hacer una regresión logística, si se quiere predecir el valor de una calificación se tendría que hacer una regresión lineal, incluso se puede usar una red neuronal con el tipo de salida requerido.&lt;/p&gt;

&lt;p&gt;Supongamos que decidimos hacer un sistema de recomendaciones basado en contenido para una pagina que vende celulares, las características podrían ser la marca del celular, el modelo, el año de lanzamiento, las especificaciones técnicas y demás, si nosotros tenemos un regresor lineal para estimar el número de estrellas que un usuario le da a un celular, tendríamos una matriz X de n x v, donde n es el número de usuarios y v es la dimensión del vector de características, nuestros datos serian una matriz Y de v x m donde m es el número de ítems,  y el problema de regresión se podría resolver a&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://miro.medium.com/max/737/1*WDlTqvO5Kcc-CDkdKgLwvQ@2x.png&quot;&gt;
    &lt;img width=&quot;470&quot; src=&quot;https://miro.medium.com/max/737/1*WDlTqvO5Kcc-CDkdKgLwvQ@2x.png&quot; alt=&quot;formula&quot; /&gt;
&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Que es la misma fórmula que teníamos en los filtros colaborativos solo que esta vez Y es una matriz que no cambia, se podría ver como nuestras entradas, y X es la matriz de pesos que queremos ajustar para aquellos valores de M que conocemos. En este caso X&lt;sub&gt;i&lt;/sub&gt; también puede ser la salida de una red neuronal, osea que para cada usuario el predictor sería una red neuronal.&lt;/p&gt;

&lt;h2 id=&quot;algunas-consideraciones&quot;&gt;Algunas consideraciones&lt;/h2&gt;

&lt;p&gt;Tantos los sistemas basados en contenido como los filtros colaborativos sufren del problema del arranque frío (Cold Start Problem), el cual se presenta cuando un usuario o ítem nuevo entra en el sistema, en los sistemas basados en contenido sólo se presenta si se trata de un usuario, ya que no hay información para hacer predicciones, esto puede perdurar incluso después de que se hayan generado datos ya que la cantidad de datos existentes e muy poca.&lt;/p&gt;

&lt;p&gt;Incluso cuando los sistemas basados en contenido sufren menos de este problema ya toman en consideración las características de los ítems y/o los usuarios para hacer la recomendación se pueden ver afectados de cierta manera si lo que se quiere es aprender que items son los favoritos de un usuario.&lt;/p&gt;

&lt;p&gt;Para evitar el arranque frío se puede usar características del usuario, como región, idioma, edad y otras variables para recomendarle items que sean populares para usuarios similares, o simplemente recomendarle los ítems más populares del sistema. Para el caso de los ítems se puede usar características del ítem para que sea recomendado a usuarios a los que les gusto algun item similar en lo que se recolecta datos, o recomendarlo aleatoriamente, aunque esto último no sea tan recomendado. Es justo lo anterior lo que define a los sistemas híbridos, sistemas que combinan lo mejor de los sistemas basados en contenido y los filtros colaborativos, ya sea iniciando con uno cuando hay pocos datos y luego cambiando o promediando los valores de salida, también se puede asignar un peso a cada parte del sistema de modo que se determine cuánta decisión tienen en la recomendación final.&lt;/p&gt;

&lt;h2 id=&quot;pequeña-implementación-de-un-sistema-basado-en-contenido&quot;&gt;Pequeña implementación de un sistema basado en contenido&lt;/h2&gt;

&lt;p&gt;En esta libreta: &lt;a href=&quot;https://github.com/ricardoamata/Proyecto-ML/blob/master/Sistema_recomendador_basado_en_contenido.ipynb&quot;&gt;https://github.com/ricardoamata/Proyecto-ML/blob/master/Sistema_recomendador_basado_en_contenido.ipynb&lt;/a&gt; puedes encontrar una implementación de un sistema basado en contenido para recomendar películas utilizando dos datasets uno es Wikipedia Movie Plots, el cual contiene textos que describen la trama de las películas, el otro es Movie Lens que contiene datos de más de 100 mil usuarios que han calificado más de 25 mil películas con un número del uno al cinco.&lt;/p&gt;

&lt;p&gt;En la libreta lo que se hace es limpiar los textos y luego codificarlos usando el Universal Sentence Encoder, una red neuronal entrenada para codificar textos en vectores densos de 512 tal que textos similares tengan vectores con distancias más cortas a textos que no se parecen. Luego se seleccionaron aquellas películas que estaban en ambos datasets y se procedió a entrenar un regresor lineal para predecir las calificaciones puestas por los usuarios que tienen las películas. El error de entrenamiento fue de 5.2074 y el error de prueba fue de 5.25, bastante cercanos, por lo que creo que con una red neuronal sería posible alcanzar mejores resultados.&lt;/p&gt;

&lt;p&gt;algunos ejemplos de predicciones de calificaciones hechas por una muestra aleatoria de usuarios:&lt;/p&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th style=&quot;text-align: center&quot;&gt;Real&lt;/th&gt;
      &lt;th style=&quot;text-align: center&quot;&gt;Predicción&lt;/th&gt;
      &lt;th style=&quot;text-align: center&quot;&gt;Titulo&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;4.5&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;3.699524&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;Run All Night&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;1.5&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;2.195683&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;Saving Private Ryan&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;4.0&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;1.683317&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;Dr. Strangelove or: How I Learned to Stop Worr…&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;4.0&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;1.487666&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;Die Hard&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;2.5&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;1.292135&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;Shrek&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;4.0&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;3.703663&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;Shine&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;2.0&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;2.336115&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;Six Days Seven Nights&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;4.0&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;3.052016&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;Top Gun&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;5.0&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;3.368618&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;Time Bandits&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;4.0&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;2.062055&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;Office Space&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;3.5&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;1.556051&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;October Sky&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;2.5&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;2.838505&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;Addams Family Values&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;3.0&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;2.404784&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;Tropic Thunder&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;1.5&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;1.106677&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;Sex, Lies, and Videotape&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;2.0&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;2.427603&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;Empire Records&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;3.0&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;3.856894&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;For the Love of Benji&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;2.5&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;2.956768&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;Jumanji&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;2.0&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;3.212133&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;Brazil&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;3.0&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;2.692718&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;Bounce&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;4.5&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;2.558084&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;Dredd&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;2.0&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;2.132428&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;Butch Cassidy and the Sundance Kid&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;4.0&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;1.840417&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;Little Miss Sunshine&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;4.0&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;2.521581&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;Apollo 13&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;4.0&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;2.721938&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;Ghost in the Shell&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;3.0&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;2.438640&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;Eragon&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;se seleccionó un usuario aleatorio y se le recomendó un lista de películas basadas en sus calificaciones:&lt;/p&gt;

&lt;p&gt;Películas que le gustaron al usuario 103627: &lt;br /&gt;
“Stargate”&lt;br /&gt;
“Century” &lt;br /&gt;
“Honey, I Blew Up the Kid” &lt;br /&gt;
“Milk Money” &lt;br /&gt;
“Backbeat”, “Homage” &lt;br /&gt;
“Peanuts - Die Bank zahlt alles” &lt;br /&gt;
“Convent, The (O Convento)” &lt;br /&gt;
“Crows and Sparrows (Wuya yu maque)” &lt;br /&gt;
“All Over Me” &lt;br /&gt;
“You Can’t Take It with You” &lt;br /&gt;
“Devil and Max Devlin, The” &lt;br /&gt;
“Permanent Midnight” &lt;br /&gt;
“Kindred, The” &lt;br /&gt;&lt;/p&gt;

&lt;p&gt;Películas recomendadas &lt;br /&gt;
“Coneheads”, “Heavy Metal” &lt;br /&gt;
“Some Girls Do” &lt;br /&gt;
“Outland” &lt;br /&gt;
“Cypher” &lt;br /&gt;
“Teenagers from Outer Space” &lt;br /&gt;
“Snowpiercer” &lt;br /&gt;
“Freejack” &lt;br /&gt;
“Escape from Planet Earth” &lt;br /&gt;
“Hostage” &lt;br /&gt;&lt;/p&gt;

&lt;h2 id=&quot;conclusiones&quot;&gt;Conclusiones&lt;/h2&gt;

&lt;p&gt;Con la gran variedad de sistemas de recomendación que hay se puede encontrar uno que se adapte a las necesidades de cualquier problema, y se pueden combinar para resolver problemas que presentan estos individualmente.&lt;/p&gt;</content><author><name>Ricardo E. Alvarado Mata</name></author><summary type="html">Existen diversos métodos y estrategias utilizados a la hora de crear sistemas de recomendaciones, estos buscan hacer recomendaciones de ítems a usuarios ya sea con el fin de que interactúen con ellos, se trate de un video, una canción, una película, un producto etc. En este blog explicare varias formas en que se puede construir un sistema que recomiende dichos ítems a los usuarios, hablaré un poco del panorama general pero me centraré más en explicar aquellos sistemas que toman en cuenta las características de los items para hacer la recomendación.</summary></entry><entry><title type="html">Clasificación multi label y regresión usando textos</title><link href="https://ricardoamata.github.io/Multi-label-text-clasification/" rel="alternate" type="text/html" title="Clasificación multi label y regresión usando textos" /><published>2019-12-18T00:00:00-07:00</published><updated>2019-12-18T00:00:00-07:00</updated><id>https://ricardoamata.github.io/Multi-label-text-clasification</id><content type="html" xml:base="https://ricardoamata.github.io/Multi-label-text-clasification/">&lt;p&gt;En este blog explicare como entrenar un modelo &lt;a href=&quot;https://towardsdatascience.com/https-medium-com-pupalerushikesh-svm-f4b42800e989&quot;&gt;svm&lt;/a&gt; para predecir a qué géneros pertenecen una película a partir de un texto que sirva como una descripción de la trama. También se entrena un modelo que usando esta misma descripción en texto prediga el año de salida de la película.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://github.com/ricardoamata/Proyecto-ML/blob/master/Clasificaci%C3%B3n_de_pel%C3%ADculas_usando_las_tramas.ipynb&quot;&gt;Libreta con el código implementado&lt;/a&gt;&lt;/p&gt;

&lt;h3 id=&quot;descripción-de-los-datos&quot;&gt;Descripción de los datos&lt;/h3&gt;

&lt;p&gt;Los datos son sacados de kaggle y se pueden descargar de aqui: &lt;a href=&quot;https://www.kaggle.com/jrobischon/wikipedia-movie-plots&quot;&gt;Wiki Movie Plots&lt;/a&gt;, la base de datos contiene descripciones para 34,886 películas de todo el mundo. las columnas son las siguientes:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Release Year - Año en que se estreno la película&lt;/li&gt;
  &lt;li&gt;Title - Titulo de la película&lt;/li&gt;
  &lt;li&gt;Origin/Ethnicity - Origen de la pelicula (e.g. America, Bollywood, Tamil, etc)&lt;/li&gt;
  &lt;li&gt;Director - Director(s)&lt;/li&gt;
  &lt;li&gt;Cast - Actores y actrices principales&lt;/li&gt;
  &lt;li&gt;Genre - Genero(s) de la película&lt;/li&gt;
  &lt;li&gt;Wiki Page - URL de la pagina de Wikipedia de la cual la descripción de la trama fue tomada&lt;/li&gt;
  &lt;li&gt;Plot - descripción larga de la trama de la película (ADVERTENCIA: puede contener espoilers)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;problemas-específicos-de-este-dataset-que-hay-que-solucionar&quot;&gt;Problemas específicos de este dataset que hay que solucionar&lt;/h2&gt;

&lt;p&gt;Los textos no están limpios: hay que remover todos caracteres raros como los puntos, comas, entre otros y reemplazar las contracciones que tienen los textos, ademas hay que realizar otras tareas de pln.&lt;/p&gt;

&lt;p&gt;Los géneros no están en el formato correcto: en muchos casos nos encontramos con géneros que son iguales pero están mal escritos o escritos de otra forma, todos estos tenemos que cambiarlos por un único nombre, además tenemos que remover todos los géneros que sean demasiado raros y en algunos casos cambiarlos por otros más adecuados.&lt;/p&gt;

&lt;h2 id=&quot;el-problema-de-tener-múltiples-clases-de-salida&quot;&gt;El problema de tener múltiples clases de salida&lt;/h2&gt;

&lt;p&gt;El problema de clasificar un dato tal que pueda pertenecer a múltiples clases tiene varias soluciones, una de ellas sería transformar el conjunto de clases en su conjunto potencia, donde cada subconjunto forme una nueva clase, el problema de esto es que el número de nuevas clases sería demasiado grande si antes tenias n clases ahora tendrás 2&lt;sup&gt;n&lt;/sup&gt; nuevas clases, lo que dificulta el entrenamiento, para contrarrestar esto se podría utilizar solo únicamente aquellas clases que aparecen en el conjunto de entrenamiento, esto claro aumentaría nuestro sesgo, ya que si un dato pertenece a un subconjunto de clases que no está presente en el conjunto de entrenamiento no lo podremos clasificar correctamente.&lt;/p&gt;

&lt;p&gt;Otra alternativa y la cual usaremos en este blog es entrenar un clasificador binario por clase, de manera que cada clasificador estime la probabilidad de un dato de pertenecer a cada clase independientemente del resto de clasificadores, la ventaja es que si tenemos n clases solo necesitamos n clasificadores para poder mapear un cualquier dato a todo el conjunto potencia de las clases, lo malo es que el conjunto vacío también está incluido, esto es que puede que todos los clasificadores tengan una salida falsa y por lo tanto existan datos que no pertenezcan a ninguna clase, esto es problema solo si sabemos de entrada que todos los datos tienen que pertenecer a mínimo una clase&lt;/p&gt;

&lt;h2 id=&quot;la-codificación-de-las-entradas&quot;&gt;La codificación de las entradas&lt;/h2&gt;

&lt;p&gt;Para poder meter nuestros textos a un algoritmo de aprendizaje es necesario buscar una representación matemática de estos, una forma seria bag of words, donde se convierte un texto a un vector en el cual  cada posición representa una palabra, pudiendo haber un uno o un cero dependiendo de si esa palabra se encuentra en nuestro texto.&lt;/p&gt;

&lt;p&gt;Un ejemplo sería considerando el siguiente vocabulario: {“hoy”, “día“, “yo”, “es”, “mañana”, “gran”, “vida”}&lt;/p&gt;

&lt;p&gt;la representación vectorial de cada palabra es:&lt;/p&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th style=&quot;text-align: center&quot;&gt;Palabra&lt;/th&gt;
      &lt;th style=&quot;text-align: center&quot;&gt;vector&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;hoy&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;1,0,0,0,0,0,0,0&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;día&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;0,1,0,0,0,0,0,0&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;yo&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;0,0,1,0,0,0,0,0&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;es&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;0,0,0,1,0,0,0,0&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;mañana&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;0,0,0,0,1,0,0,0&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;gran&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;0,0,0,0,0,1,0,0&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;vida&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;0,0,0,0,0,0,1,0&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;un&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;0,0,0,0,0,0,0,1&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;Por lo que el texto “hoy es un gran día” es codificado de la siguiente manera:&lt;/p&gt;

&lt;p&gt;1,1,0,1,0,1,0,1&lt;/p&gt;

&lt;p&gt;La desventaja es que el vector es tan grande como nuestro vocabulario y que la mayoría de las entradas son ceros, otra manera de codificar el texto es usando tfidf en donde ya no solo se coloca un uno en caso de que la palabra esté presente sino que se cuenta el número de veces que la palabra apareció en el texto entre el número de documentos en los que aparece, de ahí el nombre Term Frequency Inverse Document Frequency. A pesar de que esta es una mejor manera de representar un texto aún tiene defectos, como que todavía tiene varias entradas en ceros o que no toma en cuenta el orden de las palabras, esto se puede resolver usando n gramas pero esto agrega más carga computacional.&lt;/p&gt;

&lt;p&gt;Antes de codificar los textos hay que limpiarlos, primero, como nuestro texto tiene contracciones en el idioma inglés se reemplazan todas estas por la forma completa de la expresión y se eliminan todos los caracteres extraños como puntos, comas, signos de interrogación y de admiración entre otros. Luego se tokenizar el texto por palabras, estas se lematizan y se convierten a minúsculas.&lt;/p&gt;

&lt;h2 id=&quot;limpieza-de-los-generos&quot;&gt;Limpieza de los generos&lt;/h2&gt;

&lt;p&gt;Ahora hay que limpiar los géneros, para esto se removieron todos los géneros repetidos que estaban escritos de otra manera o que estaban mal escritos.&lt;/p&gt;

&lt;p&gt;Luego se cambió el formato de múltiples géneros, cambiando todas la formas que existían para representar que una pelicula pertenece a multiples generos, por una en donde se pone cada género separado por el carácter “|”.&lt;/p&gt;

&lt;p&gt;Hasta este momento ya tenemos los géneros limpios, pero si una película tiene múltiples géneros esto se sigue representando como una cadena, por lo que si queremos usar nuestros clasificadores binarios para cada clase lo que haremos será separar en una lista los géneros de cada película.&lt;/p&gt;

&lt;p&gt;Ejemplo:&lt;/p&gt;

&lt;p&gt;Si se tiene que una película es de los géneros “romance|comedy” esto se considera un género distinto del genero “romance” o solo “comedy”, para evitar que las combinaciones de distintas clases formen otra clase totalmente distinta, vamos a separar estas en una lista, convirtiendo asi “romance|comedy” a [“romance”, “comedy”].&lt;/p&gt;

&lt;p&gt;Para representar esta lista se usará una representación de tipo one hot, pero con múltiples entradas, en donde la posición i-ésima del vector representa que la película pertenece al i-ésimo género, al final entrenaremos un clasificador binario para predecir si la i-ésima entrada es un uno o no.&lt;/p&gt;

&lt;h2 id=&quot;aprendizaje&quot;&gt;Aprendizaje&lt;/h2&gt;

&lt;p&gt;Para el aprendizaje se utilizó una máquina de vectores de soporte lineal por género, ya que estas generalizan bien, se utilizaron solo los 23 géneros con más ocurrencia, eliminando los otros, y se removieron los datos que no pertenecían a ninguno de estos.&lt;/p&gt;

&lt;p&gt;Como una muestra de los resultados se eligieron 25 películas aleatorias del conjunto de pruebas y se realizó la clasificación sobre ellas:&lt;/p&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th style=&quot;text-align: center&quot;&gt;Péliculas&lt;/th&gt;
      &lt;th style=&quot;text-align: center&quot;&gt;Predicción&lt;/th&gt;
      &lt;th style=&quot;text-align: center&quot;&gt;Real&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;Kitty Kornered&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;animation&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;comedy&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;Head in the Clouds&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;thriller&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;drama&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;Brown Sugar&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt; &lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;comedy&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;Delavine Affair&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;crime&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;comedy|romance&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;Red Salute&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;comedy&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;comedy&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;Take the Lead&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;drama&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;drama&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;Thalapathi&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt; &lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;drama&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;Vertigo&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;drama&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;comedy&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;Hochchheta ki&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt; &lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;crime&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;Guns of Darkness&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt; &lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;horror&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;Cat Napping&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;animation&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;drama&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;Girl with a Pearl Earring&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;drama&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;comedy&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;Ratatouille&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt; &lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;drama&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;Bareilly Ki Barfi&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;romance&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;drama&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;Fullmetal Alchemist the Movie: Conqueror of Sh…&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;fantasy&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;drama&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;Aakrosh&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;drama&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt; &lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;A World Apart&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;drama&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;comedy|crime&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;Child 44&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;crime&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;musical&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;Steins;Gate: Fuka Ryōiki no Déjà vu&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;science_fiction&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;drama&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;The Gift of Love&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;drama&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;drama|war&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;Maria’s Lovers&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt; &lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;adventure&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;Beeba Boys&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt; &lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;musical&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;Alik Sukh&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;drama&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;drama&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;The Mysterious Mr. Valentine&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;drama|crime&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;drama&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;Verboten!&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt; &lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;comedy&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;h4 id=&quot;precisión-de-cada-clasificador&quot;&gt;Precisión de cada clasificador:&lt;/h4&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th style=&quot;text-align: center&quot;&gt;Género&lt;/th&gt;
      &lt;th style=&quot;text-align: center&quot;&gt;Precisión&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;drama&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;0.719324&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;comedy&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;0.796415&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;romance&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;0.912416&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;action&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;0.923055&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;thriller&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;0.929612&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;crime&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;0.939959&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;horror&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;0.960799&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;western&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;0.984844&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;musical&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;0.966045&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;science_fiction&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;0.976537&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;animation&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;0.978723&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;adventure&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;0.971728&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;family&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;0.977703&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;war&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;0.981638&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;fantasy&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;0.982804&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;mystery&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;0.985281&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;biography&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;0.982221&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;black&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;0.986010&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;history&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;0.991110&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;short&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;0.991256&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;martial_arts&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;0.995337&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;documentary&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;0.994171&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;sports&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;0.995191&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;h4 id=&quot;presición-promedio-09528594781594922&quot;&gt;Presición promedio: 0.9528594781594922&lt;/h4&gt;

&lt;h4 id=&quot;presición-conjunta-0008&quot;&gt;Presición conjunta: 0.008&lt;/h4&gt;

&lt;p&gt;Incluso aun cuando tenemos una buena precisión por clase la precisión conjunta de todos los clasificadores no es buena, en nuestro caso estaría cercana a 0.08, esto debido a cómo funciona el método utilizado, la probabilidad de que clasifique bien una clase individualmente es alta, pero la probabilidad de que clasifique bien todas es el producto de las probabilidades individuales de cada clase, como todos son números menores a uno este producto termina siendo muy pequeño, por ejemplo.&lt;/p&gt;

&lt;p&gt;En un caso hipotético supongamos que tenemos C clases distintas y que la probabilidad de clasificar buen una clase denotada como P es la misma para todas las clases, entonces la probabilidad de clasificar bien todas las clases es P&lt;sup&gt;C&lt;/sup&gt;, aunque P sea un número muy grande como 0.95, si tenemos muchas clases P&lt;sup&gt;C&lt;/sup&gt; terminará siendo un número muy pequeño, como es en nuestro caso.&lt;/p&gt;

&lt;h2 id=&quot;regresión-para-predecir-los-años-de-lanzamiento&quot;&gt;Regresión para predecir los años de lanzamiento&lt;/h2&gt;

&lt;p&gt;Se realizó una regresión lineal usando las tramas vectorizadas de las películas para intentar predecir los años en que habían sido lanzadas, estos fueron algunos de  los resultados:&lt;/p&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th style=&quot;text-align: center&quot;&gt;Pélicula&lt;/th&gt;
      &lt;th style=&quot;text-align: center&quot;&gt;Predicción&lt;/th&gt;
      &lt;th style=&quot;text-align: center&quot;&gt;Real&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;A Doll’s House&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;1976&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;1973&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;Adventure of the King&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;2020&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;2010&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;The Shoes of the Fisherman&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;2031&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;1968&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;There’s a Girl in My Soup&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;1949&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;1970&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;La Bohème&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;1946&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;1926&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;A Simple Plan&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;1990&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;1998&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;Chicken Run&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;1989&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;2000&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;Murder, Inc.&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;1951&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;1960&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;Home to Stay&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;1947&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;1978&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;The Number 23&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;1995&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;2007&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;The Invisible Boy&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;1968&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;1957&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;A Boy, a Girl and a Bike&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;1943&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;1949&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;Disco Dancer&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;2009&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;1982&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;Rama Rama Krishna Krishna&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;1991&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;2010&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;Pyaar Ke Side Effects&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;2020&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;2006&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;h2 id=&quot;conclusiones&quot;&gt;Conclusiones&lt;/h2&gt;

&lt;p&gt;A Pesar de las ventajas que ofrece la solución mostrada en el blog ya que se puede alcanzar un error muy bajo en la clasificación por clase, el error por clasificar un dato en las todas las clases juntas puede llegar a ser muy alto, ya que es el producto de los errores de todas las clases, por lo que si se tienen en particular muchas clases quiza sea mejor intentar usar otro metodo.&lt;/p&gt;

&lt;p&gt;En la regresión para encontrar los años de las películas encontramos que puede que no exista una relación entre la trama y el año, o tal vez se puedan alcanzar mejores resultados usando una red neuronal.&lt;/p&gt;

&lt;p&gt;Para ambos casos quizá usar redes neuronales o otro método de codificación pueda mejorar la precisión, world 2 vec permite codificar las palabras a vectores densos de una dimensión especificada, en donde la cual se trata de modelar la cercanía de las palabras, o tal vez usar el universal sentence encoder, el cual toma un texto y lo convierte a un vector denso de 512, esto está pensado para obtener la similitud de textos en base a la distancia coseno. Además de estos también existen otros métodos que se podrían utilizar.&lt;/p&gt;</content><author><name>Ricardo E. Alvarado Mata</name></author><summary type="html">En este blog explicare como entrenar un modelo svm para predecir a qué géneros pertenecen una película a partir de un texto que sirva como una descripción de la trama. También se entrena un modelo que usando esta misma descripción en texto prediga el año de salida de la película.</summary></entry><entry><title type="html">Tradución automatica usando atención</title><link href="https://ricardoamata.github.io/Traductor-usando-atenci%C3%B3n/" rel="alternate" type="text/html" title="Tradución automatica usando atención" /><published>2019-05-29T00:00:00-07:00</published><updated>2019-05-29T00:00:00-07:00</updated><id>https://ricardoamata.github.io/Traductor-usando-atenci%C3%B3n</id><content type="html" xml:base="https://ricardoamata.github.io/Traductor-usando-atenci%C3%B3n/">&lt;p&gt;En este blog se mostrara en que consiste el modelo encoder-decoder, que es la
capa de atención. Se dará una pequeña introducción a los temas necesarios y por
ultimo explicaremos como es posible dicho modelo para traducción entre lenguajes,
así como mostrar algunos resultados obtenidos.&lt;/p&gt;

&lt;h2 id=&quot;redes-recurrentes&quot;&gt;Redes recurrentes&lt;/h2&gt;

&lt;p&gt;Las redes neuronales recurrentes se han usado en los últimos años para lograr buenos
resultados en el área de traducción automática, es por eso que en este blog empezaremos
dando una breve introducción sobre este tipo de redes.&lt;/p&gt;

&lt;p&gt;Las redes recurrentes son un tipo de red inspiradas en la capacidad de memoria que
tienen las neuronas del cerebro, con la finalidad de ser efectivas a la hora de analizar
datos que cambian con el tiempo. En estas redes las salidas de una capa no solo se conectan
con la siguiente, sino que se vuelven a conectar a la misma capa, de ahí el nombre de 
redes recurrentes.&lt;/p&gt;

&lt;p&gt;&lt;a title=&quot;François Deloche [CC BY-SA 4.0 (https://creativecommons.org/licenses/by-sa/4.0)], via Wikimedia Commons&quot; href=&quot;https://commons.wikimedia.org/wiki/File:Recurrent_neural_network_unfold.svg&quot;&gt;&lt;img width=&quot;600&quot; alt=&quot;Recurrent neural network unfold&quot; src=&quot;https://upload.wikimedia.org/wikipedia/commons/thumb/b/b5/Recurrent_neural_network_unfold.svg/1024px-Recurrent_neural_network_unfold.svg.png&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;La imagen de arriba muestra una red que tiene una sola capa con una entrada x&lt;sub&gt;t&lt;/sub&gt; que 
es la entrada en el tiempo t, y produce una salida O&lt;sub&gt;t&lt;/sub&gt;, luego esa misma salida 
vuelve a entrar a la capa junto con la entrada x&lt;sub&gt;t+1&lt;/sub&gt;. Si desenrollamos una capa en el 
tiempo es como si tuviéramos una red con muchas capas y una salida por capa. Cada capa se le llama
unidad, existen diferentes tipos de unidades.&lt;/p&gt;

&lt;h2 id=&quot;unidad-lstm&quot;&gt;Unidad LSTM&lt;/h2&gt;

&lt;p&gt;Cada capa consta de una unidad &lt;a href=&quot;https://en.wikipedia.org/wiki/Long_short-term_memory&quot;&gt;LSTM&lt;/a&gt; 
(Long Short Term Memory) la cual esta diseñada para tratar uno de los problemas de las redes
recurrentes, que es el &lt;a href=&quot;https://en.wikipedia.org/wiki/Vanishing_gradient_problem&quot;&gt;desvanecimiento del gradiente&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a title=&quot;Guillaume Chevalier [CC BY 4.0 (https://creativecommons.org/licenses/by/4.0)], via Wikimedia Commons&quot; href=&quot;https://commons.wikimedia.org/wiki/File:The_LSTM_cell.png&quot;&gt;&lt;img width=&quot;600&quot; alt=&quot;The LSTM cell&quot; src=&quot;https://upload.wikimedia.org/wikipedia/commons/thumb/3/3b/The_LSTM_cell.png/1024px-The_LSTM_cell.png&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Una unidad LSTM esta compuesta por una celda y tres reguladores, conocidos como puertas que son:
la puerta de entrada (&lt;strong&gt;input gate&lt;/strong&gt;), la puerta de salida (&lt;strong&gt;output gate&lt;/strong&gt;), y la puerta de olvido
(&lt;strong&gt;forget gate&lt;/strong&gt;). Cada puerta es una capa de una red neuronal normal, con una función de activación
logística.&lt;/p&gt;

&lt;p&gt;La primer puerta por la que pasa la entrada una ves es concatenada con la salida anterior
es la puerta de olvido y después de haber obtenido una salida multiplica su resultado con el estado 
interno anterior de la celda C&lt;sub&gt;t-1&lt;/sub&gt;. Esta puerta decide que datos de entrada son importantes 
y que datos no, emite valores entre 0 y 1 de modo  que 0 significa que un dato no merece ser recordado 
y 1 significa que el dato tiene que ser recordado exactamente.&lt;/p&gt;

&lt;p&gt;Luego es turno de la puerta de entrada, en la cual se multiplica el resultado por la salida de otra 
capa, pero con función de activación tanh, luego se suma el resultado con el estado anterior 
C&lt;sub&gt;t-1&lt;/sub&gt; para obtener nuestro nuevo estad interno C&lt;sub&gt;t&lt;/sub&gt;.&lt;/p&gt;

&lt;p&gt;Por ultimo es turno de la capa de salida filtrar aquellos valores de nuestro estado que no sean
necesarios, para ello calculamos el valor de C&lt;sub&gt;t-1&lt;/sub&gt; al pasar por la función tanh y lo
multiplicamos por la salida de la puerta de salida.&lt;/p&gt;

&lt;h1 id=&quot;unidad-gru&quot;&gt;Unidad GRU&lt;/h1&gt;

&lt;p&gt;las unidades GRU (Gated Recurrent Unit) son una variante de las LSTM que solo usa dos puertas, 
la &lt;strong&gt;update gate&lt;/strong&gt; y la &lt;strong&gt;reset gate&lt;/strong&gt;, además de que solamente tiene un estado interno, la 
primera se encarga de decidir que tanta información de
los pasos anteriores requiere ser preservada, y la otra que tanta información es necesaria olvidar.
Para la implementación se usaron GRU por que son mas fáciles de entrenar.&lt;/p&gt;

&lt;p&gt;&lt;a title=&quot;Jeblad [CC BY-SA 4.0 (https://creativecommons.org/licenses/by-sa/4.0)], via Wikimedia Commons&quot; href=&quot;https://commons.wikimedia.org/wiki/File:Gated_Recurrent_Unit,_base_type.svg&quot;&gt;&lt;img width=&quot;512&quot; alt=&quot;Gated Recurrent Unit, base type&quot; src=&quot;https://upload.wikimedia.org/wikipedia/commons/thumb/3/37/Gated_Recurrent_Unit%2C_base_type.svg/512px-Gated_Recurrent_Unit%2C_base_type.svg.png&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2 id=&quot;sequence-to-sequence&quot;&gt;Sequence to sequence&lt;/h2&gt;

&lt;p&gt;En el modelo sequence to sequence se utilizan dos redes recurrentes, una de ellas se llama encoder
y es en donde entra nuestra secuencia de palabras, dicha red se entrena para producir un vector de
tamaño fijo que represente nuestra secuencia de entrada, ese vector es desconocido y es enviado
a la segunda red, que a la que se le conoce como decoder, la cual se encarga de producir una secuencia
de salida en base al vector que se le proporciono.&lt;/p&gt;

&lt;p&gt;En el caso de la traducción automática tendríamos un texto de entrada en nuestro lenguaje fuente
y el encoder se encargaría de transformarlo en una representación abstracta, luego le pasaría es
representación al decoder el cual lo transformaría en otro texto que sea una traducción del texto
original. La red es entrenada de modo que se escoja la salida que sea mas probable de acuerdo a la
entrada.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://cdn-images-1.medium.com/max/800/1*1JcHGUU7rFgtXC_mydUA_Q.jpeg&quot;&gt;&lt;img src=&quot;https://cdn-images-1.medium.com/max/800/1*1JcHGUU7rFgtXC_mydUA_Q.jpeg&quot; alt=&quot;encoder-decoder&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;La red solo acepta entradas numéricas, por lo que para poder introducir secuencias de caracteres
primero debemos convertirlas a entradas validas, para ello usamos una capa de embedding la cual
convierte un numero en un vector denso, esta campa se puede entrenar a parte o junto con la red
y sirve para representar tu entrada en forma vectorial, de manera que si quieres que cada elemento
de la secuencia sean palabras entonces los vectores de salida nos indicaran que tan relacionadas están
dos palabras dependiendo de la distancia. También puedes usar caracteres puros como entrada, pero es
probable que existan ocasiones en las que no obtengas palabras reales.&lt;/p&gt;

&lt;h2 id=&quot;capa-de-atención&quot;&gt;Capa de atención&lt;/h2&gt;

&lt;p&gt;Uno de los problemas principales del modelo encoder decoder surge por tratar de codificar una
secuencia de un tamaño indefinido en un vector de tamaño constante, es posible que para secuencias
de una gran longitud se pierda información que es importante a la hora de hacer la codificación,
lo que repercute directamente en el resultado final.&lt;/p&gt;

&lt;p&gt;La idea base del mecanismo de atención es brindar al decoder acceso a los demás estados del encoder
y no solo al estado final,
esto es inspirado en la forma en la que un ser humano procesaría la información de entra para
generar la salida, no memorizaría toda la entrada, en cambio solo memorizaría lo mas importante
y cuando necesite información extra ir a la fuente de información original.&lt;/p&gt;

&lt;p&gt;La capa de atención es una capa densa cuyas entradas son todos los estados emitidos por
el encoder, tiene una activación softmax y a su salida es el vector de pesos por los que se
multiplicaran todos los estados emitidos por el encoder antes de ser enviados al decoder,
de modo que el decoder preste mas atención a los estados que sean mas relevantes (de ahí
el nombre de atención). La capa de atención estima las probabilidades de que una salida del
encoder sea significativa para el decoder en el estado actual, por esta razón si un estado es
muy relevante se espera que se multiplique por un peso mas grande que el de un estado que es
poco relevante.&lt;/p&gt;

&lt;p&gt;Una vez multiplicado cada estado por su peso de atención, se suman y se envían al encoder
como el vector codificado de la entrada, por lo que se calcula un vector de contexto para
cada palabra que va a predecir el decoder, si lo graficamos nos daría algo como esto:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/attention.png&quot; alt=&quot;Attention image&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;implementación&quot;&gt;Implementación&lt;/h2&gt;

&lt;p&gt;La implementación simplemente sigue el tutorial de tensorflow &lt;a href=&quot;https://github.com/tensorflow/tensorflow/blob/r1.13/tensorflow/contrib/eager/python/examples/nmt_with_attention/nmt_with_attention.ipynb&quot;&gt;nmt_with_attention&lt;/a&gt;, el repositorio de gihub de nuestra implementación es &lt;a href=&quot;https://github.com/ricardoamata/NMT_using_attention&quot;&gt;NMT_using_attention&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;los datos se obtuvieron de &lt;a href=&quot;http://www.manythings.org/anki/&quot;&gt;http://www.manythings.org/anki/&lt;/a&gt;, proporciona
datos de frases en dos idiomas, cada línea tiene una frase en un idioma y luego la misma frase en otro
idioma separadas por una tabulación. El modelo se entreno para hacer traducciones de español a ingles.&lt;/p&gt;

&lt;p&gt;Ejemplo de algunas traducciones de español a ingles en base al numero de datos de entrenamiento:&lt;/p&gt;

&lt;p&gt;30000 datos aprendizaje:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;hace mucho frio aqui - It’s too cold here&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Ya no hay comida - There’s no food anymore&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Mi casa es de color azul - My house is from the blue&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Solo sé que no sé nada - I know i know what they don’t know anything&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Mañana no trabajo - I’m not working tomorrow&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;60000 datos aprendizaje:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;hace mucho frio aqui - It’s too cold here&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Ya no hay comida - There’s no more left&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Mi casa es de color azul - My house is of blue eyes&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Solo sé que no sé nada - I simply know nothing&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Mañana no trabajo - I’m not work today&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;90000 datos aprendizaje:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;hace mucho frio aqui - It’s too cold here&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Ya no hay comida - There’s no food left&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Mi casa es de color azul - My house is full of japanese&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Solo sé que no sé nada - All i don’t know it takes nothing&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Mañana no trabajo - I’m not working tomorrow&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;</content><author><name>Ricardo E. Alvarado Mata</name></author><summary type="html">En este blog se mostrara en que consiste el modelo encoder-decoder, que es la capa de atención. Se dará una pequeña introducción a los temas necesarios y por ultimo explicaremos como es posible dicho modelo para traducción entre lenguajes, así como mostrar algunos resultados obtenidos.</summary></entry><entry><title type="html">Photorealistic style transfer</title><link href="https://ricardoamata.github.io/Photorealistic-style-transfer/" rel="alternate" type="text/html" title="Photorealistic style transfer" /><published>2019-05-05T00:00:00-07:00</published><updated>2019-05-05T00:00:00-07:00</updated><id>https://ricardoamata.github.io/Photorealistic-style-transfer</id><content type="html" xml:base="https://ricardoamata.github.io/Photorealistic-style-transfer/">&lt;p&gt;&lt;a title=&quot;Hermosillo, sonora&quot; href=&quot;https://ricardoamata.github.io/images/output_1.png&quot;&gt;
    &lt;img src=&quot;https://ricardoamata.github.io/images/output_1.png&quot; alt=&quot;Hermosillo, sonora&quot; /&gt;
&lt;/a&gt;&lt;/p&gt;

&lt;h2 id=&quot;introducción&quot;&gt;Introducción&lt;/h2&gt;

&lt;p&gt;En este blog se explicara en que consiste la transferencia de estilo y como conseguir
que esta sea fotorrealista, se mostrara de que manera se puede usar una red neuronal
pre entrenada en reconocimiento de imágenes para alcanzar este resultado, así como
las mejores estrategias a seguir, ya que el proceso no es una receta de cocina la 
cual seguir al pie de la letra y depende mucho de las entradas. Al final mostraremos
algunos métodos de post procesamiento y algunas formas de mejorar los resultados obtenidos
en base a nuevas ideas propuestas recientemente.&lt;/p&gt;

&lt;h2 id=&quot;red-neuronal&quot;&gt;Red neuronal&lt;/h2&gt;

&lt;p&gt;Una red neuronal se puede ver como una colección de nodos conectados entre si a los que se
les llama neuronas, cada neurona recibe una serie de señales que son multiplicadas cada una
por un peso y en base a eso emite una señal de salida, así que una neurona solamente calcula
una combinación lineal de las señales de entrada y al resultado se le suma un sesgo, por lo
tanto no son mas que aproximadores lineales. Las señales están representadas por números reales
y la salida de la red puede ser un escalar o un vector dependiendo del numero de neuronas 
de salida.&lt;/p&gt;

&lt;p&gt;La red mas simple es la red hacia adelante la cual divide sus neuronas en capas, todas las
neuronas de una capa envía su salida a cada neurona de la capa siguiente, estas usan lo que 
les enviaron como entradas para calcular otra salida y el proceso se repite hasta la ultima 
capa. El objetivo de la red neuronal es encontrar los pesos de cada neurona que minimicen el
error de la salida, para lo cual se usa el método de descenso de backpropagation. Existe el 
inconveniente de que las neuronas solo emiten resultados lineales y por lo tanto no importa 
cuantas capas tenga una red si la salida de cada neurona es lineal es como si solo se tuviera 
una capa, por lo que a la salida de las neuronas se les aplica una función que se conoce como 
función de activación cuyo único objetivo es eliminar la linealidad en la salida de las 
neuronas. Para saber mas entra a:
&lt;a href=&quot;https://towardsdatascience.com/deep-learning-feedforward-neural-network-26a6705dbdc7&quot;&gt;Deep Learning: Feedforward Neural Network&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a title=&quot;Chrislb [CC BY-SA 3.0 (http://creativecommons.org/licenses/by-sa/3.0/)], via Wikimedia Commons&quot; href=&quot;https://commons.wikimedia.org/wiki/File:MultiLayerNeuralNetwork_english.png#/media/File:MultiLayerNeuralNetworkBigger_english.png&quot;&gt;
    &lt;img width=&quot;512&quot; alt=&quot;MultiLayerNeuralNetwork english&quot; src=&quot;https://upload.wikimedia.org/wikipedia/commons/c/c2/MultiLayerNeuralNetworkBigger_english.png&quot; /&gt;
&lt;/a&gt;&lt;/p&gt;

&lt;h2 id=&quot;redes-convolucionales&quot;&gt;Redes convolucionales&lt;/h2&gt;

&lt;p&gt;En las redes convolucionales no todas las neuronas de una capa se conectan con las de la
capa siguiente, en cambio se usan capas convolucionales que son capas que tienen un conjunto
de filtros a los que se les llama kernel, que no son mas que matrices, los cuales se aplican 
a toda la imagen por regiones que tengan la misma dimensión que el kernel, para calcular el
resultado se cada elemento del kernel con cada elemento de la región deseada y luego se suma
todo (como un producto punto vectorial).&lt;/p&gt;

&lt;p&gt;El kernel inicia en la esquina superior izquierda de la imagen y termina en la esquina inferior
derecha recorriendo la imagen de izquierda a derecha y de arriba a abajo, cada resultado de 
aplicar el kernel en una cierta región de la imagen se guarda en otra matriz a la que se le 
conoce como mapa de características.&lt;/p&gt;

&lt;p&gt;&lt;a title=&quot;Aphex34 [CC BY-SA 4.0 (https://creativecommons.org/licenses/by-sa/4.0)], via Wikimedia Commons&quot; href=&quot;https://commons.wikimedia.org/wiki/File:Typical_cnn.png&quot;&gt;
    &lt;img width=&quot;512&quot; alt=&quot;Typical cnn&quot; src=&quot;https://upload.wikimedia.org/wikipedia/commons/thumb/6/63/Typical_cnn.png/512px-Typical_cnn.png&quot; /&gt;
&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Cada capa de la red es un conjunto de filtros que se aplican a la salida de la capa anterior, así hasta
que se llega a una capa densamente conectada que hace la clasificación con las características que
los filtros lograron obtener. En el caso de las redes para reconocer imágenes el resultado es un 
vector cuya dimensión es el numero de clases diferentes a reconocer. Para conocer mas entra a: &lt;a href=&quot;https://towardsdatascience.com/a-comprehensive-guide-to-convolutional-neural-networks-the-eli5-way-3bd2b1164a53&quot;&gt;A Comprehensive Guide to Convolutional Neural Networks&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id=&quot;transferencia-de-estilo&quot;&gt;Transferencia de estilo&lt;/h2&gt;

&lt;p&gt;La transferencia de estilo consisten en tomar una imagen a la que llamaremos de referencia y otra
a la que llamaremos de contenido y modificar la imagen de contenido tratando de que se parezca
a la de referencia sin que se pierda el contenido original.&lt;/p&gt;

&lt;p&gt;¿Cómo podemos entonces usar una red neuronal entrenada en reconocimiento de imágenes para transferir
estilo? ¿No se supone que una red que clasifica imágenes solo nos dice a que clase pertenece dicha
imagen? Es verdad que la red solo sirve para clasificación, pero lo que a nosotros nos interesa es
poder separar el estilo del contenido y poder establecer un criterio de como medir el error en cuanto
a lo parecidas que son dos imágenes en contenido y otro para medir lo parecido que son en estilo, así
podemos iniciar con una imagen aleatoria del tamaño de la imagen de contenido y medir que tanto se
parece en estilo al imagen de referencia y que tanto se parece el contenido a la imagen de contenido y
después minimizar ese error.&lt;/p&gt;

&lt;p&gt;Las redes entrenadas para el reconocimiento de imágenes guardan en los mapas de características
información valiosa acerca del contenido de la imagen, en las primeras capas se guardan estructuras
simples que formal los pixeles, como bordes, líneas, esquinas etc. cada capa es mas abstracta que
la anterior y por lo tanto podemos encontrar figuras mas abstractas y que tienen mas que ver con
el contenido de la imagen, por lo que para saber que tan parecidas son dos imágenes en contenido
hace falta comparar los mapas de características de estas dos imágenes al pasar por la red neuronal.&lt;/p&gt;

&lt;p&gt;Para calcular el error del estilo usaremos la correlación entre las activaciones de las neuronas
de la red, que se obtiene calculando la matriz de Gram de los mapas de características de las dos
imágenes en cada capa y obteniendo su distancia.&lt;/p&gt;

&lt;p&gt;El error total lo calculamos como el error de contenido mas el del estilo, después usaremos
este error con el método de backpropagation para actualizar la imagen inicial. Para conocer los
detalles matemáticos detrás de este método puedes revisar el &lt;a href=&quot;https://arxiv.org/abs/1508.06576&quot;&gt;articulo original de Leon A. Gatys&lt;/a&gt;&lt;/p&gt;

&lt;h2 id=&quot;fotorrealismo&quot;&gt;Fotorrealismo&lt;/h2&gt;

&lt;p&gt;El método anterior tiene buenos resultados para trasferir el estilo artístico, ya que si bien
no se pierde el contenido original de la imagen al realizar el proceso si se trata de una fotografía
se puede perder el realismo porque el método puede distorsionar la foto y hacer que parezca una 
pintura o que no simplemente luzca editada con algún programa de edición de fotos como se puede
ver en el ejemplo de abajo.&lt;/p&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th style=&quot;text-align: center&quot;&gt;Contenido&lt;/th&gt;
      &lt;th style=&quot;text-align: center&quot;&gt;Referencia&lt;/th&gt;
      &lt;th style=&quot;text-align: center&quot;&gt;Resultado&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;&lt;a title=&quot;contenido&quot; href=&quot;https://ricardoamata.github.io/images/in7.png&quot;&gt;&lt;img src=&quot;https://ricardoamata.github.io/images/in7.png&quot; alt=&quot;contenido&quot; /&gt;&lt;/a&gt;&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;&lt;a title=&quot;contenido&quot; href=&quot;https://ricardoamata.github.io/images/tar1.png&quot; alt=&quot;referencia&quot;&gt;&lt;img src=&quot;https://ricardoamata.github.io/images/tar1.png&quot; alt=&quot;contenido&quot; /&gt;&lt;/a&gt;&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;&lt;a title=&quot;contenido&quot; href=&quot;https://ricardoamata.github.io/images/bad_styled.png&quot;&gt;&lt;img src=&quot;https://ricardoamata.github.io/images/bad_styled.png&quot; alt=&quot;resultado&quot; /&gt;&lt;/a&gt;&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;Principalmente se pueden encontrar dos problemas: uno es la distorsión de la imagen y el otro
es la transferencia de estilo sin sentido. El primer problema es fácil de entender, pero el segundo
pede sonar un poco extraño, lo de la trasferencia de estilo sin sentido se refiere a que el estilo
de una sección de la imagen de referencia se transfiera a una región de la imagen de contenido que
no debería (Ej. que el estilo de un edificio se transfiera al cielo).&lt;/p&gt;

&lt;p&gt;Para resolver el primer problema partimos de la idea de que la imagen de entrada ya es una imagen
fotorrealista y solo hace falta agregar un termino extra a la función de error que
penaliza las distorsiones en la imagen, para lo que usaremos una función que nos mida la afinidad
de los colores de los pixeles de la imagen de salida en relación a los de la imagen de entrada. Justo
esto es lo que se consigue al calcular la matriz de Matting Laplacian de una imagen que representa
en una escala de grises mate la combinación local afín de los canales RGB de una imagen,
entonces podemos usar esta matriz para calcular que tan distorsionada queda la imagen de salida
y a este termino le llamaremos factor de fotorrealismo.&lt;/p&gt;

&lt;p&gt;El calcular la matriz de Gram sobre toda la imagen de estilo y toda la imagen de salida para medir
la diferencia que hay entre los estilos causa que no se realice una transferencia tomando en cuenta
el contexto de cada imagen. Para resolver este problema es necesario agregar una mascara de 
segmentación a las imágenes de estilo y contenido, en donde se divide la imagen por secciones
y así limitar la transferencia de estilo solo con secciones que tengan que ver, por ejemplo
que si en la imagen de contenido hay un edificio, a este solo se le traspase el estilo de otro
edificio en la imagen de referencia.&lt;/p&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th style=&quot;text-align: center&quot;&gt;Imagen&lt;/th&gt;
      &lt;th style=&quot;text-align: center&quot;&gt;Segmentación&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;&lt;a title=&quot;Imagen hermosillo&quot; href=&quot;https://ricardoamata.github.io/images/in_h.jpg&quot;&gt;&lt;img src=&quot;https://ricardoamata.github.io/images/in_h.jpg&quot; alt=&quot;Imagen hermosillo&quot; /&gt;&lt;/a&gt;&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;&lt;a title=&quot;Segmentación&quot; href=&quot;https://ricardoamata.github.io/images/seg_example.jpg&quot;&gt;&lt;img src=&quot;https://ricardoamata.github.io/images/seg_example.jpg&quot; alt=&quot;Segmentación&quot; /&gt;&lt;/a&gt;&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;Con esto ya tenemos un nuevo método de transferencia de estilo con el cual ya no sufriremos por
deformaciones en la imagen de salida o que el estilo se transfiera sin tener en cuenta el contexto
de la imagen. Si quieres conocer todos los detalles matemáticos detrás del método revisa el articulo &lt;a href=&quot;https://arxiv.org/abs/1703.07511&quot;&gt;Deep photo style transfer&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Ejemplo usando el método descrito para transferencia fotorrealista con las imágenes antes mostradas:&lt;/p&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th style=&quot;text-align: center&quot;&gt;Contenido&lt;/th&gt;
      &lt;th style=&quot;text-align: center&quot;&gt;Referencia&lt;/th&gt;
      &lt;th style=&quot;text-align: center&quot;&gt;Resultado&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;&lt;a title=&quot;contenido&quot; href=&quot;https://ricardoamata.github.io/images/in7.png&quot;&gt;&lt;img src=&quot;https://ricardoamata.github.io/images/in7.png&quot; alt=&quot;contenido&quot; /&gt;&lt;/a&gt;&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;&lt;a title=&quot;contenido&quot; href=&quot;https://ricardoamata.github.io/images/tar1.png&quot;&gt;&lt;img src=&quot;https://ricardoamata.github.io/images/tar1.png&quot; alt=&quot;contenido&quot; /&gt;&lt;/a&gt;&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;&lt;a title=&quot;contenido&quot; href=&quot;https://ricardoamata.github.io/images/good_styled.png&quot;&gt;&lt;img src=&quot;https://ricardoamata.github.io/images/good_styled.png&quot; alt=&quot;resultado&quot; /&gt;&lt;/a&gt;&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;h2 id=&quot;el-peso-del-estilo&quot;&gt;El peso del estilo&lt;/h2&gt;

&lt;p&gt;Nuestra función de error esta compuesta por tres términos, los cuales son: la diferencia
de contenido entre la imagen de salida y la de contenido, la diferencia del estilo entre la
imagen de salida y la de referencia y el factor de fotorrealismo, si queremos que
a la imagen de salida no le importen mucho las distorsiones o que lo que sea mas importante sea
el estilo, entonces podríamos multiplicar el factor de estilo por un numero para incrementarlo
y que así tenga mas peso en la función y sea mas relevante a la hora de minimizar. Abajo podemos
ver un ejemplo con diferentes pesos para el estilo con una misma imagen de contenido y referencia
y el peso del fotorrealismo sin variar.&lt;/p&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th style=&quot;text-align: center&quot;&gt;Contenido&lt;/th&gt;
      &lt;th style=&quot;text-align: center&quot;&gt;Referencia&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;&lt;a title=&quot;Contetnido&quot; href=&quot;https://ricardoamata.github.io/images/in_lcc.jpg&quot;&gt;&lt;img src=&quot;https://ricardoamata.github.io/images/in_lcc.jpg&quot; alt=&quot;Contenido&quot; /&gt;&lt;/a&gt;&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;&lt;a title=&quot;Referencia&quot; href=&quot;https://ricardoamata.github.io/images/style_pasillo.jpg&quot;&gt;&lt;img src=&quot;https://ricardoamata.github.io/images/style_pasillo.jpg&quot; alt=&quot;Referencia&quot; /&gt;&lt;/a&gt;&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;Resultados:&lt;/p&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th style=&quot;text-align: center&quot;&gt;100&lt;/th&gt;
      &lt;th style=&quot;text-align: center&quot;&gt;500&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;&lt;a title=&quot;Resultado&quot; href=&quot;https://ricardoamata.github.io/images/pasillo_o0.png&quot;&gt;&lt;img src=&quot;https://ricardoamata.github.io/images/pasillo_o0.png&quot; alt=&quot;Resultado&quot; /&gt;&lt;/a&gt;&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;&lt;a title=&quot;Resultado&quot; href=&quot;https://ricardoamata.github.io/images/pasillo_o1.png&quot;&gt;&lt;img src=&quot;https://ricardoamata.github.io/images/pasillo_o1.png&quot; alt=&quot;Resultado&quot; /&gt;&lt;/a&gt;&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th style=&quot;text-align: center&quot;&gt;1000&lt;/th&gt;
      &lt;th style=&quot;text-align: center&quot;&gt;5000&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;&lt;a title=&quot;Resultado&quot; href=&quot;https://ricardoamata.github.io/images/pasillo_o2.png&quot;&gt;&lt;img src=&quot;https://ricardoamata.github.io/images/pasillo_o2.png&quot; alt=&quot;Resultado&quot; /&gt;&lt;/a&gt;&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;&lt;a title=&quot;Resultado&quot; href=&quot;https://ricardoamata.github.io/images/pasillo_o3.png&quot;&gt;&lt;img src=&quot;https://ricardoamata.github.io/images/pasillo_o3.png&quot; alt=&quot;Resultado&quot; /&gt;&lt;/a&gt;&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th style=&quot;text-align: center&quot;&gt;10000&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;&lt;a title=&quot;Resultado&quot; href=&quot;https://ricardoamata.github.io/images/pasillo_o4.png&quot;&gt;&lt;img src=&quot;https://ricardoamata.github.io/images/pasillo_o4.png&quot; alt=&quot;Resultado&quot; /&gt;&lt;/a&gt;&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;h2 id=&quot;el-peso-del-fotorrealismo&quot;&gt;El peso del fotorrealismo&lt;/h2&gt;

&lt;p&gt;Si por el contrario queremos una imagen que sea mas realista podemos aumentar el peso por el que
multiplicamos el factor fotorrealista ejemplo:&lt;/p&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th style=&quot;text-align: center&quot;&gt;Contenido&lt;/th&gt;
      &lt;th style=&quot;text-align: center&quot;&gt;Referencia&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;&lt;a title=&quot;Contetnido&quot; href=&quot;https://ricardoamata.github.io/images/in8.jpg&quot;&gt;&lt;img src=&quot;https://ricardoamata.github.io/images/in8.jpg&quot; alt=&quot;Contenido&quot; /&gt;&lt;/a&gt;&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;&lt;a title=&quot;Referencia&quot; href=&quot;https://ricardoamata.github.io/images/style8.png&quot;&gt;&lt;img src=&quot;https://ricardoamata.github.io/images/style8.png&quot; alt=&quot;Referencia&quot; /&gt;&lt;/a&gt;&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th style=&quot;text-align: center&quot;&gt;100&lt;/th&gt;
      &lt;th style=&quot;text-align: center&quot;&gt;1000&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;&lt;a title=&quot;Resultado&quot; href=&quot;https://ricardoamata.github.io/images/output_igls0.png&quot;&gt;&lt;img src=&quot;https://ricardoamata.github.io/images/output_igls0.png&quot; alt=&quot;Resultado&quot; /&gt;&lt;/a&gt;&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;&lt;a title=&quot;Resultado&quot; href=&quot;https://ricardoamata.github.io/images/output_igls1.png&quot;&gt;&lt;img src=&quot;https://ricardoamata.github.io/images/output_igls1.png&quot; alt=&quot;Resultado&quot; /&gt;&lt;/a&gt;&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th style=&quot;text-align: center&quot;&gt;10&lt;sup&gt;4&lt;/sup&gt;&lt;/th&gt;
      &lt;th style=&quot;text-align: center&quot;&gt;10&lt;sup&gt;5&lt;/sup&gt;&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;&lt;a title=&quot;Resultado&quot; href=&quot;https://ricardoamata.github.io/images/output_igls2.png&quot;&gt;&lt;img src=&quot;https://ricardoamata.github.io/images/output_igls2.png&quot; alt=&quot;Resultado&quot; /&gt;&lt;/a&gt;&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;&lt;a title=&quot;Resultado&quot; href=&quot;https://ricardoamata.github.io/images/output_igls3.png&quot;&gt;&lt;img src=&quot;https://ricardoamata.github.io/images/output_igls3.png&quot; alt=&quot;Resultado&quot; /&gt;&lt;/a&gt;&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th style=&quot;text-align: center&quot;&gt;10&lt;sup&gt;6&lt;/sup&gt;&lt;/th&gt;
      &lt;th style=&quot;text-align: center&quot;&gt;10&lt;sup&gt;7&lt;/sup&gt;&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;&lt;a title=&quot;Resultado&quot; href=&quot;https://ricardoamata.github.io/images/output_igls4.png&quot;&gt;&lt;img src=&quot;https://ricardoamata.github.io/images/output_igls4.png&quot; alt=&quot;Resultado&quot; /&gt;&lt;/a&gt;&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;&lt;a title=&quot;Resultado&quot; href=&quot;https://ricardoamata.github.io/images/output_igls5.png&quot;&gt;&lt;img src=&quot;https://ricardoamata.github.io/images/output_igls5.png&quot; alt=&quot;Resultado&quot; /&gt;&lt;/a&gt;&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;h2 id=&quot;como-influye-la-segmentación&quot;&gt;Como influye la segmentación&lt;/h2&gt;

&lt;p&gt;Como ya se dijo, se usa una mascara de segmentación para poder transferir el estilo
de la imagen de manera “inteligente”, por lo el resultado final dependerá mucho de la
segmentación que se utilice.&lt;/p&gt;

&lt;p&gt;A continuación se muestra un ejemplo usando dos segmentaciones distintas con una imagen
de contenido antes mostrada.&lt;/p&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th style=&quot;text-align: center&quot;&gt;Contenido&lt;/th&gt;
      &lt;th style=&quot;text-align: center&quot;&gt;Referencia&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;&lt;a title=&quot;Contetnido&quot; href=&quot;https://ricardoamata.github.io/images/in_lcc.jpg&quot;&gt;&lt;img src=&quot;https://ricardoamata.github.io/images/in_lcc.jpg&quot; alt=&quot;Contenido&quot; /&gt;&lt;/a&gt;&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;&lt;a title=&quot;Referencia&quot; href=&quot;https://ricardoamata.github.io/images/style_pasillo.jpg&quot;&gt;&lt;img src=&quot;https://ricardoamata.github.io/images/style_pasillo.jpg&quot; alt=&quot;Referencia&quot; /&gt;&lt;/a&gt;&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th style=&quot;text-align: center&quot;&gt;seg contenido&lt;/th&gt;
      &lt;th style=&quot;text-align: center&quot;&gt;seg estilo&lt;/th&gt;
      &lt;th style=&quot;text-align: center&quot;&gt;Resultado&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;&lt;a title=&quot;Segmentacion del contenido&quot; href=&quot;https://ricardoamata.github.io/images/in_lcc_seg.jpg&quot;&gt;&lt;img src=&quot;https://ricardoamata.github.io/images/in_lcc_seg.jpg&quot; alt=&quot;Segmentacion del contenido&quot; /&gt;&lt;/a&gt;&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;&lt;a title=&quot;Segmentacion del estilo&quot; href=&quot;https://ricardoamata.github.io/images/style_lcc_seg.jpg&quot;&gt;&lt;img src=&quot;https://ricardoamata.github.io/images/style_lcc_seg.jpg&quot; alt=&quot;Segmentacion del estilo&quot; /&gt;&lt;/a&gt;&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;&lt;a title=&quot;resultado&quot; href=&quot;https://ricardoamata.github.io/images/pasillo_o2.png&quot;&gt;&lt;img src=&quot;https://ricardoamata.github.io/images/pasillo_o2.png&quot; alt=&quot;resultado&quot; /&gt;&lt;/a&gt;&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th style=&quot;text-align: center&quot;&gt;seg contenido&lt;/th&gt;
      &lt;th style=&quot;text-align: center&quot;&gt;seg estilo&lt;/th&gt;
      &lt;th style=&quot;text-align: center&quot;&gt;Resultado&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;&lt;a title=&quot;Segmentacion del contenido&quot; href=&quot;https://ricardoamata.github.io/images/in_lcc_seg2.jpg&quot;&gt;&lt;img src=&quot;https://ricardoamata.github.io/images/in_lcc_seg2.jpg&quot; alt=&quot;Segmentacion del contenido&quot; /&gt;&lt;/a&gt;&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;&lt;a title=&quot;Segmentacion del estilo&quot; href=&quot;https://ricardoamata.github.io/images/style_lcc_seg2.jpg&quot;&gt;&lt;img src=&quot;https://ricardoamata.github.io/images/style_lcc_seg2.jpg&quot; alt=&quot;Segmentacion del estilo&quot; /&gt;&lt;/a&gt;&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;&lt;a title=&quot;resultado&quot; href=&quot;https://ricardoamata.github.io/images/output_seg.png&quot;&gt;&lt;img src=&quot;https://ricardoamata.github.io/images/output_seg.png&quot; alt=&quot;resultado&quot; /&gt;&lt;/a&gt;&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;h2 id=&quot;como-mejorar-el-resultado-obtenido&quot;&gt;Como mejorar el resultado obtenido&lt;/h2&gt;

&lt;p&gt;Para mejorar el resultado final es posible aplicar un smoothing a la imagen, por ejemplo
se podría pasar un filtro bilineal para eliminar los cambios bruscos de color sin perder
claridad de la imagen, también es bueno experimentar con diferentes valores del estilo y
el fotorrealismo, ya que para una imagen podrían dar buenos resultados pero para otra no.&lt;/p&gt;

&lt;h2 id=&quot;conclusiones&quot;&gt;Conclusiones&lt;/h2&gt;

&lt;p&gt;La transferencia de estilo fotorrealista es un resultado posible gracias a las redes
neuronales para el reconocimiento de imágenes, sin embargo es un método costoso
computacionalmente hablando, todas las pruebas que mostramos fueron hechas en usando
una tarjeta grafica nvidia tesla, el tiempo varia dependiendo de los tamaños de las
imágenes de entrada. Si quieres el la implementación usando tensorflow el repositorio
de github es &lt;a href=&quot;https://github.com/ricardoamata/deep-photo-styletransfer-tf&quot;&gt;este&lt;/a&gt; que
es un fork del repositorio de Louie Yang, es recomendable tener una buena tarjeta grafica
para ejecutar este programa, o correrlo desde alguna hpc.&lt;/p&gt;

&lt;p&gt;En este blog nos basamos en el articulo de &lt;a href=&quot;https://arxiv.org/abs/1703.07511&quot;&gt;Fujun Luan&lt;/a&gt;
donde si bien el algoritmo que propone es eficiente con el tiempo ha surgido nuevos
artículos que tratan de mejorar el método de Fujun y arreglar ciertos fallos que se puede
encontrar en las imágenes finales.&lt;/p&gt;</content><author><name>Ricardo E. Alvarado Mata</name></author><summary type="html"></summary></entry></feed>