Notice: Function _load_textdomain_just_in_time was called incorrectly. Translation loading for the wp-plugin-bluehost domain was triggered too early. This is usually an indicator for some code in the plugin or theme running too early. Translations should be loaded at the init action or later. Please see Debugging in WordPress for more information. (This message was added in version 6.7.0.) in /home1/spotsail/public_html/martra/wp-includes/functions.php on line 6114

Warning: Cannot modify header information - headers already sent by (output started at /home1/spotsail/public_html/martra/wp-includes/functions.php:6114) in /home1/spotsail/public_html/martra/wp-includes/rest-api/class-wp-rest-server.php on line 1893

Warning: Cannot modify header information - headers already sent by (output started at /home1/spotsail/public_html/martra/wp-includes/functions.php:6114) in /home1/spotsail/public_html/martra/wp-includes/rest-api/class-wp-rest-server.php on line 1893

Warning: Cannot modify header information - headers already sent by (output started at /home1/spotsail/public_html/martra/wp-includes/functions.php:6114) in /home1/spotsail/public_html/martra/wp-includes/rest-api/class-wp-rest-server.php on line 1893

Warning: Cannot modify header information - headers already sent by (output started at /home1/spotsail/public_html/martra/wp-includes/functions.php:6114) in /home1/spotsail/public_html/martra/wp-includes/rest-api/class-wp-rest-server.php on line 1893

Warning: Cannot modify header information - headers already sent by (output started at /home1/spotsail/public_html/martra/wp-includes/functions.php:6114) in /home1/spotsail/public_html/martra/wp-includes/rest-api/class-wp-rest-server.php on line 1893

Warning: Cannot modify header information - headers already sent by (output started at /home1/spotsail/public_html/martra/wp-includes/functions.php:6114) in /home1/spotsail/public_html/martra/wp-includes/rest-api/class-wp-rest-server.php on line 1893

Warning: Cannot modify header information - headers already sent by (output started at /home1/spotsail/public_html/martra/wp-includes/functions.php:6114) in /home1/spotsail/public_html/martra/wp-includes/rest-api/class-wp-rest-server.php on line 1893

