Documentos de Académico
Documentos de Profesional
Documentos de Cultura
ELECTRÓNICO
EVALUACIÓN DE ARQUITECTURAS DE
APRENDIZAJE PROFUNDO PARA LA DETECCIÓN
DE ROYA NARANJA Y ROYA PARDA EN EL
CULTIVO DE CAÑA DE AZÚCAR
ELABORADO POR:
Ricardo Andrés Saavedra Burbano
DIRIGIDO POR:
Jorge Iván Marín Hurtado
2
CONTENIDO
1. INTRODUCCIÓN .............................................................................................................. 9
2. OBJETIVOS .................................................................................................................... 11
2.1 General ....................................................................................................................................... 11
2.2 Específicos ................................................................................................................................. 11
3. MARCO TEÓRICO .......................................................................................................... 12
3.1 LA ROYA EN LA CAÑA DE AZÚCAR .................................................................................. 12
3.1.1 Roya naranja de la caña de azúcar ................................................................. 12
3.1.2 Roya parda de la caña de azúcar .................................................................... 12
3.1.3 Presencia de roya naranja en el rio del Valle del Cauca, Colombia ............... 14
3.1.4 Diferencias entre roya naranja y roya parda en caña de azúcar .................... 15
3.2 REDES NEURONALES CONVOLUCIONALES (CNN) ........................................................ 16
3.2.1 Ataques adversarios ....................................................................................... 18
3.2.2 Visualización de pesos .................................................................................... 19
3.2.3 Redes generativas adversarias (GANs) ........................................................... 19
3.2.4 AlexNet ........................................................................................................... 20
3.2.5 Inception-v3 .................................................................................................... 22
3.2.6 Inception-ResNet v2 ....................................................................................... 24
3.3 IMAGENET ............................................................................................................................... 27
3.4 FUNCIÓN DE ACTIVACIÓN .................................................................................................. 27
3.4.1 Función Sigmoide ........................................................................................... 27
3.4.2 Función unidad lineal rectificada (ReLU) ........................................................ 28
3.4.3 Función de activación LeakyReLU .................................................................. 28
3.5 DROPOUT (Abandono) ............................................................................................................. 28
3.5.1 Descripción del modelo de dropout ............................................................... 28
3.6 DESCENSO DE GRADIENTE Y SUS VARIANTES .............................................................. 30
3.6.1 Descenso de gradiente por lote ..................................................................... 30
3.6.2 Descenso de gradiente estocástico ................................................................ 30
3.6.3 Descenso de gradiente por mini-lotes ........................................................... 30
3.7 Algoritmos de optimización del descenso de gradiente .............................................................. 31
3.7.1 AdaGrad .......................................................................................................... 31
3.7.2 Adadelta.......................................................................................................... 32
3.7.3 RMSProp ......................................................................................................... 33
3.7.4 Adam............................................................................................................... 33
4. MÉTODOS Y DESARROLLO DEL PROYECTO................................................................... 35
3
4.1 PREPARACIÓN DE ENTORNO DE TRABAJO Y CREACIÓN DE AMBIENTE DE
ENTORNO DE PROGRAMACIÓN ...................................................................................................... 35
4.2 RECOLECCIÓN DE BASE DE DATOS .................................................................................. 37
4.3 AUMENTO DE BASE DE DATOS .......................................................................................... 37
4.4 ELECCIÓN DEL TIPO DE ENTRENAMIENTO ..................................................................... 40
4.5 MÉTODOS PARA COMBATIR EL SOBREAJUSTE .............................................................. 40
4.6 ENTRENAMIENTO DE LA RED DESDE 0 ............................................................................ 46
4.6.1 Criterios de elección de caracteristicas de la red ........................................... 46
4.7 ENTRENAMIENTO MEDIANTE TRANSFERENCIA DE APRENDIZAJE .......................... 52
4.8 Ataques adversarios por conjuntos para análisis de robustez ...................................................... 54
5. RESULTADOS Y DISCUSIÓN ........................................................................................... 56
5.1 COMPARACIÓN DE MODELOS CON DIFERENTES HIPERPARÁMETROS PARA
ELABORACIÓN DE RED DESDE CERO ........................................................................................... 56
5.1.1 Optimizador como criterio de elección .......................................................... 56
5.1.2 Función de activación como criterio de elección: .......................................... 57
5.1.3 Adición de capas de abandono y regularización L1, L2 como criterio de
elección 58
5.2 PROCESO DE FORMACIÓN DE RED NEURONAL ELEGIDA CON CRITERIOS DE
SELECCIÓN .......................................................................................................................................... 61
5.2.1 Efecto de tamaño de lote en proceso de aprendizaje ................................... 63
5.2.2 Efecto de usar capas de abandono................................................................. 64
5.2.3 Medidas de dispersión de la red entrenada desde 0 ..................................... 70
5.3 RESULTADOS PARA COMBATIR EL SOBREAJUSTE CON TRANSFERENCIA DE
APRENDIZAJE DE LA RED INCEPTION V3 ..................................................................................... 71
5.3.1 Medidas de dispersión de la red con transferencia de aprendizaje Inception
v3 76
5.4 RESULTADOS PARA COMBATIR EL SOBREAJUSTE CON TRANSFERENCIA DE
APRENDIZAJE DE LA RED INCEPTIONRESNET V2 ...................................................................... 77
5.4.1 Medidas de dispersión para la red InceptionResNet v2................................. 80
5.5 COMPARACIÓN ENTRE MODELOS ..................................................................................... 80
5.6 ROBUSTEZ ANTE LOS ATAQUES ADVERSARIOS............................................................ 83
5.6.1 Ataques adversarios mediante método de signo de gradiente rápido (FGSM)
83
5.6.2 Resultados de vulnerabilidad ......................................................................... 88
6. CONCLUSIONES............................................................................................................. 94
7. REFERENCIAS ................................................................................................................ 96
8. ANEXOS ......................................................................................................................... 98
4
LISTADO DE FIGURAS
NOMBRE Pág.
5
Figura 33. Precisión con el conjunto de entrenamiento con distintas variantes de 60
regularización, entre paréntesis está el método de optimización que se usó
Figura 34. Pérdida con el conjunto de entrenamiento con distintas variantes de 61
regularización Entre paréntesis está el método de optimización que se usó
Figura 35. Precisión de entreno y validación con solo el regularizador L1 y optimizador 61
Adam
Figura 36. Diferencia entre perdidas de modelo sin regularización y con regularización 62
Figura 37. Lectura de conjunto de datos almacenado en el disco C 63
Figura 38. Muestra de imagen sana y enferma con sus respectivas etiquetas 63
Figura 39. Número de los diferentes conjuntos de datos para el entrenamiento de la red 63
Figura 40. Rendimiento de entreno y validación de la red sin agregar capas de abandono 67
Figura 41. Pérdida de entreno y validación sin agregar capas de abandono 67
Figura 42. Rendimiento de entrenamiento y validación al agregar capas de abandono 68
Figura 43. Pérdida en conjunto de datos de entreno y validación con capas de abandono 68
añadidas
Figura 44. Rendimiento de entrenamiento con conjunto de datos de validación y 69
entrenamiento con adición de abandono y regularización L2
Figura 45. Pérdida del conjunto de entrenamiento y validación con regularización L2 69
Figura 46. Resultado de rendimiento y pérdida en época 20 70
Figura 47. Pérdida y rendimiento de la red con el conjunto de prueba 71
Figura 48. Predicción realizada por la red mediante la adición de una nueva imagen 71
afectada por la roya
Figura 49. Número de imágenes predichas con éxito y sin éxito por el modelo 72
Figura 50. Rendimiento de validación y entrenamiento con 229 capas congeladas 75
(izquierda), pérdida de validación y entrenamiento con 229 capas congeladas (derecha)
Figura 51. Rendimiento de entreno y validación con 216 capas congeladas (izquierda), 76
pérdida de rendimiento y validación con 216 capas congeladas (derecha)
Figura 52. Pérdidas y precisión con el conjunto de prueba 77
Figura 53. Predicción realizada por la red con hoja de caña de azúcar sana 77
Figura 54. Rendimiento y pérdida de la red con el conjunto de prueba 80
Figura 55. Rendimiento de entrenamiento y validación con 768 capas congeladas 81
(izquierda), pérdida de rendimiento y validación con 768 capas congeladas (derecha)
Figura 56. Predicción correcta de la red de transferencia de aprendizaje 81
InceptionResNet v2 con imagen de roya en caña de azúcar
Figura 57. Comparación de precisión de red entrenada desde cero y redes con 82
transferencia de aprendizaje
Figura 58. Comparación de pérdidas entre redes entrenadas desde 0 y redes entrenadas 83
con transferencia de aprendizaje
Figura 59. Valores de media de precisión de entrenamiento y validación para las 3 redes 84
neuronales
Figura 60. Valores de media de pérdidas de entrenamiento y validación para las 3 84
Figura 61. Ataque adversario con método de signo de gradiente rápido a red desde cero 85
con épsilon = 0.2
Figura 62. Ataque adversario con método de signo de gradiente rápido a red desde cero 86
con épsilon = 0.1
Figura 63. Ataque adversario con método de signo de gradiente rápido a red desde cero 86
con épsilon = 0.07
Figura 64. Ataque adversario con método de signo de gradiente rápido a red desde cero 87
6
con épsilon = 0.06
Figura 65. Ataque adversario con método de signo de gradiente rápido a red desde cero 87
con épsilon = 0.05
Figura 66. Ataque adversario con método de signo de gradiente rápido a red desde cero 88
con épsilon = 0.04
Figura 67. Ataque adversario con método de signo de gradiente rápido a red desde cero 88
con épsilon = 0.03
Figura 68. Ataque adversario con método de signo de gradiente rápido a red desde cero 89
con épsilon = 0.02
Figura 69. Ataque adversario con método de signo de gradiente rápido a red desde cero 89
con épsilon = 0.01
Figura 70. Muestra de los primeros 20 ataques adversarios realizados a la red entrenada 91
desde cero con épsilon = 0.04
Figura 71. Muestra de los primeros 20 ataques adversarios realizados a la red con 92
transferencia de aprendizaje Inception v3 con épsilon = 0.04
7
LISTADO DE TABLAS
NOMBRE Pág.
8
1. INTRODUCCIÓN
9
En el aprendizaje profundo no siempre es fácil lograr la meta de obtener un modelo que
generalice. Dicho esto, se pueden evidenciar múltiples dificultades como: la numerosa
cantidad de parámetros de red, base de datos pequeña, escasa capacidad computacional y
tiempos largos de entrenamiento.
Otro de los problemas que se estudian en aprendizaje profundo es el que tiene que ver con
los ataques adversarios realizados a redes neuronales, los cuales tienen el fin de hacer que
la red neuronal muestre erróneamente una clase, este tipo de ataques adversarios han
significado un gran peligro para los sistemas de computación, sobre todo en lo que tiene
que ver con la seguridad.
El enfoque abordado en este trabajo de grado es el observar la robustez de los modelos
frente a la generación de ataques adversos. En la literatura, los estudios de robustez de
sistemas de aprendizaje profundo se han enfocado en una definición práctica de robustez
como el tamaño promedio de la perturbación adversaria mínima.
Bajo el marco de este proyecto final, se muestran resultados que resumen la dinámica de la
práctica, como por ejemplo, la visualización de gráficas de rendimiento de validación y
entrenamiento, gráficas correspondientes a la pérdida con el conjunto de datos de
entrenamiento y validación, y la generación de imágenes adversarias para poner a prueba la
robustez de cada uno de los modelos entrenados.
Este informe de proyecto de grado pretende mostrar en forma ordenada, el desarrollo de las
diferentes actividades que se llevaron a cabo para detectar imágenes con presencia de roya
naranja y roya parda, combatir el sobreajuste y generar imágenes adversarias con el fin de
probar las redes con su entrenamiento ya elaborado y observar si es posible engañarlas. Se
utilizaran 3 modelos de redes neuronales como lo son: el modelo formado a partir de la
adición de capas secuenciales, modelo de transferencia de aprendizaje a partir de la red
Inception v3, y finalmente el modelo de transferencia de aprendizaje con la red
InceptionResNet v2.
10
2. OBJETIVOS
2.1 General
2.2 Específicos
Explorar métodos que permitan combatir el sobreajuste en modelos pre entrenados y un modelo
entrenado desde cero
Analizar la robustez de una red neuronal profunda pre-entrenada mediante la generación de
imágenes adversarias.
11
3. MARCO TEÓRICO
En este capítulo se describen las características de las enfermedades en caña de azúcar que se
pretende identificar con este trabajo como lo son la roya parda y roya naranja. Seguidamente, se
presentarán detalles sobre las técnicas de aprendizaje profundo que fueron empleadas para la
construcción de este proyecto de grado.
La roya naranja es causada por el hongo Puccinia kuehnii E. J Butler. Los síntomas iniciales de la
roya naranja de caña de azúcar son lesiones minúsculas, elongadas y amarillas que forman una
aureola pálida, verde amarillento a medida que aumenta su tamaño. A medida que las lesiones
crecen pasa de naranja a naranja marrón oscuro, y las pústulas tienden a aparecer en la hoja de la
caña, a diferencia de la roya café, estas no llegan a ser marrón oscuro [1].
Es causada por el hongo Puccinia melanocephala H. Sydow y P. Sydow, el cual ataca el sistema
foliar y en caso de infección severa puede secar las hojas y producir pérdidas en el peso de la caña.
Los síntomas consisten inicialmente en pequeñas manchas cloróticas y alargadas de color
amarillento, visibles en ambos lados de la hoja, que al aumentar de tamaño, toman un color marrón
y se rodean de un halo amarillo pálido. Las lesiones forman pústulas en el envés, aunque pueden
también aparecer en el haz. Al ocurrir la rotura de la epidermis se liberan masas de esporas de color
anaranjado, las cuales son fácilmente diseminadas por el viento a grandes distancias [5].
La roya naranja y parda son enfermedades muy similares, sin embargo, la principal diferencia se
encuentra cuando aumentan de tamaño y se presenta una coloración marrón oscura en la roya parda
y una coloración más clara en la roya naranja. Las lesiones jóvenes de roya naranja nunca llegan a
ser café oscuro [6].
12
Figura 1. Síntomas de roya de café y roya naranja en la lámina foliar de la caña de azúcar.
Fuente: [6]
13
Figura 2. Síntomas de roya naranja y parda sobre el envés de una misma hoja.
Fuente: [6]
En las Figura 1 y 2 se muestran algunos ejemplos representativos que pueden determinar algunas
diferencias entre los dos tipos de roya.
3.1.3 Presencia de roya naranja en el rio del Valle del Cauca, Colombia
En Colombia se detectó en Julio del 2010 en la variedad CC 01- 1884, en el experimento de prueba
regional para zonas húmedas en el Ingenio La Cabaña.
Desde que se detectó la presencia de roya en el país Norteamericano en el año 2007 y con la
aparición de roya café en algunas variedades de Cenicaña, se empezó la búsqueda para lograr saber
si a Colombia llegaría este hongo.
En Enero del 2008, Cenicaña envió once muestras de hojas de diferentes variedades de CC con
síntomas de roya al laboratorio de Micología sistemática del servicio de investigación agrícola del
departamento de agricultura de los Estados Unidos en Beltsville, Maryland, a fin de determinar la
presencia de roya naranja mediante los análisis morfológicos y molecular, los resultados dieron solo
positivos para roya café.
En julio del 2010 se encontró que en el Ingenio la Castilla y la Cabaña se encontraron síntomas de
la enfermedad de roya naranja. Estas muestras se analizaron y se confirmaron los síntomas visual y
morfológicamente. En 82 variedades evaluadas en semilleros para zonas de humedad, semiseca y
piedemonte, 25 resultaron positivas para roya naranja.
14
Figura 3. Distribución de roya naranja en el mundo
Fuente: [7]
En la Figura 3 se muestra la distribución de roya naranja en los diferentes países a nivel mundial, en
color anaranjado se muestran los diferentes países afectados.
La caña de azúcar es atacada por dos especies de Puccinia: la roya parda causada por P.
melanocephala y la anaranjada por P. kuehnii. La primera ha prevalecido en el continente
Americano, mientras que la segunda en Asia y Oceanía. [8]
En la literatura se reportan diferencias entre la roya naranja y la roya parda en caña de azúcar según
un estudio realizado por Cenicaña, en donde se puede decir que la única manera de diferenciar estas
dos enfermedades atacadas por hongos diferentes es mediante el estudio realizado en un laboratorio.
Las lesiones de roya café generalmente son de color café y con el tiempo se vuelven café oscuro
con áreas necróticas. Al abrirse las pústulas dejan libres las esporas la cuales también tienen un
color café. En la roya naranja se presenta una lesión de color anaranjado que luego pasa a ser entre
anaranjado y café, y en ocasiones anaranjado brillante. Las pústulas dejan libres las esporas las
cuales son de color anaranjado a anaranjado marrón. Sin embargo, algunas lesiones viejas de ambas
royas pueden ser de color marrón y adquieren una morfología similar que las hace indiferenciables
a simple vista, siendo necesaria una prueba de laboratorio para establecer una diferencia clara.
Para la comparación morfológica, se utiliza microscopio de luz convencional, donde se observa el
tamaño y forma de las estructuras como los parafisos y uredosporas (ancho de la pared, largo y
color), disposición de espínulas en la uredospora. Las observaciones muestran que en la roya café se
15
detectan uredosporas con abundantes parafisos, mientras que en las otras muestras solo se detectan
las uredosporas en ausencia de parafisos. Las uredosporas en la roya naranja presentan un
pronunciamiento en la pared característico para el patógeno P.Kuehnii, diferente a las uredosporas
de la roya café que tienen una pared de grosor uniforme.
Figura 4. Lesiones en las hojas (A), (B) y (C) Roya naranja y (D), € y (F) Roya café
Fuente: [9]
En la Figura 4 se muestran resultados vistos en la investigación realizada en [9], en donde observan
algunas de las diferencias entre los hongos de roya parda y roya naranja mediante el uso del
microscopio.
Las redes neuronales convolucionales son un tipo de redes de Deep learning (aprendizaje
profundo), cuya característica primordial es realizar tareas de clasificación directamente a partir de
imágenes videos, textos o sonidos. En función de la aplicación, se pueden implementar redes
neuronales desde cero, lo que conlleva un proceso más largo comparado al uso de una red
convolucional ya existente, con el objetivo de realizar modificaciones en sus capas convolucionales
y sus capas de clasificación (CNN pre-entrenada). Este tipo de redes neuronales tienen 3
características principales las cuales son [10]:
16
Las redes neuronales convolucionales pueden tener decenas o cientos de capas. Se aplican filtros a
cada imagen de entrenamiento con distintas resoluciones y la salida de cada imagen convolucionada
se emplea para entrada a la siguiente capa. Se pueden tener filtros que van desde características
simples como bordes o brillo, a características más complejas que identifican la característica que se
busca. [10]
En una red convolucional, las capas más comunes son:
a) Capas de convolución: Capas en donde se hace pasar la imagen y el objetivo
primordial es la extracción de características mediante el uso de filtros con distintas
resoluciones.
b) Capas de activación: en redes neuronales se suelen utilizar diferentes capas que
contienen funciones de activación siendo las más comunes: ReLu, Sigmoide y tangente
hiperbólica. Estas funciones actúan sobre los datos haciendo que solo las características
activadas de acuerdo a la función prosigan a la siguiente capa.
c) Capas de agrupación: En estas se disminuye la dimensión de los datos en donde se
muestrea una representación de ellos, puede usarse Max Pooling (toma solo la entrada
máxima de una región fija de su capa convolucional) o Average Pooling (toma solo el
promedio de una región fija de su capa convolucional)
d) Capas de Clasificación: Esta es la última capa de la red profunda y es la que se encarga
de establecer las categorías de salida. Es una capa que se encuentra totalmente
conectada, generando un vector con el número de clases que se quieran identificar. Este
vector tiene las probabilidades para cada clase de cualquier imagen que se esté
analizando.
En las redes convolucionales, en cada capa se aprenden características diferentes [10].
17
3.2.1 Ataques adversarios
Los ataques adversarios en redes neuronales son uno de los problemas importantes a combatir,
debido a que estos tienen la función de llevar a que la red neuronal se equivoque en el proceso de
clasificación, estos ataques se realizan típicamente mediante la alteración de la información que
servirán de entrada a las redes de máquinas de aprendizaje.
Los ataques adversarios representan un gran problema para el campo de la inteligencia artificial,
principalmente en el área de seguridad en donde personas con conocimientos en la generación de
estos ataques adversarios pueden engañar a un sistema fácilmente. Este problema ha dado apertura
al campo de la investigación para elaborar sistemas capaces de detectar si un dato de entrada
pretende engañar a una red neuronal. [12]
Los ataques adversarios son entradas para los modelos de aprendizaje automático que un atacante
ha diseñado intencionalmente para provocar que el modelo cometa un error; son como ilusiones
ópticas para máquinas.
Figura 6. Imagen de la izquierda no se altera (autobús), imagen del centro (ruido), imagen
de la derecha alterada con ruido (avestruz)
Fuente: [12]
La Figura 6 muestra un ejemplo de ataque adversario realizado a una red neuronal mediante la
adición de ruido a la imagen original de la izquierda que es representada por un autobús. El proceso
de generación de imagen adversaria en este caso, muestra la alteración de los pixeles de la imagen
original mediante la adición de ruido, como se puede observar en la Figura 6, finalmente la imagen
de la derecha representa la sumatoria de la imagen original y el ruido añadido, el cual se observa en
la parte central de la imagen. Esta será la imagen que se le pasará a la red neuronal con el fin de
engañarla. Finalmente la red clasifica la figura alterada como una clase nueva la cual no
corresponde a la imagen original. En este ejemplo, el ruido realiza un cambio a los pixeles de la
imagen original y lleva a la red neuronal a clasificar la imagen como un avestruz.
El proceso de ataque adversario consiste en generar un ruido que lleva a la red a actualizar sus pesos
de tal forma que la clase deseada tenga mayor probabilidad. Es decir, se trata de un ruido que altere
los valores de pixeles necesarios para activar con mayor proporción ponderaciones encargadas de
clasificar a otra clase, además para ser un buen ataque adversario se debe parecer mucho a la
18
imagen original como se muestra en la figura en la parte de la derecha. A simple vista para un
humano, se consideraría un autobús, pero para la red será clasificada como un avestruz.
19
entrena G para maximizar la probabilidad de asignar la etiqueta correcta para ambos ejemplos de
entrenamiento y muestras desde G. Simultáneamente se entrena G para minimizar log (1 −
𝐺(𝐷(𝑧))):
En otras palabras D y G juegan un juego con la función 𝑉(𝐺, 𝐷):
En la práctica, la ecuación (1) no podría proveer el suficiente gradiente para que G aprenda bien, en
el comienzo del aprendizaje D puede rechazar muestras con alta confianza porque son claramente
diferentes de los datos de entrenamiento, en este caso log (1 − 𝐷(𝐺(𝑧))) se satura. El
entrenamiento de G minimiza log (1 − 𝐷(𝐺(𝑧))), se puede entrenar G para maximizar
log (𝐷(𝐺(𝑧))). Esta función objetivo resulta en el mismo punto fijo de la dinámica de G y D para
proveer gradientes mejores al comienzo del entrenamiento. [14]
3.2.4 AlexNet
La arquitectura de AlexNet, popularmente reconocida en el año 2012, cuyo autor Alex Krizhevsky,
es una red neuronal convolucional y publicada por Llya Sutskever y el consejero de doctorado de
Alex Krizhevsky, Geoffrey Hinton.
Esta red estuvo presente en el desafío de reconocimiento visual a gran escala de ImageNet [11] el
30 de Septiembre de 2012. La red logró un error entre los 5 primeros del 15.3% y fue la ganadora
de dicho concurso. Las principales características de esta red fueron la profundidad del modelo para
su alto rendimiento que computacionalmente era costoso pero factible debido a que se usaron
unidades de procesamiento de gráficos (GPU) en el proceso de entrenamiento.
Esta red tiene como principal objetivo resolver el problema de clasificación donde la entrada es una
imagen la cual será clasificada en una categoría de 1000 clases diferentes.
La composición de esta red neuronal está organizada de la siguiente manera:
Entrada: La entrada a AlexNet es una imagen RGB de tamaño 256 x 256. Esto significa
que todas las imágenes de entrada deberán tener el mismo tamaño, si la imagen no es de
256 x 256 deberá convertirse. En la Figura 8 se muestra un redimensionamiento que se
realiza para la red AlexNet el cual es un redimensionamiento de 256x256 ya que éste es el
tamaño de imágenes con el que trabaja esta red neuronal convolucional.
20
Figura 8. Redimensionamiento de imagen para AlexNet
Fuente:[15]
Arquitectura: AlexNet era mucho más grande que las CNN anteriores, con 60 millones de
parámetros y 650000 neuronas, la cual tomó de 5 a 6 días entrenar en dos GPU. La Figura 8
muestra cómo se conforma la arquitectura de AlexNet.
AlexNet cuenta con 5 capas convolucionales y 3 capas totalmente conectadas. Varias capas
convolucionales extraen características de la imagen. La primera capa convolucional tiene 96 filtros
y un tamaño de 11 x 11 x 3. Las primeras capas convolucionales son seguidas por las capas de
superposición máximas, encargadas de disminuir el tamaño de la imagen para así tener menor costo
computacional. La tercera, cuarta y quinta están conectadas directamente. La quinta capa
21
convolucional es seguida por una capa de superposición máxima superpuesta. La salida de la cual
entra a una serie de capas conectadas completamente. La segunda capa completamente conectada se
alimente en un clasificador de softmax con 1000 etiquetas de clase.
La no linealidad ReLU se aplica después de todas las capas de convolución y totalmente
conectadas. [13]
3.2.5 Inception-v3
22
Figura 10 Reducción de tamaño convencional (arriba a la izquierda), reducción de tamaño de
cuadricula eficiente (abajo a al izquierda), arquitectura detallada de reducción de tamaño de
cuadricula eficiente (derecha)
Fuente:[17]
La Figura 10 muestra una de las caracteristicas especiales de la red Inception v3, la cual muestra los
dos tipos de reducccion del tamaño de la imagen que se pueden realizar en la red neuronal inception
v3. En la parte superior izquierda se puede observar una reducción convencional mediante el uso de
Pooling cambiando una imagen de 35x35 a una de 17x17. En la parte inferior se muestra el tipo de
reducción eficiente en donde utiliza el principio de concatenación de características. Al final de un
proceso, une los filtros de convolución y los de reducción, permitiendo utilizar menos costo
computacional.
En la arquitectura de Inception v2 existen 42 capas de profundidad, con lo cual el costo de cálculo
es solo alrededor de 2.5 más alto que el de GoogLeNet y más eficiente que el de VGGNet. En la
arquitectura de inception se utiliza Batch Norm y ReLU despues de capas convolucionales.
23
Figura 11. Arquitectura de la red neruonal inception v3
Fuente: [17]
3.2.6 Inception-ResNet v2
Se inspira en el rendimiento de la red neuronal ResNet. La versión 1 de esta red tiene un costo
computacional similar al de Inception v3, mientras que la versión 2 de Inception-ResNet es similar
a Inception v4. Esta red introduce conexiones residuales a la salida de la operación de convolución.
Este modelo reconoce 1000 clases diferentes de objetos en el desafío de reconocimiento visual a
gran escala de ImageNet 2012. La entrada al modelo es una imagen de 299x299.
Redes ResNet combinan la arquitectura de la red Inception y redes residuales haciendo que el
rendimiento sea mejor a un costo computacional relativamente bajo. La arquitectura de la red se
presenta en la Figura 11.
24
Figura 12. Arquitectura Inception ResNet v2
Fuente: [18]
Un concepto útil en las redes Inception son los bloques residuales. La Figura 13 muestra un bloque
residual con el cual se da un aumento de profundidad con respecto a otro tipo de arquitecturas, este
aumento de profundidad (número de capas) brinda mejores resultados en el momento de generalizar
un conjunto de imágenes, siempre y cuando se cuente con un conjunto de datos grande [16].
25
Figura 13. Bloque residual de Inception (Inception-ResNet-A)
Fuente: [18]
Para que la adición residual funcione, la entrada y la salida después de la convolución deben tener
las mismas dimensiones. Por lo tanto, se usa convoluciones 1x1 después de las convoluciones
originales, para igualar los tamaños de profundidad (la profundidad aumenta después de la
convolución).
Para aumentar la estabilidad, se escalaron las activaciones residuales en un valor de alrededor de 0.1
a 0.3. La representación del escalamiento se puede observar en la Figura 14.
26
Figura 14. Escalamiento de activaciones por una constante
Fuente: [18]
3.3 IMAGENET
ImageNet es construida sobre la estructura jerárquica provista por WordNet. ImageNet tiene un
orden de 50 millones de imágenes etiquetadas. Los objetivos de ImageNet es proveer la mayor
exhaustiva y diversa cobertura de imágenes en el mundo. Contiene 12 sub-ramas (mamíferos,
carnívoros, caninos, perros, perros trabajando, vehículos, perros esquimales, arte, arte acuático,
veleros, botes, trimarán), las imágenes se encuentran esparcidas sobre 5247 categorías con un
promedio de 600 imágenes por cada categoría. [19]
3.4 FUNCIÓN DE ACTIVACIÓN
Las funciones de activación son funciones usadas en redes neuronales para calcular la suma
ponderada de entradas y sesgos, de los cuales son usados para decidir si una neurona puede ser
activada o no. Esto manipula los datos presentados a través de un procesamiento de gradiente
usualmente el descenso de gradiente y después produce una salida para la red neuronal, que
contiene los parámetros en los datos. La función de transferencia puede ser lineal o no lineal
dependiendo del uso, y son usadas para controlar la salida de las redes neuronales a través de
diferentes dominios como reconocimiento de objetos, clasificación, reconocimiento del habla,
segmentación, descripción y entendimiento de escenas, sistemas de detección de cáncer entre otros.
[20]
1
𝑓(𝑥) = ((1+𝑒𝑥𝑝−𝑥)) (2)
La función Sigmoide sufre inconvenientes que incluye gradientes agudos durante la propagación
hacia atrás desde las capas más profundas hasta las capas de entrada, saturación de gradientes,
27
convergencia lenta y ceros no centrados en la salida que causa que el gradiente se actualice y se
propague en diferentes direcciones.
𝑥𝑖 , 𝑠𝑖 𝑥𝑖 𝑥 ≥ 0
𝑓(𝑥) = max(0, 𝑥) = { (3)
0, 𝑠𝑖 𝑥𝑖 𝑥 < 0
𝑥𝑖 , 𝑠𝑖 𝑥𝑖 𝑥 ≥ 0
𝑓(𝑥) = 𝛼𝑥 + 𝑥 = { (4)
𝛼𝑥𝑖 , 𝑠𝑖 𝑥𝑖 𝑥 < 0
El sobreajuste un problema en las redes neuronales que tienen un gran número de parámetros, Las
grandes redes también son lentas de usar, lo que dificulta lidiar con el sobreajuste. El abandono es
un método que trata este problema, la idea clave es soltar aleatoriamente neuronas (a lo largo de sus
conexiones) durante el entrenamiento de la red neuronal, esto evita que las neuronas se adapten
demasiado. En el entrenamiento dropout muestrea un número exponencial de conexiones
“reducidas”. En el tiempo de prueba es fácil aproximar los efectos promedios de predicciones de
todas estas conexiones reducidas a usar una simple red no reducida que tiene pesos más pequeños.
Esto significa reducir el sobreajuste y da una mayor mejora sobre otros métodos de regularización.
28
Donde f es cualquier función de activación, por ejemplo, 𝑓(𝑥) = 1/(1 + exp(−𝑥)) con dropout, la
operación hacia adelante llegaría a ser:
𝑟𝑗 (𝑙) ∼ Bernoulli(p)
Donde * denota el producto de dos elementos. Para cualquier capa l, 𝑟 (𝑙) es un vector independiente
de Bernoulli para cada variable aleatoria de las cuales tiene la probabilidad p de ser 1. Este vector es
muestreado y multiplicado con la salida de la capa 𝑦 (𝑙) para crear la salida reducida 𝑦̃ (𝑙). Las salidas
reducidas son luego usadas como entradas de las próximas capas. Este proceso es aplicado a cada
capa, Esto equivale a muestrear una subred de una red más grande red. Para el aprendizaje, las
derivadas de la función de perdida son propagadas hacia atrás a través de la subred. A la misma vez
los pesos son escalados como 𝑊𝑡𝑒𝑠𝑡 (𝑙) = 𝑝𝑊 (𝑙), los resultados de la red neuronal son usados sin
dropout.
Figura 15. Comparación de la operación básica de la red estándar y la red con Dropout [21]
29
La Figura 15 muestra gráficamente una red neuronal estándar y una red a la que se le activa
abandono, siendo así el abandono una operación matemática realizada sobre las neuronas para ser
desactivadas de manera aleatoria en proceso de entrenamiento.
El descenso de gradiente es una manera de minimizar una función objetivo J (θ) parametrizada por
un modelo con el parámetro 𝜃 ∈ ℝ𝑑 para actualizar los parámetros en la dirección opuesta del
gradiente de la función objetivo ∇ 𝜃 𝐽(𝜃). La taza de aprendizaje η determina el tamaño de los pasos
para alcanzar un mínimo local. En otras palabras se sigue la dirección cuesta debajo de la superficie
creada por la función objetivo hasta alcanzar un valle.
Hay 3 variantes de descenso de gradiente que difieren en cuantos datos se usarán para computar el
gradiente de la función objetivo. Dependiendo de la cantidad de datos se hace un intercambio entre
la precisión de los parámetros actualizados y el tiempo que toma en realizar una actualización. [22]
𝜃 = 𝜃 − 𝜂 · 𝛻𝜃 𝐽(𝜃) (7)
Con esto se necesita calcular los gradientes para toda la base de datos, se realiza una sola
actualización, el descenso de gradiente por lote suele ser muy lento e intratable en conjuntos de
datos que no se ajustan en memoria.
El descenso de gradiente por lote hace una redundancia computacional para grandes conjuntos de
datos. SGD quita esta redundancia realizando una actualización a la vez. Es entonces usualmente
este un método más rápido. SGD se utiliza en actualizaciones con alta varianza que hace que la
función objetivo fluctúe fuertemente.
De esta manera reduce la varianza de los parámetros actualizados, lo cual lleva a una convergencia
más estable, tamaños comunes de mini-lotes comunes están entre 50 y 256, pero puede variar para
diferentes aplicaciones. El optimizador SGD es también empleado cuando se usa mini-lotes
30
Hay que tener en cuenta que en este algoritmo se debe escoger una taza de aprendizaje correcta con
el fin de que se pueda converger y no se demore en hacerlo. Una taza muy pequeña hace que sea
muy lenta la convergencia, mientras que una taza demasiado grande haría que no se dé la
convergencia. [22].
3.7.1 AdaGrad
AdaGrad es un algoritmo de optimización basado en gradiente, este adapta la taza de aprendizaje a
los parámetros, realizando actualizaciones más grandes para parámetros poco frecuentes y
actualizaciones más pequeñas para parámetros frecuentes. AdaGrad mejora en gran manera la
robustez de SGD y es usado a gran escala en entrenamientos de Google. Previamente se realiza una
actualización para todos los parámetros 𝜃 a la vez como todos los parámetros 𝜃𝑖 usados en la misma
taza de aprendizaje 𝜂. Como AdaGrad usa una taza de aprendizaje diferente para todos los
parámetros 𝜃𝑖 en todo el paso del tiempo t, primero se muestra una actualización por parámetros,
que luego se vectoriza. Por brevedad se configura 𝑔𝑡,𝑖 para ser el gradiente de la función objetivo
con respecto a los parámetros 𝜃𝑖 en el paso de tiempo:
La actualización SGD para todos los parámetros 𝜃𝑖 en cada paso de tiempo t llega a ser:
En esta regla de actualización, AdaGrad modifica la taza de entrenamiento general 𝜂 en cada paso
de tiempo t para todos los parámetros 𝜃𝑖 basado en los gradientes pasados que han sido computados
por 𝜃𝑖 :
𝜂
𝜃𝑡+1,𝑖 = 𝜃 𝑡,𝑖 − · 𝑔𝑡,𝑖 (12)
√𝐺𝑡,𝑖𝑖 + 𝜖
𝐺𝑡 ∈ ℝ𝑑𝑥𝑑 Aquí esta una matriz diagonal donde cada elemento de la diagonal 𝑖, 𝑖 es la suma de los
cuadrados de los gradientes con respecto a 𝜃𝑖 hasta el paso del tiempo t, mientras que 𝜖 es un
término suavizado que evita la división por 0 (usualmente en el orden de 1e – 8). De manera
interesante sin la operación de raíz cuadrada, el algoritmo empeora.
Como 𝐺𝑡 contiene la suma de los cuadrados de los pasados gradientes con respecto a todos los
parámetros 𝜃 a lo largo de esta diagonal, podemos vectorizar realizando una multiplicación
elemento-inteligente-matriz-vector entre 𝐺𝑡 y 𝑔𝑡 :
𝜂
𝜃𝑡+1 = 𝜃 𝑡 − . 𝑔𝑡 (13)
√𝐺𝑡 + 𝜖
31
Uno de los beneficios de AdaGrad es que elimina la necesidad de ajuste manual de la taza de
aprendizaje. Más Las implementaciones usan un valor predeterminado de 0.01 y lo dejan así.
La principal debilidad de AdaGrad es que acumula el cuadrado de los gradientes en el
denominador: ya que cada término agregado es positivo, la suma acumulada se mantiene creciente
durante el entrenamiento. Esto a su vez causa que la taza de aprendizaje disminuya y eventualmente
llegue a ser infinitamente pequeña, en este punto el algoritmo ya no es capaz de adquirir
conocimiento adicional. [22]
3.7.2 Adadelta
Adadelta es un método de taza de aprendizaje por dimensión, este método se adapta dinámicamente
con el tiempo usando solo información de primer orden y tiene una sobrecarga computacional
mínima comparado al descenso de gradiente estocástico. El método no requiere ajuste manual de la
taza de aprendizaje y parece robusto a información de gradiente ruidosa. [23]
Este método es una extensión de AdaGrad que busca reducir su agresividad monotónicamente
reduciendo la taza de aprendizaje, en vez de acumular el gradiente de todos los cuadrados de los
gradientes cuadrados, Adadelta restringe la ventana de gradientes pasados acumulados a un tamaño
fijo w. En lugar de almacenar ineficientemente gradientes cuadrados previos w, la suma de los
gradientes es recursivamente definida como una caída promedio de todos los gradientes cuadrados
pasados. El promedio de funcionamiento 𝐸[𝑔]2 𝑡 en el paso de tiempo t entonces depende (como
una fracción γ similar al término de momentum) solo en el anterior promedio y el gradiente actual:
El conjunto 𝛾 con un valor similar al término de momentum, alrededor de 0.9. Para mayor claridad
ser reescribe la actualización SGD en términos del vector de actualización de parámetros ∆𝜃𝑡 :
∆𝜃𝑡 = −𝜂 · 𝑔𝑡,𝑖
𝜃𝑡+1 = 𝜃𝑡 + ∆ 𝜃𝑡 (15)
Ahora simplemente se reemplaza la matriz diagonal 𝐺𝑡 con el promedio de caída sobre gradientes
cuadrados anteriores 𝐸[𝑔]2 𝑡 :
𝜂
∆𝜃𝑡 = − . 𝑔𝑡 (17)
√𝐸[𝑔2 ]𝑡 + 𝜖
Como el denominador es solo la raíz cuadrática media (RMS) criterio de error del gradiente, se
puede reemplazar esto con el criterio abreviado.
𝜂
∆𝜃𝑡 = − . 𝑔𝑡 (18)
𝑅𝑀𝑆[𝑔]𝑡
32
Los autores notan que las unidades en esta actualización (tan bien como en SGD, momentum o
AdaGrad) no coinciden, es decir la actualización debería tener las mismas unidades hipotéticas
como el parámetro. Para realizar esto, ellos primero definen otro promedio de caída exponencial
esta vez no de gradientes al cuadrado, sino de actualizaciones de parámetros al cuadrado.
𝑅𝑀𝑆[∆𝜃]𝑡−1
∆𝜃𝑡 = − (21)
𝑅𝑀𝑆[𝑔]𝑡
Con Adadelta no se necesita establecer una taza de aprendizaje predeterminada, ya que ha sido
eliminada la regla de actualización. [22]
3.7.3 RMSProp
RMSProp es un inédito método de taza de aprendizaje adaptativo propuesto por Geoffrey Hinton.
RMSProp y Adadelta han sido desarrollados independientemente al mismo tiempo con la necesidad
de resolver la taza de aprendizaje que disminuye radicalmente en AdaGrad. RMSProp de hecho es
idéntico al primer vector de actualización de Adadelta que se derivó arriba:
𝜂
𝜃𝑡+1 = 𝜃𝑡 − (24)
√𝐸[𝑔2 ]𝑡 +𝜖
RMSProp también divide la taza de aprendizaje por un exponencialmente promedio de caída del
cuadrado de gradientes. Hinton sugiere γ ser configurado a 0.9, mientras un buen valor
predeterminado para la taza de aprendizaje 𝜂 0.001. [22]
3.7.4 Adam
La estimación del momento adaptativo (Adam) es otro método que calcula tazas de aprendizaje de
forma adaptativa para cada parámetro. Además de almacenar un promedio de caída exponencial del
cuadrado de gradientes pasados 𝜈𝑡 como Adadelta y RMSProp, Adam también mantiene un
promedio de caída exponencial de los gradientes pasados 𝑚𝑡 , similar al momentum:
33
𝑚𝑡 = 𝛽1 𝑚𝑡−1 + (1 − 𝛽1 )𝑔𝑡
𝑚𝑡 Y 𝜈𝑡 son estimaciones del primer momento (la media) y el segundo momento (varianza no
centrada) de los gradientes respectivamente, por lo tanto el nombre del método. Como 𝑚𝑡 Y 𝜈𝑡 son
inicializados como vectores de 0, son parcialmente 0 especialmente durante la etapa del tiempo
inicial, y especialmente cuando la taza de caída es pequeña (es decir con 𝛽1 y 𝛽2 cercanos a 1).
Contrarrestan estos sesgos calculando sesgos corregidos de estimaciones de primer y segundo
momento:
𝑚𝑡
𝑚
̂=
1 − 𝛽𝑡1
𝑣𝑡
𝜈̂𝑡 = (26)
1−𝛽 𝑡 2
Luego los usa para actualizar los parámetros tal como se observa en Adadelta y RMSProp, lo cual
produce la regla de actualización de Adam:
𝜂
𝜃𝑡+1 = 𝜃𝑡 − 𝑚
̂𝑡 (27)
̂+𝜖
√𝜈 𝑡
Los autores proponen valores predeterminados de 0.9 para 𝛽1 , 0.999 para 𝛽2 , y 10−8 para 𝜖. Ellos
muestran empíricamente que Adam trabaja bien en la práctica y se compara favorablemente con
otros métodos de aprendizaje adaptativo. [22]
34
4. MÉTODOS Y DESARROLLO DEL PROYECTO
En el presente trabajo se llevaron a cabo una serie de pasos y estrategias que permitieron alcanzar
los objetivos principales propuestos, en donde se tuvo como principal herramienta de desarrollo el
lenguaje de programación Python. En la actualidad es uno de los lenguajes de programación más
utilizados en trabajos de inteligencia artificial y visión de máquina teniendo la ventaja ser fácil de
manejar y de código abierto. Para este trabajo se empleó la versión de Python 3,7.
La metodología que se llevó a cabo consta de 6 pasos los cuales se enumeran de la siguiente
manera:
1. Preparación de entorno de trabajo y creación de ambiente de programación
2. Recolección de base de datos
3. Aumento de base de datos
4. Elección del tipo de entrenamiento
5. Métodos para combatir el sobreajuste
6. Entrenamiento de red desde 0
7. Entrenamiento mediante transferencia de aprendizaje:
8. Generación de imagen adversaria para atacar las redes neuronales entrenadas
En las siguientes secciones se presenta detalladamente la forma como se desarrolló cada una de
estas etapas de la metodología propuesta.
Python
Anaconda Navigator
Jupyter Notebook
Con la obtención de Python se empieza a formar la base de estructura de trabajo a utilizar para el
presente proyecto.
Una vez instalada la versión de Python 3.7 se procede a la instalación de Anaconda Navigator en su
versión 1.9.7. Anaconda Navigator es una interfaz gráfica de usuario de escritorio incluida en
Anaconda que permite iniciar aplicaciones y administrar fácilmente los paquetes, entornos y canales
de Anaconda sin la necesidad de usar comandos. [24]
35
Anaconda Navigator cuenta con la ventaja de crear nuevos ambientes de trabajo mediante la
consola denominada Anaconda Prompt el cual es un programa que se instala junto con la interfaz de
usuario Anaconda Navigator.
Con la oportunidad de crear nuevos ambientes de trabajo se puede tener proyectos con las librerías
necesarias para la ejecución del trabajo que se desee implementar.
El cuaderno de programación utilizado disponible en Anaconda Navigator que se escogió fue
“Jupyter Notebook” el cual es una aplicación web de código abierto y tiene una estructura fácil de
usar en donde se pueden separar bloques de código para ser compilados independientemente.
La ventaja con la que cuenta el uso de Jupyter notebook dentro del programa denominado
Anaconda Navigator es que permite realizar las descargas de las diferentes librerías mediante su
interfaz, en donde se puede observar que dependencias están o no instaladas. De forma alternativa,
se pueden descargar las librerías mediante la consola de Python con el comando pip install seguido
del nombre de la librería.
La interfaz de programación de aplicaciones (API) que se usó es KERAS [18] la cual es una API de
redes neuronales de alto nivel, está escrita en lenguaje Python y es capaz de ejecutarse sobre otras
librerías como lo es TensorFlow, CNTK o Theano [24].
Para finalizar esta sección se debe decir que fue necesario realizar un redimensionamiento de las
imágenes por motivo de memoria y capacidad de cómputo limitada. Se decidió trabajar con un
tamaño de imagen de 100 x 100 en donde se mostrarían buenos resultados. Se trató de igual forma
trabajar el tamaño que usan redes grandes como lo es un tamaño de 224 x 224 o 299 x 299, pero la
memoria con la que se cuenta no fue lo suficientemente grande para soportar dichos tamaños
haciendo imposible llegar a la fase de entrenamiento.
36
En la Figura 16 se muestra el formato de programación que se usó para poder entrenar los diferentes
modelos de aprendizaje profundo. Es un formato visto desde diferentes niveles, en donde el nivel 0
corresponde al lenguaje de programación Python, seguido del nivel 1 en donde se usó la biblioteca
de TensorFlow la cual tiene la capacidad de calcular automáticamente las derivadas parciales de la
función de coste, en el nivel 2 se encuentra la API de Keras la cual trabaja sobre TensorFlow y
representa una interfaz de alto nivel en donde permitió facilitar la configuración de los modelos
vistos, en un nivel 3 se encuentra la biblioteca Scikit_learn la cual tiene un formato de
programación de más alto nivel debido a que se pueden cargar directamente modelos de
aprendizaje, sin embargo esta biblioteca no se usó en este trabajo.
En cuanto a la recolección de la base de datos cabe resaltar que fue una tarea minuciosa en donde se
tomaron imágenes de internet con la búsqueda de hojas de caña de azúcar con roya naranja, roya
parda y hojas sanas. Estas imágenes se obtuvieron de diferentes sitios web de agricultura, los cuales
trabajan con este tipo de enfermedad, y tomadas de las páginas de centros de investigación
importantes como CENICAÑA, el cual es uno de los centros más importantes del territorio
Colombiano [5]. De igual manera se recolectó imágenes de visitas a 4 cultivos de caña de azúcar en
la ciudad de Tuluá, ubicada en el Valle del Cauca con el objetivo e recolectar imágenes con ningún
tipo de mancha sospechosa. La base de datos recolectada tuvo un tamaño total de 820 imágenes en
el rango del visible, de las cuales 410 contienen imágenes de hoja de caña de azúcar sana y 410 de
hojas afectadas por la enfermedad. En esta recolección se verificó con cuidado que la imagen
correspondiera a hojas sanas o enfermas con el objetivo de tener una base de datos coherente con la
realidad.
En aprendizaje profundo, es muy importante contar con un conjunto de entrenamiento grande para
que la red neuronal pueda entrenarse bien y de esta manera poder alcanzar más fácil el punto de
generalización con nuevas imágenes. Aunque precisamente ese es el ideal buscado, en ocasiones es
difícil encontrar la capacidad de generalización, teniéndose que recurrir al uso de estrategias de
control de los datos y manipulación de la red, como también numerosos procesos de
experimentación en donde se entrene la red. Lo anterior, consume tiempo en horas o quizá días
dependiendo de la capacidad de cómputo con la que se cuente. [25]
El aumento de datos es un recurso que fue necesario implementar para el presente proyecto, con el
fin de evitar el sobreajuste, problema en el cual la red neuronal memoriza los datos de
entrenamiento. Es comúnmente encontrar que una red con muchas capas generalice bien, sin
embargo no siempre es así, ya que todo depende de la manera en la que una red neuronal esté
configurada, con lo cual es posible combatir el sobreajuste. [26]
El aumento de datos se realizó utilizando 4 modificaciones a las imágenes base recolectada. A
continuación se presenta un diagrama en donde se muestra la manera que se realizó este
procedimiento:
37
Aumento de base
de datos
En la Figura 17, se muestra en paréntesis el número de imágenes con las que se cuenta en cada
momento del proceso de aumento. Teniendo un total de 9840 imágenes, 4920 de sanas y 4920 de
imágenes con la enfermedad.
En Python se implementaron 4 programas que permiten leer el conjunto de datos de imágenes sanas
y enfermas, y a partir de ellas generar las nuevas imágenes de reflejo vertical, reflejo horizontal,
aumento de nitidez y aumento de contraste. Estas nuevas imágenes se guardan con su nombre
representativo de sanas o enfermas para poderlas dividir en dos carpetas diferentes.
Una muestra de argumento de datos mediante estos 4 métodos se puede observar de la siguiente
manera:
38
Figura 18. Aumento de datos por reflejo vertical (imagen superior), aumento de datos por reflejo
horizontal (imagen inferior)
Fuente: Autor
Se puede observar que, en la Figura 18 se produce un efecto de espejo vertical y horizontalmente a
la imagen original, como una de las técnicas usadas para incrementar la base de datos.
Tanto el aumento de datos por reflejo como el de contraste y nitidez, como las mostradas en la
Figura 19, se implementaron en un proyecto nuevo de trabajo en Python en donde se hizo una
duplicación de la base de datos por cada método aplicado. Estas imágenes se guardan en el mismo
directorio en donde se ejecuta el programa. Una vez generadas las nuevas fotos se integran todas las
nuevas imágenes en una sola carpeta para luego ser procesadas por la red neuronal.
Figura 19. Aumento de datos por aumento de nitidez (imagen superior), aumento de datos por
aumento de contraste (imagen inferior)
Fuente:Autor
39
4.4 ELECCIÓN DEL TIPO DE ENTRENAMIENTO
CONJUNTO DE DATOS
conjunto de
validacion ; 10%
conjunto de
prueba; 10%
conjunto de
entrenamiento;
80%
En esta sección se describirán algunos métodos utilizados para evitar que la red neuronal reconozca
los datos de entrada, siendo estos determinantes en cualquier tipo de modelo.
Estos métodos están sometidos a una serie de pruebas y experimentos de entrenamiento en donde se
evalúa con qué condiciones el modelo se comporte mejor. Algunos de estos métodos más usados y
que se implementaron para el desarrollo de este proyecto son:
40
a. Aumento de datos:
Como ya se describió anteriormente, el conjunto de datos es muy importante para que la red
pueda aprender bien y no se vea en problemas de sobreajuste o incluso sub-ajuste. Por lo
cual, se procedió a realizar un aumento de datos mediante aumento de contraste, aumento de
nitidez, cambios de posiciones tanto horizontales como verticales, llegando a tener un total de
9840 imágenes [25], mucho mejor que las 820 recolectadas inicialmente.
Este conjunto de datos se hubiese podido ampliar aún más, sin embargo hay que tener en
cuenta que es muy importante que las imágenes nuevas que se generen tengan características
relevantes.
Otro método que es muy importante resaltar corresponde al que ofrece Keras mediante la
función “ImageDataGenerator” en donde se puede llevar a cabo un aumento de datos justo en
el momento de entrenamiento mediante la modificación de la imagen como: giro, rotación,
corte, brillo, zoom, y desplazamiento. Para este caso, no se habilitan las opciones de aumento
por generación de imágenes por reflejo horizontal y vertical porque este proceso se lo realizó
anteriormente, pero si se habilita el aumento por desplazamiento vertical y horizontal, zoom y
corte.
b. Añadir capas de abandono:
Las capas de abandono son una de los métodos más eficientes para controlar el sobreajuste si
se utiliza correctamente. Estas tendrán la función de desactivar aleatoriamente algunas
neuronas solo en el proceso de entrenamiento (propagación hacia adelante y hacia atrás). Con
este método se puede evitar que la red memorice las características de entrada y no pueda
generalizar con nuevos datos. La Figura 21 explica concretamente cómo funciona el
adicionar capas de abandono:
41
En Keras se usa capa de abandono con el parámetro de porcentaje de neuronas que se deseen
desactivar durante el proceso de aprendizaje, para lo cual se sigue la recomendación brindada
por el documento [21], en el cual se muestra que para capas de entrada suele usarse un valor
de 30% de deserción o abandono y para capas ocultas o finales se pueden usar valores de 20 a
50%.
En Keras el comando para añadir una capa de abandono se podrá utilizar con: model.add
(Dropout (0.5)) en donde se establecería una deserción del 50% al final de la capa en la que
se introduzca tal función.
En este proyecto, para cada uno de los modelos que se utilizó, se introdujeron capas de
abandono en donde se probaron diferentes rangos desde el 25% hasta el 50%, siendo este
último el porcentaje de deserción que se implementaría en los modelos en donde se transfería
el aprendizaje, y se dejó un porcentaje de 25% en el modelo que se entrenó desde 0.
c. Añadir regularización:
𝜆 ∑|𝑊𝑗| 𝜆 ∑ 𝑊𝑗 2
𝐽=0 𝑗=0
Penalización L1 Penalización L2
Figura 22. Penalidades de los dos tipos de regularizadores
42
Fuente: [30]
En la Figura 22 se puede observar la forma en que cada regularización actúa sobre los pesos
de la red neuronal.
Según [24], se recomienda usar regularización L1 para problemas de variables dispersas (con
muchos valores de 0), sin embargo para este caso se presentan variables con muchos valores
diferentes de 0 por lo cual el tipo de regularización sería el de L2, con el cual tan solo
disminuirá el valor de las ponderaciones sin llevarlas completamente a 0. Con la
regularización L2 se busca reducir la pérdida y también la complejidad del modelo. Esta
regularización se verifica la suma de los cuadrados de los pesos, en donde si el valor de la
ponderación del peso está cercano a 0, esta no tendrá mucho impacto, sin embargo, cuando
esta es atípica, es en donde su valor aumenta considerablemente, por lo cual se realizará una
disminución a esas ponderaciones que afectan la precisión al momento de validar con el
conjunto de prueba. [29]
En este proyecto, la regularización L2 se introdujo tanto para ser entrenado desde 0 como
también a los modelos con transferencia de aprendizaje. Estas penalizaciones se ingresaron a
las capas de convolución y a capas densas, las cuales aportan más parámetros a la red y
mayor complejidad.
d. Ajuste del tamaño de lote (BATCH SIZE) para cada iteración:
Otra de las características a tener en cuenta antes de entrenar un modelo con los datos
recolectados, es el conjunto de lotes que se envíen por cada iteración. En el documento [31]
se analiza el efecto del tamaño de lotes en el rendimiento de entrenamiento, mostrando que es
uno de los factores más importantes a tener en cuenta y que los profesionales de aprendizaje
profundo prefieren usar lotes más grandes debido a aceleraciones computacionales a partir
del paralelismo de la GPU. Sin embargo, usar un lote muy grande lleva a que se pierda
generalización lo cual es un caso que se encuentra en estudio.
Con base en lo anterior, se realizaron diversas pruebas con diferentes BATCH SIZE en donde
se usaron valores pequeños y grandes. Finalmente, se visualizó el rendimiento en
entrenamiento y en validación para luego escoger con cual tamaño de lote se comporta mejor
el modelo y que pueda generalizar mejor.
43
Para los modelos de aprendizaje por transferencia se implementaron paradas tempranas con
el fin de evitar el sobreajuste en posteriores épocas y se guardó el modelo con el mejor
rendimiento mediante el uso de puntos de control.
En Python la implementación de parada temprana y puntos de control se hace mediante los
comandos ilustrados en la Figura 23.
Figura 23. Adición de parada temprana y puntos de control con modelo de transferencia
de aprendizaje InceptionResNetV2
Fuente: Autor
Existen algunos criterios para utilizar la parada temprana (early stopping), la mayoría de ellos
basados en alguna métrica de error tal como [32]:
𝑚𝑖𝑛
𝐸𝑜𝑝𝑡 (𝑡) = 𝐸 (𝑡 ′ ) (28)
𝑡 ′ ≤ 𝑡 𝑣𝑎
44
Ahora se define la pérdida de generalización en la época t para ser el incremento relativo del
error de validación por encima del mínimo hasta ahora (en porcentaje):
𝐸𝑣𝑎(𝑡)
𝐺𝐿(𝑡) = 100. ( − 1) (29)
𝐸𝑜𝑝𝑡 (𝑡)
Una alta pérdida de generalización es una clara razón para detener el entrenamiento, porque
esto directamente indica sobreajuste. Esto conduce al primer criterio de parada temprana:
detenerse tan pronto como la pérdida de generalización exceda cierto umbral. Se define
la clase 𝐺𝐿∝ como:
Esto es, responder la pregunta “¿cuánto fue el error de entrenamiento promedio más grande
que el error de entrenamiento mínimo durante una banda?”. Hay que detallar que esta medida
de progreso es alta para fases inestables de entrenamiento, donde el error del conjunto de
entrenamiento sube en vez de bajar, porque muchos algoritmos de entrenamiento algunas
veces producen “inestabilidad” por tener escalas de pesos inapropiadas. La medida del
progreso es garantía de parada en entrenamientos largos, a menos que el entrenamiento sea
globalmente inestable.
𝐺𝐿(𝑡)
𝑃𝑄∝ : parada después de la primera finalización de banda de la época t con >∝
𝑃𝑘 (𝑡)
Una clase de criterio completamente diferente en parada temprana depende solo de los signos
de los cambios en el error de generalización, se define entonces un tercer criterio de
parada temprana: parar cuando el error de generalización incrementa en s bandas
sucesivas [32].
𝑈𝑃𝑆 : Parar después de la época t si 𝑈𝑃𝑆−1 para después de la época t-k y 𝐸𝑣𝑎 (𝑡) > 𝐸𝑣𝑎 (𝑡 − 𝑘)
45
𝑈𝑃1 : Parada después de la primera finalización de banda de la época t con 𝐸𝑣𝑎 (𝑡) > 𝐸𝑣𝑎 (𝑡 −
𝑘)
La idea detrás de esta definición es que cuando el error de validación ha aumentado, no solo
una vez sino durante s consecutivas bandas, se considera que tales aumentos son el comienzo
del final del sobreajuste independientemente de su incremento. El criterio UP tiene la ventaja
de medir cambios localmente, así ellos pueden ser usados en el contexto de poda de
algoritmos, donde el error debe ser permitido hasta permanecer mucho más alto que el
mínimo anterior sobre periodos de entrenamiento largos.
Ninguno de estos criterios por si solos pueden garantizar terminación, así se los complementa
con la regla de parar el entrenamiento cuando la precisión cae alrededor del 10% o después
de como máximo 3000 épocas. Todos los criterios de parada son usados de la misma forma:
ellos deciden parar al mismo tiempo t durante el entrenamiento y los resultados de
entrenamiento serian el conjunto de pesos que mostraron el más bajo error de validación
𝐸𝑜𝑝𝑡 (𝑡). [32]
Para la formación de un modelo que se desee entrenar desde 0, se deben definir varios factores y
metricas (hiperparámetros) que se deben adicionar en las respectivas capas del modelo. Es decir, se
deben definir conceptos como el numero de capas, capas de: convolucion, reducción,
regularizacion, entre otras, y sus respectivas clases que permitan obtener un modelo capaz de
aprender los datos ingresados y luego generalizar.
Para este proyecto se tuvo como punto de partida la construcción de un modelo sencillo con una
secuencia estándar de redes neuronales profundas basada en:
Para empezar, se escoge una arquitectura simple, con el fin de observar su comportamiento
e ir añadiendo o variando características de la red neuronal.
Esta se conformó con 3 capas convolucionales seguidas cada una con capas de reducción de
máxima agrupación (MaxPooling). Se siguió una serie de experimentos de entrenamiento,
utilizando solamente hiperparámetros más usados en redes neuronales, las pruebas
realizadas se presentaron de la siguiente forma:
HIPERPARÁMETROS
Función de activación Sigmoide ReLU LeakyReLU
Optimizadores SGD RMSProp Adagrad Adam
Regularización Dropout L1 L2
46
La Tabla 1 muestra los hiperparámetros con los cuales se varió la red inicial.
El conjunto de pruebas consistió en una serie de entrenamientos en donde el objetivo
primordial consistió en conseguir un modelo con el menor sobreajuste posible.
A continuación se muestra una serie de entrenamientos en donde (*) muestra los
hiperparámetros que se utilizaron para cada entrenamiento.
Tabla 2. Entrenamiento #1
HIPERPARÁMETROS
Función de activación Sigmoide * ReLU LeakyReLU
Optimizadores SGD RMSProp Adagrad Adam*
Regularización Dropout * L1 L2*
Tabla 3. Entrenamiento #2
HIPERPARÁMETROS
Función de activación Sigmoide ReLU * LeakyReLU
Optimizadores SGD RMSProp Adagrad Adam*
Regularización Dropout * L1 L2*
Tabla 4. Entrenamiento #3
HIPERPARÁMETROS
Función de activación Sigmoide ReLU LeakyReLU*
Optimizadores SGD RMSProp Adagrad Adam*
Regularización Dropout L1 L2
Tabla 5. Entrenamiento #4
HIPERPARÁMETROS
Función de activación Sigmoide ReLU LeakyReLU*
Optimizadores SGD RMSProp Adagrad Adam*
Regularización Dropout * L1 L2*
Tabla 6. Entrenamiento #5
HIPERPARÁMETROS
Función de activación Sigmoide ReLU LeakyReLU*
Optimizadores SGD RMSProp* Adagrad Adam
Regularización Dropout * L1 L2*
47
Tabla 7. Entrenamiento #6
HIPERPARÁMETROS
Función de activación Sigmoide ReLU LeakyReLU*
Optimizadores SGD RMSProp Adagrad* Adam
Regularización Dropout * L1 L2*
Tabla 8. Entrenamiento #7
HIPERPARÁMETROS
Función de activación Sigmoide ReLU LeakyReLU*
Optimizadores SGD RMSProp Adagrad Adam*
Regularización Dropout * L1* L2
48
Capa de entrada con tamaño de 100x100
Función de activación
Capa de reducción
Capa de abandono
Función de activación
Capa de reducción
Capa de abandono
Función de activación
Capa de reducción
Capa de abandono
Función de activación
Capa de abandono
Un diagrama que resume el proceso de elección de la red entrenada desde cero se puede ver en la
Figura 25:
50
Figura 25. Configuración de red desde cero para la detección de roya en caña de azúcar
Fuente: Autor
51
4.7 ENTRENAMIENTO MEDIANTE TRANSFERENCIA DE
APRENDIZAJE
52
En el proceso de transferir el aprendizaje usando Inception v3 e IceptionResNet v2 se siguieron los
siguientes pasos:
Lectura y etiquetamiento de base de datos
División de conjunto de entrenamiento, validación y prueba
Métodos para combatir el overfitting y pruebas de congelamiento de capas
Entrenamiento de la red con adición de paradas tempranas y puntos de control
Evaluación del conjunto de prueba
Almacenamiento del modelo en formato .Keras o .h5 (formato que se guardan los modelos
de redes neuronales en Python)
Visualización de resultados de rendimiento y pérdida (visualización de gráficas de
rendimiento vs épocas, y pérdida vs épocas)
Predicción de clases del conjunto de prueba.
En la Figura 27 se muestra un diagrama que muestra el procedimiento realizado para obtener los
modelos mediante el procedimiento de transferencia de aprendizaje.
Figura 27. Configuración de las redes con transferencia de aprendizaje para la detección de roya
en caña de azúcar
Fuente: Autor
53
4.8 Ataques adversarios por conjuntos para análisis de robustez
Finalmente, con el objetivo de analizar la robustez de los diferentes modelos de redes neuronales
escogidos, se usa el tipo de ataque adversario de signo de gradiente rápido. El procedimiento
llevado a cabo permite observar el porcentaje con el cual la red fue engañada por un conjunto de
imágenes adversarias generadas con este método, utilizando específicamente el conjunto de datos
de prueba (test) el cual es una muestra representativa del conjunto de datos total, permitiendo tener
un total de 984 imágenes adversarias
Según [37], las principales causas de engañar modelos mediantes ataques adversarios tienen que ver
con la linealidad y el sobreajuste. Se dice que la principal causa de la vulnerabilidad de redes
neuronales ante ataques adversarios es su naturaleza lineal. La causa de estos ejemplos adversarios
fue un misterio, y explicaciones especulativas han sugerido que esto es debido a la extrema no
linealidad de redes neuronales, quizás combinada con modelos insuficientes en regularización en
modelos supervisados.
54
𝜃 son los parámetros del modelo
𝑥 La entrada del modelo
𝑦 las etiquetas asociadas con 𝑥
𝐽(𝜃, 𝑥 , 𝑦) Sería el costo usado para entrenar la red neuronal.
55
5. RESULTADOS Y DISCUSIÓN
A continuación se muestran los resultados obtenidos después de usar los métodos y estrategias
descritos en el capítulo anterior. Estos resultados se dividen en 6 secciones, las cuales son
distribuidas de la siguiente manera:
Resultados para combatir el sobreajuste con red construida mediante la adición de capas
Resultados para combatir el sobreajuste con transferencia de aprendizaje de la red Inception V3
Resultados para combatir el sobreajuste con transferencia de aprendizaje de la red
InceptionResNet v2
Análisis de robustez de en red entrenada desde 0
Análisis de robustez de la red con transferencia de aprendizaje Inception v3
Análisis de robustez de la red con transferencia de aprendizaje InceptionResNet v2
56
Figura 29. Precisión del modelo con el conjunto de entrenamiento con diferentes optimizadores
Fuente: Autor
Las Figuras 31 y 32 muestran los resultados de realizar el entrenamiento con 3 diferentes funciones
de activación, en donde se observa que tanto ReLU como LeakyReLU presentan comportamientos
satisfactorios, logrando minimizar el error y obtener alta precisión. Esto concuerda con la teoría
estudiada en donde se justifica el hecho de utilizar a ReLU o alguna de sus variantes como función
de activación en redes neuronales profundas
57
Figura 31. Precisión con el conjunto de entrenamiento con distintas funciones de activación
Fuente: Autor
Figura 32. Pérdida con el conjunto de entrenamiento con distintas funciones de activación
Fuente: Autor
Finalmente, se escoge la función de activación LeakyReLU, la cual seguirá siendo utilizada para las
siguientes series de entrenamientos debido a su principal beneficio el cual es una pequeña pendiente
para valores negativos de entrada, proporcionando un valor de gradiente pequeño, lo cual permite
que no muera la activación neuronal durante el entrenamiento.
58
Dropout (Adam): modelo con abandono, sin regularización L1 o L2 con optimizador
Adam
Without regularization (Adam): modelo sin abandono y sin regularización L1 o L2 con
optimizador Adam
L2 Regularizer (Adam): modelo solo con regularizador L2, con optimizador Adam
Dropout and L2 regularizer (Adam): modelo con abandono y regularizador L2, con
optimizador Adam
Without regularization (Adagrad): modelo sin abandono y sin regularización L1 o L2
con optimizador Adagrad
Figura 33. Precisión con el conjunto de entrenamiento con distintas variantes de regularización,
entre paréntesis está el método de optimización que se usó
Fuente: Autor
Figura 34. Pérdida con el conjunto de entrenamiento con distintas variantes de regularización
Entre paréntesis está el método de optimización que se usó
Fuente: Autor
59
Figura 35. Precisión de entreno y validación con solo el regularizador L1 y optimizador Adam
Fuente: Autor
La Figura 35 muestra la precisión cuando solo se usa regularización L1, este muestra un deficiente
comportamiento de aprendizaje, llegando solamente a un 50% de precisión sin estabilizarse a los
largo de 20 épocas, de esta manera se escoge la regularización L2, con la cual se puede ver mejores
resultados debido a que no se eliminan completamente ponderaciones de los pesos con valores no
frecuentes.
Las Figuras 33 y 34 muestran la precisión y pérdidas de entrenamiento a partir de los datos de
entrenamiento, como se describió anteriormente, se realiza el proceso de aprendizaje con 5
modelos, se escoge en 4 de estos modelos como método de optimización fijo a ADAM y uno de
ellos se realiza con Adagrad para observar si se presenta alguna diferencia marcada entre estos dos
optimizadores, la cual si se pudo registrar, siendo el peor comportamiento el presentado por el
modelo con optimizador Adagrad y sin ninguna regularización.
De igual manera se puede observar que se tiene una mayor precisión con el modelo con optimizador
Adam que no tiene ninguna regularización, sin embargo cuando se observa la gráfica con el
conjunto de datos de validación se observa una menor fluctuación en el modelo que se utilizaron las
regularizaciones de abandono y L2.
(a) Pérdidas con modelo sin regularización (b) Pérdidas con modelo con regularización
Figura 36. Diferencia entre perdidas de modelo sin regularización y con regularización
Fuente: Autor
60
La Figura 36 (a) muestra las pérdidas del modelo sin aplicar ningún método de regularización y la
Figura 36 (b) muestra las pérdidas del modelo con regularización L2 y abandono, estos dos modelos
obtuvieron altos porcentajes de precisión, por lo cual el criterio de selección se realiza con la
observación de pérdidas con el conjunto de datos de validación, lo cual muestra qué modelo es
capaz de mostrar una mejor generalización del aprendizaje. De esta manera se encontró que se
reduce el sobreajuste con la utilización del abandono y la regularización L2 trabajando juntamente.
De esta manera, se establece que el modelo con función de activación LeakyReLU, con abandono y
regularización L2 es el mejor modelo debido a su alto porcentaje de precisión, bajas pérdidas y
coherencia con el entrenamiento con el conjunto de datos de validación.
En la siguiente sección se muestran los resultados obtenidos paso a paso del modelo de red neuronal
elegido.
Una vez seleccionado el mejor modelo, se muestra paso a paso la forma en la cual se logra entrenar
el modelo con el conjunto de datos recolectado. Inicialmente se explora la factibilidad de usar el
entrenamiento desde 0. Para comenzar se indica la manera de obtención de los datos y su
preparación antes del entrenamiento.
61
Figura 38. Muestra de imagen sana y enferma con sus respectivas etiquetas
Fuente. Autor
En la Figura 38 se presenta un ejemplo de cómo etiqueta el programa realizado en Python. En esta
figura se muestra un ejemplo de hoja con la enfermedad de roya la cual se etiqueta con el número 0,
mientras que la etiqueta de las imágenes sanas son representadas por la etiqueta 1.
La partición de los datos se hace de la siguiente manera:
Figura 39. Número de los diferentes conjuntos de datos para el entrenamiento de la red
Fuente: Autor
En la Figura 39 se muestra el número de imágenes utilizadas para el entrenamiento, como también
para validación y prueba, teniendo un total de 80% para entrenamiento y un 10% tanto para
validación y prueba. Se eligieron estos valores con el fin de que la red tenga un número
significativo de imágenes con las cuales pueda aprender mejor.
En la imagen se muestra el número y las dimensiones de los datos. Se puede observar que las
imágenes tienen un tamaño de 100 x 100 y una profundidad de color de 3, siendo los planos de
color (rojo, verde, azul), de igual forma se puede visualizar que se realizó una conversión de
etiqueta de valor entero a un valor denominado one-hot siendo esta la codificación de las etiquetas
en donde se tiene un valor de codificación de [0. 1.] para la etiqueta 0 y un valor de codificación [1.
0.] para la etiqueta 1. Muchos algoritmos de aprendizaje profundo son incapaces de trabajar con
datos categóricos, por ende se hace este tipo de codificación.
El paso siguiente fue el de formar la red mediante la adición de capas que permitieran realizar la
extracción de características automáticamente mediante el uso de capas de convolución y reducción.
62
La red se forma con la adición de 17 capas en donde se tiene el fin de evitar el sobreajuste, además
de tener un alto porcentaje de acierto en la predicción de los datos y un error pequeño. Las capas
empleadas en este proyecto se presentaron en la Figura 22.
A partir de aquí se muestra un trabajo en donde se combinan criterios de aprendizaje y
experimentación, debido a que en el proceso de visión por computador importa mucho las
características de la base de datos con la que se cuente.
Según las conclusiones del documento [29], el tamaño de imágenes que se pasan a la red en cada
iteración tiene un gran impacto en los resultados de aprendizaje. Escoger un lote pequeño permite
obtener un mejor rendimiento de aprendizaje, sin embargo la única deficiencia es la no
convergencia a óptimos globales (menor error). De esta manera, en este proyecto se procede a
realizar una serie de pruebas en donde se busca establecer un tamaño de lote en donde se presente
un equilibrio entre estos aspectos. El tamaño de lote se realiza solo teniendo en cuenta los divisores
del conjunto de datos que se entrenarán, para que se pase un número exacto de imágenes en cada
iteración. Se probaron con 5 divisores de 7872 que fue el total de datos para el entrenamiento que
representa el 80% del total recolectado.
Antes de mostrar los resultados proporcionados al entrenar la red, es importante dar a conocer las
principales características con las cuales se mostraron los mejores resultados en comparación con
los otros modelos probados, la Tabla 9 muestra las características de la red entrenada desde 0
elegida.
Tabla 9. Principales características de la red entrenada desde 0
CARACTERÍSTICA DESCRIPCIÓN
Tamaño de la imagen 100 x 100 x 3
Total de imágenes 9840
Numero de clases 2
Porcentaje de datos de entrenamiento 80%
Porcentaje de datos de prueba 10%
Porcentaje de validación 10%
Tamaño del lote por iteración 82
Número de épocas 20
Función de activación LeakyReLU
Capas de abandono añadidas Si
Capas de reducción MaxPooling
Parada temprana Si
Puntos de control Si
Número de parámetros 2’862.530
Números de parámetros entrenados 2’862.530
Función de pérdida Entropía cruzada
Optimizador ADAM
Tipo de entrenamiento Keras model.fit()
Número de bloques de trabajo (capas) 17
Número de capas congeladas 0
63
En el proceso de probar cual sería el tamaño de lote a escoger, se probarían varias opciones,
teniendo como indicador la similitud de datos de validación y entrenamiento. Dichas pruebas fueron
realizadas sobre la primera época y teniendo como base de partida una red pre-entrenada como
Inception ResNet v2. Dichas pruebas arrojaron los resultados mostrados en la Tabla 10.
Tabla 10. Prueba para establecer el tamaño de lotes después de la primera época en red neuronal
InceptionResNet v2.
De acuerdo a las pruebas obtenidas experimentalmente se escoge trabajar con un tamaño de lote de
82. Se escogió una red como lo es InceptionResNet v2 para hacer esta prueba. Con las demás redes
se tenía un comportamiento similar.
De acuerdo a la tabla anterior, al usar un tamaño de lote de 82, se tiene un mayor rendimiento de
entrenamiento y se experimenta un mejor sobreajuste que con los demás lotes.
Antes de proceder con el entrenamiento, se muestra la configuración para establecer puntos de
control y parada temprana, como se muestra en las siguientes secciones.
Para conocer si el adicionar capas de abandono resulta ser bueno, se muestran los resultados de una
sesión de entrenamiento sin la adición de capas de abandono y luego se las agrega. Las diferencias
se muestran así:
a) Red neuronal sin agregar capas de abandono:
Las Figuras 40 y 41 representan la pérdida y rendimiento del conjunto de entrenamiento y
validación. Estas figuras muestran un comportamiento de sobreajuste. Si bien, el rendimiento de
entrenamiento alcanza el 100%, tiene fluctuaciones al igual que el rendimiento de validación, el
cual llega a un rendimiento de 95% en la época 8, sin embargo, decae a 85% en la etapa 15, lo cual
es una muestra clara que no se lleva un aprendizaje correcto. En la Figura de pérdida (Figura 41) se
puede observar el sobreajuste en los puntos en los que la pérdida no decrece sino que aumenta
desmedidamente en época 5 y a partir de la época 10.
64
Figura 40. Rendimiento de entreno y validación de la red sin agregar capas de abandono
Fuente: Autor
65
La optimización usada en estas redes fue el modelo adaptativo “ADAM” con el cual se tienen
mejores resultados con respecto a los demás optimizadores. El entrenamiento se realiza durante 20
épocas y un tamaño de lote de 82 imágenes por iteración.
Como se puede observar en la Figura 42, la adición de abandono permite mejorar el rendimiento en
validación, en este caso tan solo se produjo un descenso en la época 5, y para las demás épocas se
presentó un buen comportamiento en el aprendizaje de la red
Figura 43. Pérdida en conjunto de datos de entreno y validación con capas de abandono añadidas
Fuente: Autor
66
c) Red neuronal añadiendo capas de abandono y regularización:
Se demostró anteriormente que las capas de abandono son herramientas útiles para combatir el
sobreajuste, sin embargo se puede mejorar el proceso de generalización y uno de ellos es la
regularización. Para este caso se usará la regularización L2, mostrando mejores resultados que la
regularización L1 para este conjunto de datos. Con la regularización L1, el error mostró valores
muy grandes del orden de los cientos lo cual muestra un error excesivo. Los resultados de añadir
regularización y capas de abandono se presentan en las Figuras 44 y 45.
Figura 44. Rendimiento de entrenamiento con conjunto de datos de validación y entrenamiento con
adición de abandono y regularización L2
Fuente: Autor
Figura 45. Pérdida del conjunto de entrenamiento y validación con regularización L2 añadida
Fuente: Autor
67
Con la regularización L2 se presenta un buen comportamiento de aprendizaje. Solamente en la
época 12 se presenta una disminución en el rendimiento pero no es muy significativo. En las demás
épocas, se muestra un rendimiento muy cercano al de entrenamiento, el cual asciende
progresivamente, muestra de un buen ajuste de los datos.
El efecto de la regularización L2 disminuye el error en la búsqueda del óptimo global. Como se
muestra en la figura de pérdida, se presenta un comportamiento similar entre la pérdida de
entrenamiento y validación, lo cual es lo ideal en el proceso de aprendizaje.
68
En la Tabla 11 se muestra todo el historial de entrenamiento de validación y capacitación de la red,
en donde se muestran los resultados obtenidos desde la primera época hasta la 20, en donde se
muestra una buena generalización de datos y un buen comportamiento de aprendizaje. Este proceso
no tuvo ninguna parada temprana debido a tener un buen comportamiento de validación de datos. El
mejor rendimiento de validación fue el registrado en la época final (época 20) el cual se terminaría
guardando su actualización de pesos.
Figura 48. Predicción realizada por la red mediante la adición de una nueva imagen afectada por
la roya
Fuente: Autor
69
Como se observa en la Figura 48, la predicción de la red es correcta y corresponde a un “0” el cual
dice mostrar ser de una imagen de caña de azúcar afectada por la roya.
En el conjunto de datos de prueba, como se había mostrado anteriormente, se tuvo un rendimiento
de 91.26% en donde se realiza la predicción con estos conjuntos de datos y se muestra el resultado
de la Figura 49.
Figura 49. Número de imágenes predichas con éxito y sin éxito por el modelo
Fuente: Autor
En esta sección se hará énfasis en mostrar con mayor precisión los resultados del modelo
entrenado desde 0, utilizando la varianza y desviación estándar, siendo estos unos
indicadores estadísticos que determinan que tan dispersa puede llegar a estar la red en
cuanto al porcentaje de precisión con el conjunto de entrenamiento, validación y prueba.
Para poder mostrar estos cálculos fue necesario realizar una serie de entrenamientos. En
este caso, se realizaron 10 entrenamientos en donde no se cambiaron los hiperparámetros de
la red.
Los resultados de precisión y pérdida de los diferentes conjuntos de datos con media y
desviación estándar se pueden observar en la Tabla 12
Tabla 12. Valores de precisión y perdida con desviación estándar del modelo entrenado desde cero
Con los resultados obtenidos se puede afirmar que la red tiene un comportamiento de distribución
homogéneo en las diferentes precisiones lo cual es una muestra de confiabilidad para el modelo
entrenado desde 0.
70
5.3 RESULTADOS PARA COMBATIR EL SOBREAJUSTE CON
TRANSFERENCIA DE APRENDIZAJE DE LA RED INCEPTION
V3
El procedimiento con respecto a la red anterior es el mismo en las etapas iniciales del programa en
Python, en donde se recolectan los datos, se hace la partición de entrenamiento, prueba y
validación. Sin embargo, el procedimiento cambia en el momento de la obtención del modelo como
tal. Mientras que en la primera parte se daría la estructura de la red, en la transferencia de
aprendizaje se cargará la red ya entrenada con un conjunto de datos muy grande. Finalmente, lo que
se debe realizar es la transferencia de aprendizaje, es decir que la red tenga la capacidad de tener un
nuevo conjunto de datos con el que será capacitado y pueda clasificar las nuevas clases.
Ahora nuevamente se debe hacer esto pero con el mismo objetivo anterior: “evitar el sobreajuste”.
Las tácticas usadas están basadas en criterios generales de aprendizaje profundo. A pesar de esto,
gran parte del trabajo estuvo sometido a pruebas y experimentos en donde se deseaba encontrar un
buen equilibrio según la base de datos que se recolectó. Primeramente, se procede a mostrar en la
Tabla 13 las principales características de este modelo de red Inception v3.
Tabla 13. Principales características de la red entrenada mediante la transferencia de aprendizaje de
la red Inception V3
CARACTERÍSTICA DESCRIPCIÓN
Tamaño de la imagen 100 x 100 x 3
Total de imágenes 9840
Numero de clases 2
Porcentaje de datos de entrenamiento 80%
Porcentaje de datos de prueba 10%
Porcentaje de validación 10%
Tamaño del lote por iteración 82
Número de épocas 15
Función de activación ReLU
Capas de abandono añadidas Si
Capas de reducción AveragePooling y MaxPooling
Parada temprana Si
Puntos de control Si
Número de parámetros 22’085.762
Números de parámetros entrenados 13’906.658
Función de pérdida Entropía cruzada
Optimizador ADAM
Tipo de entrenamiento Keras model.fit_generator()
Número de bloques de trabajo (capas) 319
Número de capas congeladas 216
71
actualizar solamente las capas finales e intermedias, dependiendo de la similitud que tengan los
datos con los datos pre-entrenados.
En el proceso de transferencia de aprendizaje debe tenerse en cuenta otro paso importante y es el de
eliminar las últimas dos capas del modelo original, que tienen como función la de clasificar de
acuerdo al número de clases obtenidas.
La red Inception v3 fue entrenada con el fin de clasificar 1000 imágenes de diferentes categorías.
Ahora, el proceso será la eliminación de las capas finales y la adición de nuevas capas de
clasificación que contenga como en este caso solo las dos clases que se necesitan.
Se desea agregar 3 capas densas con el fin de añadir junto con ellas la regularización L2 que resultó
ser muy importante para combatir el sobreajuste como se mostró en secciones anteriores. Las
últimas capas de la red se muestran distribuidas de la siguiente manera:
Global AVERAGE
POOLING
ABANDONO (50%)
ABANDONO (50%)
ABANDONO (50%)
ABANDONO (50%)
Una vez realizada la concatenación del modelo base de Inception v3 y las nuevas capas añadidas se
procede a realizar el entrenamiento de la red. El proceso de entrenamiento inicialmente se realizó
con el comando model.fit, sin embargo se mostraron resultados no satisfactorios al observar las
72
gráficas de rendimiento y pérdida. A continuación se muestra un caso en donde ser realizó un
entrenamiento con 229 capas congeladas.
Figura 50. Rendimiento de validación y entrenamiento con 229 capas congeladas (izquierda),
pérdida de validación y entrenamiento con 229 capas congeladas (derecha)
Fuente: Autor
En la Figura 50 se muestran los resultados del entrenamiento por transferencia bajo el
congelamiento de 229 capas. Estos resultados muestran un comportamiento en donde se observa
que la red tiene un buen aprendizaje de entrenamiento, pero no de generalización, porque se puede
notar que existen muchas fluctuaciones en el rendimiento de validación alcanzando valores del 90%
en algunas épocas y regresa bruscamente al 80%, no estabilizándose en un valor. En la pérdida se
muestra un comportamiento desfavorable en donde el error aumenta y disminuye iterativamente
siendo este un síntoma de sobreajuste.
Dicho desde un principio, el entrenamiento de redes neuronales está sometido a la realización de
múltiples pruebas debido a la gran cantidad de parámetros que se deben tener en cuenta, uno de
ellos es el número correcto de capas que se deben congelar. En este proceso, se realizaron varios
entrenamientos con diferentes capas congeladas y se escogió aquel que tuviera una mejor
generalización de datos como se muestra en la Tabla 14.
Tabla 14. Prueba de congelamiento de capas
Al observar que el modelo con diferentes entrenamientos realizados no generalizaba al tener un mal
comportamiento en el rendimiento de validación, se tomó la decisión de realizar un aumento en el
conjunto de datos mediante otra opción que ofrece la biblioteca de Keras, denominada
73
IMAGE.DATA_GENERATOR, la cual permite la multiplicación de los datos mediante la
generación de nuevas imágenes a partir de las imágenes con las que se entrena.
Con esta opción se tiene la generación de nuevas imágenes mediante recortes de la imagen, zoom,
desplazamiento vertical y horizontal, entre otros, realizándose este proceso de aumento en el mismo
momento que la red empieza a entrenarse.
La generación de datos se realizó mediante 5 métricas:
Rango de rotación de 20° aleatoria
Rango de zoom de 0.15 (significa que se elegirá un rango de zoom entre [0.85 -1.15])
aleatoriamente en donde acercara o alejara la imagen dependiendo del valor escogido.
Rango de corte de cizallamiento es de 0.15 (ángulo de en sentido anti horario de 15°)
Desplazamiento horizontal 0.2 (desplazamiento en un 20% en dirección horizontal)
Desplazamiento vertical 0.2 (desplazamiento vertical en un 20% en dirección vertical)
Al aplicar este generador de datos y congelando las capas correctas que en este caso fue un total de
216 los resultados mejoraron como se muestra a continuación:
Figura 51. Rendimiento de entreno y validación con 216 capas congeladas (izquierda), pérdida de
rendimiento y validación con 216 capas congeladas (derecha)
Fuente: Autor
La Figura 51 muestra un mejor comportamiento en el rendimiento de validación de los datos, lo
cual significa una mejor generalización de aprendizaje. Esto pudo conseguirse mediante la
experimentación, congelando diferente número de capas y con la generación de imágenes, el cual
fue un recurso que permitió mejorar los resultados finales.
Durante el entrenamiento no se dio la parada temprana debido a que el rendimiento crecía y la
pérdida descendía gradualmente en cada época.
74
En el momento de realizar la prueba se obtuvo un 91.76% de rendimiento y 0.2820 de pérdida como
se muestra en la Figura 52.
Una vez guardado el modelo, se puede probarlo con cualquier imagen que contenga hojas de caña
de azúcar y así clasificarla.
Figura 53. Predicción realizada por la red con hoja de caña de azúcar sana
Fuente: Autor
Como se muestra en la Figura 53 se realiza con éxito la predicción de la hoja de caña sana
mostrando una probabilidad de 99.79%.
75
Tabla 15. Rendimiento y pérdida del conjunto de entrenamiento y validación con la transferencia
de aprendizaje Inception v3.
Tabla 16. Valores de precisión y pérdida con desviación estándar del modelo con transferencia de
aprendizaje Inception V3
76
5.4 RESULTADOS PARA COMBATIR EL SOBREAJUSTE CON
TRANSFERENCIA DE APRENDIZAJE DE LA RED
INCEPTIONRESNET V2
CARACTERÍSTICA DESCRIPCIÓN
Tamaño de la imagen 100 x 100 x 3
Total de imágenes 9840
Numero de clases 2
Porcentaje de datos de entrenamiento 80%
Porcentaje de datos de prueba 10%
Porcentaje de validación 10%
Tamaño del lote por iteración 82
Número de épocas 10
Función de activación ReLU
Capas de abandono añadidas Si
Capas de reducción AveragePooling y MaxPooling
Parada temprana Si
Puntos de control Si
Número de parámetros 54’554.178
Números de parámetros entrenados 4’919.618
Función de pérdida Entropía cruzada
Optimizador ADAM
Tipo de entrenamiento Keras model.fit_generator()
Número de bloques de trabajo (capas) 788
Número de capas congeladas 768
Para esta red se realiza la misma adición de capas finales para poder agregar regularización L2 y
capas de abandono.
Realizando nuevamente pruebas de congelamiento de 700, 768 y 777 capas, se encuentra que al
congelar 768 capas se muestran mejores resultados.
Los resultados obtenidos al congelar este número de capas se muestra en la Tabla 18.
77
Tabla 18. Resultados de pérdida y rendimiento de validación y entrenamiento con 768 capas
congeladas
De acuerdo a los resultados de la tabla anterior con la acción de los puntos de control, el modelo se
guarda con los resultados obtenidos en la época número 12 la cual muestra el mejor porcentaje de
rendimiento de validación en donde se tiene un valor de rendimiento de entrenamiento de 89.57% y
un porcentaje de rendimiento de validación de 90.85%.
Los resultados de validación y pérdida en esta transferencia mostraron un buen comportamiento
finalmente al realizar la prueba de la red con datos no vistos tuvo el resultado de la Figura 54.
78
Figura 55. Rendimiento de entrenamiento y validación con 768 capas congeladas (izquierda),
pérdida de rendimiento y validación con 768 capas congeladas (derecha)
Fuente: Autor
Finalmente, se muestra una demostración de predicción acertada que hace la red con el ingreso de
una imagen correspondiente a una hoja de caña de azúcar con roya como se muestra en la Figura 56
79
5.4.1 Medidas de dispersión para la red InceptionResNet v2
Tabla 19. Valores de precisión y pérdida con desviación estándar del modelo con transferencia de
aprendizaje InceptionResNet V3
Precisión de Precisión de
Pérdidas de Pérdidas de Precisión de Pérdidas de
entrenamiento validación
entrenamiento validación prueba (%) prueba
(%) (%)
89.685±0.317 0.290±0.004 87.876±1.763 0.343±0.042 87.701±1.407 0.358±0.030
Una vez finalizado el proceso de selección de los 3 mejores modelos, se puede observar su
rendimiento en las Figuras 57 y 58.
(a) Precisión con datos de entrenamiento (b) precisión con datos de validación
Figura 57. Comparación de precisión de red entrenada desde cero y redes con transferencia de
aprendizaje
Fuente: Autor
80
(a) Pérdida con datos de entrenamiento (b) Pérdida con datos de validación
Figura 58. Comparación de pérdidas entre redes entrenadas desde 0 y redes entrenadas con
transferencia de aprendizaje
Fuente: Autor
En cada uno de los modelos se obtuvieron resultados con respecto a la media aritmética y
desviación estándar de precisión de entrenamiento, validación y prueba con sus respectivas
pérdidas. Estos resultados se pueden ver unificados de la siguiente manera:
Tabla 20. Valores de precisión y pérdida con desviación estándar de los diferentes modelos de
aprendizaje profundo
Con respecto a la Tabla 20 todos los modelos muestran una desviación estándar pequeña,
verificando así que los resultados obtenidos a lo largo de cada uno de los 10 entrenamientos no son
muy dispersos con respecto a la media, sin embargo se puede resaltar que la red entrenada desde
cero y la red InceptionResNet v2 tienen menor dispersión con respecto a la red Inception v3.
81
Precisión de entrenamiento y validación
100,000%
97,530%
98,000%
96,000% 92,640%
Porcentaje de precisión
94,000%
91,910%
92,000% 91,590%
89,685%
90,000% 87,876%
88,000%
86,000%
84,000%
82,000%
80,000%
78,000%
RED DESDE CERO INCEPTION V3 INCEPTIONRESNET V2
Redes neuronales
Figura 59. Valores de media de precisión de entrenamiento y validación para las 3 redes
neuronales
Fuente: Autor
0,250
0,200
0,140
0,150
0,100
0,050
0,000
RED DESDE CERO INCEPTION V3 INCEPTIONRESNET V2
Redes neuronales
Figura 60. Valores de media de pérdidas de entrenamiento y validación para las 3 redes
Fuente: Autor
82
Las Figuras 59 y 60 muestran un mejor panorama de los datos de precisión y pérdidas de los 3
modelos de aprendizaje profundo analizados, a partir de las cuales se puede afirmar que la red con
mejor comportamiento, en cuanto a contrarrestar el sobreajuste, es la representada por el modelo
entrenado desde cero, debido a su similitud entre los valores de precisión y pérdida.
El método del signo del gradiente rápido utiliza un valor pequeño llamado épsilon, el cual tiene la
función de limitar la adición de ruido en la generación de imágenes adversarias con el fin evitar que
dicha imagen no se vea evidentemente impostora.
A continuación se muestra el efecto que se tiene al usar diferentes valores de épsilon sobre algunas
imágenes originales en la precisión de la red entrenada desde cero.
Épsilon =0.2
Figura 61. Ataque adversario con método de signo de gradiente rápido a red desde cero con
épsilon = 0.2
En la Figura 61se observa la imagen original (izquierda), el ruido agregado por el método FGSM
(centro) y la imagen adversaria generada (derecha). También se muestran en la parte superior de la
imagen los resultados de pérdida y precisión con el conjunto de datos de prueba sin el ataque
83
adversario y luego con el ataque adversario. Este mismo procedimiento se realiza con los diferentes
valores de épsilon.
Épsilon=0.1
Figura 62. Ataque adversario con método de signo de gradiente rápido a red desde cero con
épsilon = 0.1
Épsilon=0.07
Figura 63. Ataque adversario con método de signo de gradiente rápido a red desde cero con
épsilon = 0.07
84
Épsilon =0.06
Figura 64. Ataque adversario con método de signo de gradiente rápido a red desde cero con
épsilon = 0.06
Épsilon =0.05
Figura 65. Ataque adversario con método de signo de gradiente rápido a red desde cero con
épsilon = 0.05
85
Épsilon =0.04
Figura 66. Ataque adversario con método de signo de gradiente rápido a red desde cero con
épsilon = 0.04
Épsilon = 0.03
Figura 67. Ataque adversario con método de signo de gradiente rápido a red desde cero con
épsilon = 0.03
86
Épsilon =0.02
Figura 68. Ataque adversario con método de signo de gradiente rápido a red desde cero con
épsilon = 0.02
Épsilon=0.01
Figura 69. Ataque adversario con método de signo de gradiente rápido a red desde cero con
épsilon = 0.01
Con los resultados obtenidos en las figuras se prueban diferentes valores de épsilon, apreciando que
a medida que aumenta el valor de épsilon, la precisión de la red disminuye, es decir muestra más
predicciones incorrectas en mayor porcentaje con pérdidas mayores, y esto es debido a que este
valor aumentará o disminuirá el ruido que se introduce a la imagen original. Sin embargo, es
importante en ataques adversarios que se pueda engañar la red en un alto porcentaje y que además
de esto el ruido de la imagen adversaria sea imperceptible para el humano. Mediante el anterior
87
criterio, se escoge 0.04 como valor de épsilon que cumple con estas dos características, en donde se
tiene un porcentaje alto de engaño y con pequeña visibilidad del ruido en la imagen adversaria.
88
Imágenes adversarias
Figura 70. Muestra de los primeros 20 ataques adversarios realizados a la red entrenada desde
cero con épsilon = 0.04
Fuente: Autor
89
c. Imágenes adversarias
Figura 71. Muestra de los primeros 20 ataques adversarios realizados a la red con transferencia
de aprendizaje Inception v3 con épsilon = 0.04
Fuente: Autor
90
Imágenes adversarias
Figura 72. Muestra de los primeros 20 ataques adversarios realizados a la red con transferencia
de aprendizaje InceptionResNet v2 con épsilon = 0.04
Fuente: Autor
Tabla 21. Resultados de entrenamiento con imágenes con ataque y sin ataque adversario a las 3
redes neuronales
InceptionResNet
97.134±1.058 0.090±0.039 57.348±7.697 1.790±0.647
v2
La tabla 21 muestra un alto porcentaje de precisión en las redes por transferencia de aprendizaje y
perdidas menores, en cuanto a la robustez se puede observar que las redes por transferencia de
aprendizaje tienen mayor robustez debido a el porcentaje de engaño en ellas fue de un 33,365%
para la red Inception v3 y de un 42,652% para la red InceptionResNet v2, mientras que la red
entrenada desde cero presentó un 90,052% de engaño siendo la más vulnerable.
91
Precisión con ataques y sin ataques adversarios
120,000%
97,185% 97,134%
100,000%
Porcentaje de precisión
87,623%
80,000%
66,635%
57,348%
60,000%
40,000%
20,000% 9,948%
0,000%
Red desde cero Inception v3 InceptionResNet v2
Redes neuronales
Figura 73. Diagrama de precisión de los tres modelos con ataques y sin ataques adversarios con
un épsilon =0.04
Fuente: Autor
5,000 4,502
Valor de pérdidas
4,000
3,000
2,000 1,790
1,167
1,000
0,264 0,090
0,083
0,000
Red desde cero Inception v3 InceptionResNet v2
Redes neuronales
Figura 74. Diagrama de pérdidas de los tres modelos con ataques y sin ataques adversarios con un
épsilon =0.04
92
Fuente: Autor
Las Figuras 73 y 74 muestran los diagramas correspondientes a la precisión y pérdida de los 3
modelos con presencia y ausencia de ataques adversarios al conjunto de datos de prueba, se puede
visualizar que la red entrenada desde cero presentó una mayor vulnerabilidad a los ataques teniendo
un bajo porcentaje de precisión con una media de 9,984% y una pérdida grande, con un valor de
4,503. Los modelos por transferencia de aprendizaje presentaron una mayor robustez ante este tipo
de ataque adversario.
De acuerdo con [37], algunas especulaciones que causan los ejemplos adversarios tienen que ver
con la no linealidad de las redes neuronales y la regularización insuficiente. Estas especulaciones se
pueden verificar en estos resultados, en donde se tiene mayor vulnerabilidad en las redes con menor
cantidad de parámetros entrenables, en este caso el número de parámetros representa la cantidad de
pesos entrenables de cada red. A continuación se mostrara una tabla en donde se presenta la
comparación de las tres redes neuronales con respecto a su precisión con los ataques adversarios y
su cantidad de parámetros.
Tabla 24. Comparación de cantidad de parámetros de los modelos con su precisión con ataques
CANTIDAD DE PRECISIÓN DE LA
CANTIDAD DE
MODELO PARÁMETROS RED CON ATAQUE
PARÁMETROS
ENTRENABLES (%)
La Tabla 24 muestra los datos de precisión con ataques adversarios y el número de parámetros
entrenables de cada uno de los modelos, donde se aprecia que el grado de complejidad influye en la
robustez de los modelos de aprendizaje profundo.
93
6. CONCLUSIONES
En este proyecto de grado se exploró la detección de roya en caña de azúcar por medio de técnicas
de aprendizaje profundo, partiendo dos enfoques: la construcción desde cero de una red y
empleando transferencia de aprendizaje. Ambos enfoques mostraron un buen desempeño, con un
porcentaje de rendimiento para el conjunto de validación superior al 90% en los tres tipos de
modelos, encontrándose los siguientes comportamientos durante el proceso de entrenamiento y
validación:
95
7. REFERENCIAS
[1] Juan Carlos Angel Sanchez, Marcela Cadavid Ordonez, Jorge Ignacio Victoria Kafure. (2010).
Presencia de roya naranja en el Valle del Cauca y estrategias para su manejo, recuperado el 14 de
noviembre de 2018, de
http://www.cenicana.org/pdf_privado/documentos_de_trabajo/doc_trabajo_715.pdf.
[2] Camilo Andrés Cacerez Florez, Dario Amaya Hurtado, Olga Lucia Ramos Sandoval. (2015).
Procesamiento de imágenes para el reconocimiento de daños causados por plagas en el cultivo de
Begonia Semperflorens link & Otto (flor de azúcar). Revista acta agronómica, 273-279.
[3] Carlos Quintero, Fernando Merchán, Aydeé Cornejo y Javier Sánchez Galán. (2017). uso de
redes neuronales convolucionales para el reconocimiento automático de imágenes de macro
invertebrados para el biomonitoreo participativo. KnE Engineering, 585-596.
[4] Jonas Rauber, Wieland Brendel, Matthias Bethge. (2018). Foolbox: A Python toolbox to
benchmark the robustness of machine learning models. https://arxiv.org/pdf/1707.04131v3.pdfF
[5] CENICAÑA. (2013). Roya café, recuperado el 14 de noviembre de 2018, de
http://www.cenicana.org/investigacion/variedades/sanidad_vegetal.php?opcion=1&opcion2=2.
[6] Juan Carlos Angel Sanchez, Marcela Cadavid Ordonez, Jorge Ignacio Victoria Kafure. (2010).
Métodos de diferenciación en campo y laboratorio de los agentes causales de la roya café y roya
naranja en la caña de azúcar, recuperado el 14 de noviembre de 2018, de
http://www.cenicana.org/publicaciones/carta_trimestral/ct2010/ct3y4_10/ct3y4_10_p30-36.php.
[7] Juan Carlos Angel Sanchez, Marcela Cadavid Ordonez, Jorge Ignacio Victoria Kafure. (2011).
Presencia de roya naranja en el rio del Valle del Cauca, recuperado el 14 de noviembre de 2018 de
http://www.cenicana.org/pdf_privado/carta_trimestral/ct2010/ct3y4_10/ct3y4_10_p24-29.pdf
[8] INFANTE, Danay; MARTINEZ, B; GONZALEZ, E y GONZALEZ, Noyma. (2010). Puccinia
kuehnii (KRÜGER) BUTLER Y Puccinia melanocephala H. SYDOW Y P. SYDOW. EN EL
CULTIVO DE LA CAÑA DE AZÚCAR. Revista de Protección Vegetal
versión impresa ISSN 1010-2752
[9] Juan Carlos Angel Sanchez, Marcela Cadavid Ordonez, Jorge Ignacio Victoria Kafure. (2010).
Presencia de roya naranja en el rio del Valle del Cauca, recuperado el 14 de noviembre de 2018.
http://www.cenicana.org/pdf_privado/documentos_de_trabajo/doc_trabajo_715.pdf
[10] MathWorks, (2018). Redes neuronales convolucionales, recuperado el 18 de abril de 2019, de
https://la.mathworks.com/solutions/deep-learning/convolutional-neural-network.html
[11] Alex Krizhevsky, Ilya Sutskever, Geoffrey E. Hinton. (2010). ImageNet Classification with
Deep Convolutional Neural Networks. http://papers.nips.cc/paper/4824-imagenet-classification-
with-deep-convolutional-neural-networks.pdf
[12] Patricia Perez Corrales (2016). Inteligencia artificial puede ser fácilmente engañada.
Recuperado el 15 de abril de 2019 de https://www.tendencias21.net/La-inteligencia-artificial-puede-
ser-facilmente-enganada_a42368.html.
96
[13] Katie Matho (2018). Un vistazo dentro de las redes neuronales. Recuperado el 06 de abril de
2019, de https://ml4a.github.io/ml4a/es/looking_inside_neural_nets/.
[14] Ian J. Goodfellow, Jean Pouget-Abadie, Mehdi Mirza, Bing Xu, David Warde-Farley, Sherjil
Ozair, Aaron Courville, Yoshua Bengio. (2014). Generative Adversarial Nets.
https://arxiv.org/pdf/1406.2661.pdf
[15] Sunita Nayak. (2018). Entendiendo a AlexNet. Recuperado el 23 de diciembre de 2018, de
https://www.learnopencv.com/understanding-alexnet/.
[16] Christian Szegedy, Vincent Vanhoucke, Sergey Ioffe, Jonathon Shlens. (2015). Rethinking the
Inception Architecture for Computer Vision. https://arxiv.org/pdf/1512.00567.pdf
[17] Bharath Raj (2018). Una guía simple para las versiones de Inception. Recuperado el 15 de abril
de 2019 de https://towardsdatascience.com/a-simple-guide-to-the-versions-of-the-inception-
network-7fc52b863202
[18] Siladittya Manna (2019). Building Inception-Resnet-V2 in Keras from scratch. Recuperado el
15 de abril de 2019 de https://medium.com/@mannasiladittya/building-inception-resnet-v2-in-
keras-from-scratch-a3546c4d93f0
http://www.image-net.org/papers/imagenet_cvpr09.pdf
[19] Jia Deng, Wei Dong, Richard Socher, Li-Jia Li, Kai Li and Li Fei-Fei. (2009).ImageNet: A
Large-Scale Hierarchical Image Database.
http://www.image-net.org/papers/imagenet_cvpr09.pdf
[20] Chigozie Enyinna Nwankpa, Winifred Ijomah, Anthony Gachagan, and Stephen Marshall
(2018). Activation Functions: Comparison of Trends in Practice and Research for Deep Learning.
https://arxiv.org/pdf/1811.03378.pdf
[21] Nitish Srivastava, Geoffrey Hinton hintoN, Alex Krizhevsky, Ilya Sutskever, Ruslan
Salakhutdinov. (2014). Dropout: A Simple Way to Prevent Neural Networks from Overfitting.
https://www.cs.toronto.edu/~hinton/absps/JMLRdropout.pdf
[22] Sebastián Ruder. (2017). An overview of gradient descent optimization algorithms∗.
https://arxiv.org/pdf/1609.04747.pdf
[23] Matthew D. Zeiler. (2012). ADADELTA: AN ADAPTIVE LEARNING RATE METHOD.
https://arxiv.org/pdf/1212.5701.pdf
[24] Anaconda-Navigator (2019). Recuperado el 15 de abril de 2019 de
https://anaconda.org/anaconda/anaconda-navigator
[25] Bharath Raj (2018). Aumento de datos. Recuperado el 20 de abril de 2019 de
https://medium.com/nanonets/how-to-use-deep-learning-when-you-have-limited-data-part-2-data-
augmentation-c26971dc8ced
[26] Rich Caruana, Steve Lawrence, Lee Giles. (2001). Overfitting in Neural Nets:
Backpropagation, Conjugate Gradient, and Early Stopping https://papers.nips.cc/paper/1895-
overfitting-in-neural-nets-backpropagation-conjugate-gradient-and-early-stopping.pdf
97
[27] VILLA G., Fernán A .; VELASQUEZ H., Juan D. y SANCHEZ S., Paola A. (2015). Control
de sobreajuste dentro de redes neuronales de correlación en cascada aplicadas a la predicción del
precio del contrato de electricidad. Rev. ing. univ. Medellín. 2015, vol.14, n.26, pp.161-176. ISSN
1692-3324.
[28] ZongBen, ZHANG Hai1, WANG Yao1, CHANG XiangYu1 & LIANG Yong. (2010). L1/2
regularization.
http://gr.xjtu.edu.cn/LiferayFCKeditor/UserFiles/File/L%200.5%20regularization.pdf
[29] Glosario sobre aprendizaje automático (2018). Regularizaciones L1 y L2. Recuperado el 14 de
abril de 2019 de https://developers.google.com/machine-learning/crash-course/glossary?hl=es-
419#L1_regularization
[30] CREATIVE COMMONS (2018). Diferencia l1 y l2. Recuperado el 18 de abril de 2019 de
https://developers.google.com/machine-learning/crash-course/regularization-for-sparsity/l1-
regularization?hl=es-419
[31] Kevin Shen (2018). Efecto de Batch Size sobre entrenamiento de redes neuronales.
Recuperado el 3 de febrero de 2019 de https://medium.com/mini-distill/effect-of-batch-size-on-
training-dynamics-21c14f7a716e
[32] Lutz Prechelt. (1997). Early Stopping | but when?. https://page.mi.fu-
berlin.de/prechelt/Biblio/stop_tricks1997.pdf
[33] Hayit Greenspan, Bram van Ginneken, Ronald M. Summers. (2016). Deep Learning in
Medical Imaging: Overview and Future Promise of an Exciting New Technique, revista IEEE
Transactions on Medical Imaging , pp: 1285 – 1298.
[34] Pedro Marcelino (2018). Transferencia de aprendizaje a partir de modelos pre-entrenados.
Recuperado el 5 de mayo de 2018 de https://towardsdatascience.com/transfer-learning-from-pre-
trained-models-f2393f124751
[35] Bing Xu , Naiyan Wang , Tianqi Chen , Mu Li. (2015). Evaluación empírica de activaciones
rectificadas en red convolucional, recuperado el 5 de mayo de 2018 de
https://arxiv.org/abs/1505.00853
[36] Fabian Eitel. (2017). Adversarial Attack on Semantic Segmentation in the Physical world
http://oa.upm.es/55875/1/TFM_FABIAN_EITEL.pdf
[37] Ian J. Goodfellow, Jonathon Shlens & Christian Szegedy. (2015). EXPLAINING AND
HARNESSING ADVERSARIAL EXAMPLES. https://arxiv.org/abs/1412.6572
8. ANEXOS
98
A continuación se muestran los programas realizados en lenguaje Python para dar cumplimiento a
los objetivos que se tenían previstos:
PROGRAMA DE RED NEURONAL DESDE 0:
import os #funciones de sistema operativo
import re # biblioteca con expresiones de cadenas
import matplotlib.pyplot as plt # para graficar
#%matplotlib inline
from sklearn.model_selection import train_test_split # partir datos de entreno y
test con sus porcentajes
from sklearn.metrics import classification_report # para clasificacion de datos
import keras # libreria que contiene a tensorflow
from keras.utils import to_categorical # permite la clasificacion por
categorias
from keras.models import Sequential,Input,Model # para creacion de red neuronal
en secuencia, con entradas y modelos
from keras.layers import Dense, Dropout, Flatten # capas densas, dropout,
flatten (capas llanas)
from keras.layers import Conv2D, MaxPooling2D #capas convolucionales,
maxpooling
from keras.layers.normalization import BatchNormalization # capas de
normalizacion
from keras.layers.advanced_activations import LeakyReLU # capa de activacion
leakyReLU
import numpy as np # IMPORTA NUMPY (PAQUETE FUNDAMENTAL PARA COMPUTACION
CIENTIFICA)
import math
import tensorflow as tf
import sqlite3
from keras.callbacks import EarlyStopping
from keras.callbacks import ModelCheckpoint
from keras import regularizers
from keras.constraints import unit_norm #restriccion de pesos, tiene el efecto de
que todos los pesos entrantes son pequeños
# se aplican a cada capa pero se aplican por nodo en cada capa, en general no se
utilizan en los sesgos sino en pesos
#normalizar los pesos para que la norma sea igual a 1 (es una buena practica)
from keras.constraints import max_norm
# establecera una restriccion de peso maxima a una capa convolucional
from keras.regularizers import l2
images = []
directories = []
dircount = []
prevRoot=''
cant=0
99
if re.search("\.(jpg|JPG|JPEG|jpeg|png|bmp|tiff)$", filename):#busca
todos los archivos con esas extensiones
cant=cant+1 # cantidad de arvhivos que lee en cada subcarpeta
filepath = os.path.join(root, filename) #une los archivos que
encuentre en la carperta de turno
image = plt.imread(filepath) # lee los datos (imagenes)
images.append(image) # combina imagenes horizontalmente
b = "Leyendo..." + str(cant)
print (b, end="\r") # mostraria los elementos que leyo en cada
subcarpeta
if prevRoot !=root: # condicional (si la subcarpeta anterior es
diferente a la actual)
print(root) #imprime la subcarpeta actual y con el numero que
comience (arriba-abajo)(abajo-arriba)
prevRoot=root #actualiza la subcarperta que sera la previa
directories.append(root) # concatena las subcarpetas (numero de
carpetas existentes)
dircount.append(cant) # concatena el numero de imagenes que lee
(numero de imagenes en carpetas existentes)
cant=0
dircount.append(cant) # concatena el total de imagenes en dircount de los
subdirectorios
dircount = dircount[1:]
calibracion=len(directories)-1
dircount[calibracion]=dircount[calibracion]+1 #corregir el error de conteo
#dircount[0]=dircount[0]+1 ##corregir linea de codigo (quitar)
print('Directorios leidos:',len(directories)) #cantidad de directorios leidos
print("Imagenes en cada directorio", dircount) # imagenes presentes en cada
directorio
print('suma Total de imagenes en subdirs:',sum(dircount)) # suma las imagenes en
todos los subdirectorios
labels=[]
indice=0
#LEER ETIQUETAS USANDO EL TAMAÑO de dircount (subdirectorios)
estado_cultivo=[]
indice=0
100
classes = np.unique(y)
nClasses = len(classes)
print('Total number of outputs : ', nClasses)
print('Output classes : ', classes)
plt.subplot(121)
plt.imshow(X[ri])
plt.title(" ETIQUETA :{}".format(y[ri]))
an=4921
plt.subplot(122)
plt.imshow(X[an])
plt.title(" ETIQUETA :{}".format(y[an]))
plt.tight_layout()
train_X,valid_X,train_label,valid_label = train_test_split(train_X,
train_Y_one_hot, test_size=0.1111, random_state=13)
#print(train_X.shape,valid_X.shape,train_label.shape,valid_label.shape)
print("")
print("el tamaño del conjunto de entrenamiento es:",train_X.shape)
print("el tamaño del conjunto de validacion es: ",valid_X.shape)
print("el tamaño del conjunto de etiquetas de entrenamiento
es:",train_label.shape)
print("el conjunto de etiquetas de validacion es: ",valid_label.shape)
batch_size = 82
epochs = 20
num_classes = 2
model = Sequential()
model.add(Conv2D(32, kernel_size=(3,
3),activation='linear',padding='same',input_shape=(100,100,3)))
model.add(LeakyReLU(alpha=0.1))
model.add(MaxPooling2D((2, 2),padding='same'))
model.add(Dropout(1-0.75)) #capa de abandono introducida
model.add(Conv2D(64, (3, 3),
activation='linear',padding='same',kernel_regularizer=regularizers.l2(0.01)))
101
model.add(LeakyReLU(alpha=0.1))
model.add(MaxPooling2D(pool_size=(2, 2),padding='same'))
model.add(Dropout(1-0.75)) #capa de abandono introducida
model.add(Conv2D(128, (3, 3),
activation='linear',padding='same',kernel_regularizer=regularizers.l2(0.01)))
model.add(LeakyReLU(alpha=0.1))
model.add(MaxPooling2D(pool_size=(2, 2),padding='same'))
model.add(Dropout(1-0.75)) #capa de abandono introducida
model.add(Flatten()) #aplanar la salida de la capa conv de 4-dim a 2-dim
model.add(Dense(128,
activation='linear',kernel_regularizer=regularizers.l2(0.01)))
model.add(LeakyReLU(alpha=0.1))
model.add(Dropout(0.25)) #capa de abandono introducida
model.add(Dense(num_classes, activation='softmax'))
es = EarlyStopping(monitor='val_loss',
mode='min', verbose=1,
patience=15)
mc = ModelCheckpoint('mejor_modelo.h5',
monitor='val_acc',
mode='max',
verbose=1, save_best_only=True)
model.summary()
plot_model(model, to_file='modelo_optimizado.png')
epochs = range(len(accuracy))
102
plt.title('Training and validation accuracy') #TITULO
plt.figure()
plt.plot(epochs, loss, 'b', label='Training loss')# GRAFICA LA PERDIDA DE ENTRENO
Y MUESTRA LEYENDA
plt.plot(epochs, val_loss, 'g', label='Validation loss')# GRAFICA PERDIDA DE
VALIDACION Y MUESTRA LEYENDA
plt.legend()
plt.title('Training and validation loss') #TITULO
plt.show()
#predecir etiquetaS
#Podemos predecir la clasificación de nuevas imágenes. Para ello, simplemente
usaremos
#algunas imágenes del conjunto de prueba, Cargar sus propias imágenes en matrices
numpy y usarlas.
predicted_classes = model.predict(test_X)
import pandas as pd
import numpy as np
import os
import keras
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split # partir datos de entreno y
test con sus porcentajes
from keras.preprocessing.image import ImageDataGenerator
from keras.optimizers import Adam
103
from keras import regularizers
from keras.constraints import unit_norm #restriccion de pesos, tiene el efecto de
que todos los pesos entrantes son pequeños
# se aplican a cada capa pero se aplican por nodo en cada capa, en general no se
utilizan en los sesgos sino en pesos
#normalizar los pesos para que la norma sea igual a 1 (es una buena practica)
from keras.constraints import max_norm
# establecera una restriccion de peso maxima a una capa convolucional
from keras.regularizers import l2
from keras.regularizers import l1
from keras.utils import plot_model
from keras.preprocessing.image import ImageDataGenerator
images = []
directories = []
dircount = []
prevRoot=''
cant=0
dircount = dircount[1:]
calibracion=len(directories)-1
dircount[calibracion]=dircount[calibracion]+1 #corregir el error de conteo
#dircount[0]=dircount[0]+1 ##corregir linea de codigo (quitar)
print('Directorios leidos:',len(directories)) #cantidad de directorios leidos
print("Imagenes en cada directorio", dircount) # imagenes presentes en cada
directorio
print('suma Total de imagenes en subdirs:',sum(dircount)) # suma las imagenes en
todos los subdirectorios
104
labels=[]
indice=0
#LEER ETIQUETAS USANDO EL TAMAÑO de dircount (subdirectorios)
estado_cultivo=[]
indice=0
train_X = train_X.astype('float32')
test_X = test_X.astype('float32')
train_X = train_X / 255.
test_X = test_X / 255.
train_X,valid_X,train_label,valid_label = train_test_split(train_X,
train_Y_one_hot, test_size=0.1111, random_state=13)
#print(train_X.shape,valid_X.shape,train_label.shape,valid_label.shape)
print("")
print("el tamaño del conjunto de entrenamiento es:",train_X.shape)
print("el tamaño del conjunto de validacion es: ",valid_X.shape)
105
print("el tamaño del conjunto de etiquetas de entrenamiento
es:",train_label.shape)
print("el conjunto de etiquetas de validacion es: ",valid_label.shape)
x = base_model.output
x = GlobalAveragePooling2D()(x)
x= Dropout(1-0.5)(x)
x=Dense(128, activation='relu',kernel_regularizer=regularizers.l2(0.01))(x)
x=Dropout(1-0.5)(x)
x=Dense(128, activation='relu',kernel_regularizer=regularizers.l2(0.01))(x)
x=Dropout(1-0.5)(x)
x=Dense(32, activation='relu',kernel_regularizer=regularizers.l2(0.01))(x)
x=Dropout(1-0.5)(x)
# let's add a fully-connected layer
predictions = Dense(2, activation='softmax')(x)
model = Model(inputs=base_model.input, outputs=predictions)
# visualizamos el modelo
for i,layer in enumerate(model.layers):
print(i,layer.name)
model.summary()
# congelar capas
LAYERS_TO_FREEZE=216
for layer in model.layers[:LAYERS_TO_FREEZE]:
layer.trainable = False
106
# visualizamos el modelo
for i,layer in enumerate(model.layers):
print(i,layer.name)
model.summary()
plot_model(model, to_file='inceptionv3.png')
batch_size = 82
epochs = 15
num_classes = 2
epochs = range(len(accuracy))
107
plt.plot(epochs, val_accuracy, 'g', label='Validation accuracy')# GRAFICA
RENDIMIENTO EN VALIDACION Y MUESTRA LEYENDA
#plt.axis([0, 10, 0, 1])
plt.legend()
plt.title('Training and validation accuracy') #TITULO
plt.figure()
plt.plot(epochs, loss, 'b', label='Training loss')# GRAFICA LA PERDIDA DE ENTRENO
Y MUESTRA LEYENDA
plt.plot(epochs, val_loss, 'g', label='Validation loss')# GRAFICA PERDIDA DE
VALIDACION Y MUESTRA LEYENDA
#plt.axis([0, 10, 0, 3])
plt.legend()
plt.title('Training and validation loss') #TITULO
plt.show()
#predecir etiquetaS
#Podemos predecir la clasificación de nuevas imágenes. Para ello, simplemente
usaremos
#algunas imágenes del conjunto de prueba, Cargar sus propias imágenes en matrices
numpy y usarlas.
predicted_classes = model.predict(test_X)
predicted_classes = np.argmax(np.round(predicted_classes),axis=1)
print("tamaño de clases predichas:",predicted_classes.shape)
print("tamaño de las etiquetas del conjunto de prueba:", test_Y.shape)# TAMAÑO DE
LAS PREDICCIONES Y LAS ETIQUETAS DEL CONJUNTO DE TEST
#Etiquetas correctas
correct = np.where(predicted_classes==test_Y)[0] #es un condicional que devuelve
los elemtos que son igulaes
print("se encontraron ", len(correct),"etiquetas correctas")
#etiquetas incorrectas
incorrect = np.where(predicted_classes!=test_Y)[0] # es un condicional que
devuelve los elementos que son desiguales
print("Se encontraron " ,len(incorrect)," muestras incorrectas")
# CODIGO PRINCIPAL
import keras
# from keras.datasets import mnist
import numpy as np
from scipy import misc
108
import matplotlib.pyplot as plt # para graficar
#%matplotlib inline
from sklearn.model_selection import train_test_split # partir datos de entreno y
test con sus porcentajes
from sklearn.metrics import classification_report # para clasificacion de datos
from keras.utils import to_categorical # permite la clasificacion por
categorias
from keras.models import Sequential,Input,Model # para creacion de red neuronal
en secuencia, con entradas y modelos
from keras.layers import Dense, Dropout, Flatten # capas densas, dropout,
flatten (capas llanas)
from keras.layers import Conv2D, MaxPooling2D #capas convolucionales,
maxpooling
from keras.layers.normalization import BatchNormalization # capas de
normalizacion
from keras.layers.advanced_activations import LeakyReLU # capa de activacion
leakyReLU
import math
import tensorflow as tf
import sqlite3 #gestiona base de datos
from keras.callbacks import EarlyStopping # devolucion de llamada de parada
temprana
from keras.callbacks import ModelCheckpoint # devolucion de llamada de puntos de
control
from keras import regularizers # importa la funcion de regularizacion
from keras.constraints import unit_norm #restriccion de pesos, tiene el efecto de
que todos los pesos entrantes son pequeños
# se aplican a cada capa pero se aplican por nodo en cada capa, en general no se
utilizan en los sesgos sino en pesos
#normalizar los pesos para que la norma sea igual a 1 (es una buena practica)
from keras.constraints import max_norm
# establecera una restriccion de peso maxima a una capa convolucional
from keras.regularizers import l2
# train_batch_size = 128
train_batch_size = 82
test_batch_size = 82
num_classes = 2
epochs = 20
image_shape = (100, 100, 3)
images = []
directories = []
dircount = []
prevRoot=''
cant=0
109
cant=cant+1 # cantidad de arvhivos que lee en cada subcarpeta
filepath = os.path.join(root, filename) #une los archivos que
encuentre en la carperta de turno
image = plt.imread(filepath) # lee los datos (imagenes)
images.append(image) # combina imagenes horizontalmente
b = "Leyendo..." + str(cant)
print (b, end="\r") # mostraria los elementos que leyo en cada
subcarpeta
if prevRoot !=root: # condicional (si la subcarpeta anterior es
diferente a la actual)
print(root) #imprime la subcarpeta actual y con el numero que
comience (arriba-abajo)(abajo-arriba)
prevRoot=root #actualiza la subcarperta que sera la previa
directories.append(root) # concatena las subcarpetas (numero de
carpetas existentes)
dircount.append(cant) # concatena el numero de imagenes que lee
(numero de imagenes en carpetas existentes)
cant=0
dircount.append(cant) # concatena el total de imagenes en dircount de los
subdirectorios
dircount = dircount[1:]
calibracion=len(directories)-1
dircount[calibracion]=dircount[calibracion]+1 #corregir el error de conteo
#dircount[0]=dircount[0]+1 ##corregir linea de codigo (quitar)
print('Directorios leidos:',len(directories)) #cantidad de directorios leidos
print("Imagenes en cada directorio", dircount) # imagenes presentes en cada
directorio
print('suma Total de imagenes en subdirs:',sum(dircount)) # suma las imagenes en
todos los subdirectorios
labels=[]
indice=0
#LEER ETIQUETAS USANDO EL TAMAÑO de dircount (subdirectorios)
estado_cultivo=[]
indice=0
110
nClasses = len(classes)
print('Total number of outputs : ', nClasses)
print('Output classes : ', classes)
num_of_train_data = train_X.shape[0]
num_of_test_data = test_X.shape[0]
for e in range(epochs):
train_step_loss = []
train_step_acc = []
# random shuffle
rand_idx = np.random.permutation(num_of_train_data)
train_X = train_X[rand_idx]
train_Y = train_Y[rand_idx]
111
e+1, epochs, j, num_of_train_data, np.mean(train_step_loss),
np.mean(train_step_acc)
), end='')
print("")
test_loss = []
test_acc = []
attack_loss = []
attack_acc = []
for i in range(20):
plt.figure(i+1)
plt.imshow(test_X[i+903])
im=image.array_to_img(test_X[i+903])
im.save("./eps=0.06/imagenes de prueba/ imagen{}.png".format(i+1))
plt.axis('off')
for i in range(20):
plt.figure(i+1)
plt.imshow(attack_images[i+1])
im=image.array_to_img(attack_images[i+1])
im.save("./eps=0.06/adversarias/ adversaria{}.png".format(i+1))
plt.axis('off')
for i in range(20):
plt.figure(i+1)
diferencia=test_X[i+903]-attack_images[i+1]
normalizada= diferencia/abs(diferencia)
plt.imshow(normalizada)
im=image.array_to_img(test_X[i+903]-attack_images[i+1])
im.save("./eps=0.06/ruido/ ruido{}.png".format(i+1))
112
plt.axis('off')
113
model.add(Conv2D(128, (3, 3),
activation='linear',padding='same',kernel_regularizer=regularizers.l2(0.01)))
model.add(LeakyReLU(alpha=0.1))
model.add(MaxPooling2D(pool_size=(2, 2),padding='same'))
model.add(Dropout(1-0.75)) #capa de abandono introducida
model.add(Flatten()) #aplanar la salida de la capa conv de 4-dim a 2-dim
model.add(Dense(128,
activation='linear',kernel_regularizer=regularizers.l2(0.01)))
model.add(LeakyReLU(alpha=0.1))
model.add(Dropout(0.25)) #capa de abandono introducida
model.add(Dense(num_classes, activation='softmax'))
return model
eps = K.placeholder((1,))
grad = K.gradients(loss, [images])[0]
r_adv = eps * K.sign(grad)
attack_images = K.clip(images + r_adv, 0.0, 1.0)
114