Warning: Cannot modify header information - headers already sent by (output started at /home1/spotsail/public_html/martra/wp-includes/functions.php:6114) in /home1/spotsail/public_html/martra/wp-includes/rest-api/class-wp-rest-server.php on line 1893
{"id":2655,"date":"2023-02-20T19:11:58","date_gmt":"2023-02-20T19:11:58","guid":{"rendered":"https:\/\/martra.uadla.com\/?p=2655"},"modified":"2023-03-07T18:07:25","modified_gmt":"2023-03-07T18:07:25","slug":"tutorial-gan-2-crear-una-gan-para-imagenes-a-color","status":"publish","type":"post","link":"https:\/\/martra.uadla.com\/tutorial-gan-2-crear-una-gan-para-imagenes-a-color\/","title":{"rendered":"Tutorial GAN-2. Crear una GAN para im\u00e1genes a color."},"content":{"rendered":"\n

Este es el segundo art\u00edculo del Tutorial de Redes Generativas Adversarias. En el primero<\/a> se vio como crear una DCGAN para el Dataset MNIST. Es decir, im\u00e1genes de 28×28 en escala de Grises. En este subimos un peque\u00f1o pelda\u00f1o en la complejidad del Dataset y usaremos el Cifar-10<\/a>. Un dataset tambi\u00e9n muy conocido, de hecho es uno de los Datasets que vienen con Keras. Este dataset est\u00e1 compuesto por 6000 im\u00e1genes de 32×32 a color. <\/p>\n\n\n\n

Son im\u00e1genes un poco m\u00e1s grandes que las utilizadas en el primer art\u00edculo, pero sobre todo se introduce el color. Si hab\u00e9is llegado a este art\u00edculo buscando un tutorial de c\u00f3mo crear una GAN sencilla, no sufr\u00e1is, no hace falta que os le\u00e1is el art\u00edculo anterior<\/a>. <\/p>\n\n\n\n

Voy a empezar dando unas m\u00ednimas explicaciones comunes para entender c\u00f3mo funciona una GAN. Acto seguido pasaremos a ver el c\u00f3digo por partes y explicarlo. Finalmente, tendremos el c\u00f3digo completo de la GAN. <\/p>\n\n\n\n

Los que hab\u00e9is pasado por el primer art\u00edculo<\/a> y no quer\u00e9is dar un breve repaso os pod\u00e9is ir directamente a la secci\u00f3n \u00bfQu\u00e9 veremos de m\u00e1s? <\/strong><\/p>\n\n\n\n

\n

El c\u00f3digo fuente completo se encuentra en Kaggle, GitHub y Colab: <\/p>\n\n\n\n

https:\/\/www.kaggle.com\/code\/peremartramanonellas\/gan-tutorial-2-generating-color-images<\/a><\/p>\n\n\n\n

https:\/\/github.com\/oopere\/GANs\/blob\/main\/C2_GAN_CIFAR.ipynb<\/a><\/p>\n\n\n\n

https:\/\/colab.research.google.com\/drive\/1atITnzNEDKDIYhGArP2wN2FwFhCVNo2W<\/a><\/p>\n<\/blockquote>\n\n\n\n

Funcionamiento de una GAN.<\/h2>\n\n\n\n

Una GAN es una red neuronal, normalmente usada para generar im\u00e1genes, compuesta de dos redes: un generador y un discriminador. <\/p>\n\n\n\n

El Generador recibe una entrada de datos, que son sencillamente ruido. Datos aleatorios ordenados en una forma gaussiana. No sufr\u00e1is que es tan solo una llamada a una funci\u00f3n. Con esta entrada, genera una salida con el formato de la imagen que queremos crear. <\/p>\n\n\n\n

Vamos a generar el ruido a usar como entrada para el modelo Generador: <\/p>\n\n\n\n

test_noise = tf.random.normal([16, 100])<\/pre>\n\n\n\n

Esta sencilla llamada nos devuelve el ruido que podemos usar para el generador. Vemos que le estamos indicando que nos devuelva un array de 16 filas con 100 valores cada una. Estas 16 filas las utilizar\u00e1 el generado para crear 16 im\u00e1genes diferentes a partir del dato con 100 valores de longitud. Es decir, se necesita una fila para cada imagen a generar. <\/p>\n\n\n\n

El tama\u00f1o del ruido no tiene por qu\u00e9 ser 100. Es un valor arbitrario, algunos de los valores m\u00e1s usados son: 50, 100, 128, 1024\u2026 <\/p>\n\n\n\n

\n

Posiblemente, el mejor estudio que se ha realizado por el momento sobre el input noise de una GAN sea el realizado en 2020 por Manisha Pandala, Denoit Das, Sujit Gujar: Effect of input noise Dimension in GANs<\/a>. <\/p>\n<\/blockquote>\n\n\n\n

En el estudio se indica que para im\u00e1genes como las del Dataset Cifar-10, no se aprecian diferencias entre un valor de 100 y uno de 900, pero que con valores peque\u00f1os como 2 o 10 se pierde calidad y variedad en las im\u00e1genes generadas. <\/p>\n\n\n\n

El otro modelo que forma parte de la GAN, es el Discriminador. Este se encarga de decidir cuando una imagen pertenece al Dataset Original o es Falsa. El discriminador, como entrada, recibe una imagen, en este caso con el formato 32 x 32 x 3, y tiene una salida booleana que indica cuando la imagen es aut\u00e9ntica o falsa. <\/p>\n\n\n\n

Ambos modelos se entrenan juntos y modifican sus pesos en funci\u00f3n de la capacidad del discriminador para adivinar qu\u00e9 im\u00e1genes son verdaderas o falsas.<\/p>\n\n\n\n

La intenci\u00f3n del generador es crear im\u00e1genes que enga\u00f1en al discriminador. Mientras que el discriminador lo que busca es ser capaz de identificar siempre que im\u00e1genes son las generadas por el generador. <\/p>\n\n\n\n

\u00bfQu\u00e9 veremos de m\u00e1s?<\/h2>\n\n\n\n

Para los que ya hab\u00e9is pasado por el primer art\u00edculo, os explico un poco que veremos de m\u00e1s: <\/p>\n\n\n\n