Parte 8 Deep Learning
8.1 Redes Neuronales Artificiales
8.1.1 Intuición de las Redes Neuronales Artificiales
Exercise 8.1
¿En qué categoría caen las RNA? ¿Aprendizaje por refuerzo, no supervisado o supervisado?Las RNA pueden ser todas 3. Depende de cómo implemente el modelo. Ejemplos:
- Aprendizaje supervisado: CNN clasificando imágenes en imagenet.
- Aprendizaje no supervisado: máquinas Boltzmann, codificadores automáticos, GAN, DC-GANS, VAE, SOM, etc.
- Aprendizaje por Refuerzo: Q-Learning convolucional profundo que juega videojuegos a partir de entrada de píxeles, AlphaGO, etc. Esta rama se denomina “Aprendizaje por refuerzo profundo” y pertenece a la Inteligencia Artificial.
Exercise 8.2
¿Cómo determina la red neuronal cuáles son los pesos óptimos? ¿Cuándo detiene su aprendizaje?Calcula los pesos óptimos basándose en un algoritmo de optimización empleado para minimizar la función de pérdida con respecto a todos los puntos de datos de entrada. Se detiene cuando la pérdida de entrenamiento se acerca mucho a 0. Además, generalmente elegimos un cierto número de épocas, que es el número de veces que se entrena la red neuronal. Después de la última época, el entrenamiento ha terminado. También existe lo que llamamos “Detención anticipada”, que es una técnica que detiene el entrenamiento una vez que obtenemos una reducción de pérdida demasiado pequeña en un conjunto de validación durante las épocas. En ese caso, el entrenamiento se detiene antes de la última época.
Exercise 8.3
¿Por qué debería reducirse la función de costes?La función de costes es una estimación numérica de cuán equivocadas son nuestras predicciones de redes neuronales. Si reducimos la función de costes, significa que estamos reduciendo los errores cometidos por la red neuronal, lo que a su vez la hace predecir con mayor precisión.
Exercise 8.4
¿Cómo se calcula el peso de cada neurona?Al comienzo del entrenamiento, los pesos se inicializan aleatoriamente cerca de cero. Luego, en cada una de las muchas iteraciones (o épocas), los pesos se actualizan a través del descenso de gradiente, en la dirección que disminuye al máximo el error de pérdida (o función de costo) entre las predicciones y los objetivos.
Exercise 8.5
¿Podrías recapitular el proceso de cada iteración de entrenamiento?Después de que los pesos se inicializan aleatoriamente con valores cercanos a cero, el entrenamiento pasa por muchas iteraciones (el número de iteraciones, también llamado número de épocas, generalmente se decide en la implementación). Aquí está el proceso de cada iteración:
- Propagación hacia adelante: la entrada se propaga hacia adelante dentro de la red neuronal que al final devuelve la predicción.
- Comparamos esa predicción con el objetivo (el valor real que tenemos porque estamos tratando con el conjunto de entrenamiento) y calculamos el error de pérdida entre la predicción y el objetivo.
- Ese error de pérdida se propaga hacia atrás dentro de la red neuronal.
- A través de Gradiente Descendente o el Gradiente Descendente Estocástico, los pesos se actualizan en las direcciones que reducen al máximo el error de pérdida (ya que de hecho el error de pérdida es una función de costo de los pesos).
- Así obtenemos nuevos pesos, listos para hacer una nueva predicción en la próxima iteración. Luego se repite todo el mismo proceso, hasta que el error de pérdida deja de reducirse (parada anticipada) o hasta que el entrenamiento llega a la última época.
8.1.2 Redes Neuronales Artificiales en Python
Exercise 8.6
¿Por qué una RNA sería un mejor modelo / solución que simplemente usar uno de los diferentes modelos que aprendimos en la Parte 3?No es necesariamente la mejor solución para todos los problemas. Por ejemplo, si el problema es lineal, definitivamente esta no es la mejor solución, ya que sería mucho más eficiente con un modelo de regresión lineal. Sin embargo, si el problema no es lineal y complejo, entonces un RNA puede ser un mejor modelo / solución que los modelos de la Parte 3. En la Parte 10 - Selección del modelo, aprenderemos a evaluar esto.
Exercise 8.7
¿Por qué usamos Sequential y Dense?Básicamente es muy simple:
- Sequential se utiliza para inicializar el modelo de aprendizaje profundo como una secuencia de capas (a diferencia de un grafo computacional).
- Dense se usa para agregar una capa de neuronas en la red neuronal.
Exercise 8.8
Recibo algunas advertencias cuando ejecuto la sección de código donde agrego las capas con la funciónDense ()
. ¿Cómo puedo arreglarlo?
Simplemente necesitamos reemplazar:
= 6,
classifier.add(Dense(output_dim = 'uniform',
init = 'relu',
activation = 11)) input_dim
por:
= 6,
classifier.add(Dense(units = "uniform",
kernel_initializer = "relu",
activation = 11)) input_dim
Básicamente, algunos nombres de parámetros cambiaron en la API: output_dim
se convirtió en units
, init
se convirtió en kernel_initializer
y nb_epoch
se convirtió en epochs
. Ocurre con frecuencia en las librerías de todos los lenguajes de programación.
Exercise 8.9
¿Cómo podemos decidir el número de capas ocultas?No existe una regla general y, en general, más capas ocultas pueden brindarnos una mayor precisión, pero también pueden sobreajustar el modelo, por lo que debemos tener cuidado. La clave es la intuición y la experiencia. También puedes experimentar con el ajuste de parámetros que veremos en la Parte 10 - Selección de modelo.
Exercise 8.10
¿Qué hace la función de activación del rectificador lineal unitario?Dado que el aprendizaje profundo se utiliza para resolver problemas no lineales, los modelos deben ser no lineales. Y el uso de la función rectificadora es realmente hacerla no lineal. Al aplicarlo, se está rompiendo la linealidad entre las neuronas de salida y las neuronas de entrada.
Exercise 8.11
¿Qué necesito cambiar si tengo una salida no binaria, p. Ej. ganar, perder y empatar?En ese caso, necesitaríamos crear tres variables ficticias para la variable dependiente:
- \((1,0,0) \rightarrow\) ganar
- \((0,1,0) \rightarrow\) perder
- \((0,0,1) \rightarrow\) empatar
Y, por lo tanto, debe realizarse el siguiente cambio:
= 3 # con la nueva API ahora es: units = 3
output_dim = 'softmax'
activation = 'categorical_crossentropy' loss
Exercise 8.12
¿nb_epoch
ha cambiado de nombre?
Sí, en el código necesitamos reemplazar nb_epoch
por epochs
.
Exercise 8.13
¿Cómo construir la misma red neuronal para la regresión?Primero necesitamos importar:
KerasRegressor
Entonces es casi lo mismo que una ANN para clasificación. La principal diferencia es la función de compilación, donde, por supuesto, necesitamos cambiar la función de pérdida y tomar una función de pérdida para Regresión como el Error cuadrático medio, y eliminar la métrica de precisión:
# Inicializando la RNA
= Sequential()
regressor
# Agregar la capa de entrada y la primera capa oculta
= 6,
regressor.add(Dense(units = 'uniform',
kernel_initializer = 'relu',
activation = 11))
input_dim
# Añadiendo la segunda capa oculta
= 6,
regressor.add(Dense(units = 'uniform',
kernel_initializer = 'relu'))
activation
# Agregar la capa de salida
= 1,
regressor.add(Dense(units = 'uniform'))
kernel_initializer
# Compilar la ANN
compile(optimizer = 'adam', loss = 'mean_squared_error')
regressor.
# Ajuste de la RNA al conjunto de entrenamiento
regressor.fit(X_train,
y_train,= 10,
batch_size = 100) epochs
Exercise 8.14
¿De dónde provienen todos los hiperparámetros? ¿Cómo elegimos el número de capas, el número de neuronas en cada capa y todos los demás parámetros?A través de mucha investigación y experimentación. No existe una regla general para elegir tales números. Por lo general, pueden encontrarse algunas arquitecturas de redes neuronales listas para usar en línea que demuestran obtener buenos resultados. Pero puedes experimentar ajustando el modelo manualmente con otros valores de parámetros. Y, por último, puede utilizar algunas técnicas de ajuste de parámetros como Grid Search con k-Fold Cross Validation para encontrar los valores óptimos. Aprenderás cómo hacerlo en la Parte 10: Selección de modelo.
Exercise 8.15
¿Cómo puedo mejorar la precisión de la ANN?Esta es la pregunta del millón. Los científicos de datos han estado tratando de averiguar esta respuesta durante un tiempo. Por lo general, los modelos ANN requieren una buena cantidad de ajustes, generalmente en forma de cambio de número de capas ocultas, cambio de fórmulas y normalización de datos. Por lo general, estas cosas te llevarán más lejos.
8.1.3 Redes neuronales Artificiales en R
Exercise 8.16
¿Por qué usamosas.numeric(factor())
?
Porque para construir la red neuronal usaremos el paquete H2O que espera las entradas como factores numéricos (o variables categóricas numéricas).
Exercise 8.17
Si elijo \(\textrm{hidden} = c(a_1,a_2,a_3..a_n)\), ¿Significa esto que hay \(n\) capas ocultas en el modelo y \(a_1, a_2, ..., a_n\) son el número de nodos en cada capa oculta?¡Así es, correcto!
Exercise 8.18
¿El número de nodos en cada capa oculta es siempre el mismo? ¿O podemos especificar diferentes nodos en cada capa oculta? ¿Cómo elegimos estos números?No, puedes jugar con ellos y ver si puedes obtener mejores resultados. Sin embargo, te recomendamos que observes el administrador de tareas para ver si la memoria de tu ordenador es suficiente para manejar tantas capas y sus nodos. Puede elegirlos experimentando manualmente (prueba y error) o mediante el ajuste de parámetros con búsqueda de cuadrícula (consulta la Parte 10 - Selección de modelo).
Exercise 8.19
En Python aplicamos la función rectificadora a las capas ocultas, pero la función sigmoidea a la capa de resultado. ¿Cómo elegir las mismas opciones con R?Usando H2O en R, se aplicó la función rectificadora a cada capa. Aquí no existe la opción de elegir diferentes funciones de activación para diferentes capas.
Exercise 8.20
¿Python o R para el aprendizaje profundo?Python Sin duda. Python es utilizado por los mejores científicos de Deep Learning en la actualidad y tiene librerías increíbles (Tensorflow, Keras, PyTorch) desarrolladas para aplicaciones poderosas (clasificación de imágenes, visión por computadora, inteligencia artificial, chatbots, traducción automática, etc.).
8.2 Redes neuronales convolucionales
8.2.1 Intuición de las Redes neuronales convolucionales
Exercise 8.21
¿Cuáles son las diferencias entre CNN y ANN? ¿La CNN se aplica solo a la clasificación de imágenes?ANN significa redes neuronales en general. Entonces una CNN es una ANN. Las CNN no solo se utilizan para el procesamiento de imágenes, sino que también se pueden aplicar a texto como la comprensión de texto.
Exercise 8.22
¿Hasta qué punto se reducirá el tamaño de la imagen para el detector de características?En la sección práctica se reducirá a 64 por 64 dimensiones.
Exercise 8.23
¿Cuál es el propósito de los mapas de características?Estamos creando mapas de características con cada filtro convolucional, lo que significa que estamos creando características que nos ayudan a clasificar el objeto. El ejemplo que se muestra en la lección de intuición es como un filtro de detección de bordes unidimensional. Ese es un mapa de características. Por lo tanto, queremos que nuestro modelo se “active” en un mapa de características solo donde haya un borde. Tendremos varios mapas de características como este que, cuando estén todos juntos, nos ayudarán a identificar el objeto. Esto se ayuda eliminando el negro o los valores negativos.
Exercise 8.24
¿Cuál es el propósito del ReLU?La principal razón por la que usamos ReLU es porque queremos aumentar la no linealidad en nuestra imagen. Y ReLU actúa como una función que rompe la linealidad. Y la razón por la que queremos romper la linealidad en nuestra red es porque las imágenes en sí mismas son altamente no lineales. De hecho, tienen muchos elementos no lineales como las transiciones entre píxeles.
Exercise 8.25
¿Por qué Max-Pooling considera solo 4 valores para tomar un máximo y no 2 u 8 valores? También en convolución, ¿cómo se forma el detector de características?Porque se toma un máximo de un punto en la imagen que está representado por un cuadrado de 2x2 en nuestra imagen. Por lo tanto, cubre 4 píxeles.
Exercise 8.26
Después del aplanamiento, ¿obtendremos un vector largo para todas las capas agrupadas o un vector para cada capa agrupada?Será un vector largo que reúna todas las capas aplanadas.
8.2.2 Redes neuronales convolucionales en Python
Exercise 8.27
¿Cuántas imágenes se requieren para entrenar a un buen modelo? ¿Existe alguna regla general para esta decisión?10,000 es un buen número. No hay reglas generales, solo que cuanto más tenga, más posibilidades tendrá de obtener una buena precisión.
Exercise 8.28
¿Podría explicar los números 0, 1, 2, 3 y 4 en los mapas de características?Cuando el detector de características 3x3 cubre una parte de la imagen de entrada, obtiene:
- 0 si no hay 1 en común entre la subtabla 3x3 de la imagen de entrada y el detector de características 3x3,
- 1 si hay un 1 en común entre la subtabla 3x3 de la imagen de entrada y el detector de características 3x3,
- 2 si hay dos 1 en común entre la subtabla 3x3 de la imagen de entrada y el detector de características 3x3,
- 3 si hay tres 1 en común entre la subtabla 3x3 de la imagen de entrada y el detector de características 3x3,
- 4 si hay cuatro 1 en común entre la subtabla 3x3 de la imagen de entrada y el detector de características 3x3.
Exercise 8.29
¿Podrías repasar la propagación hacia adelante de las imágenes de entrada que ocurren dentro de la CNN describiendo en pocas palabras las clases que usamos en Python?Claro, aquí está el proceso con las descripciones esenciales de las clases utilizadas:
- Sequential se usa primero para especificar que introducimos una secuencia de capas, a diferencia de un gráfico computacional.
- Luego, se usa Convolution2D para agregar la capa convolucional.
- Luego, MaxPooling2D se usa para aplicar Max Pooling a las imágenes de entrada.
- A continuación, se utiliza Flatten para aplanar las imágenes agrupadas.
- Dense se usa para agregar la capa de salida con softmax.
Exercise 8.30
¿Cómo hacer una sola predicción de si una imagen específica contiene un gato o un perro?Dentro de la carpeta del conjunto de datos, tenemos que crear una carpeta adicional separada (llamémosla “single_prediction”) que contenga la imagen (llamémosla “cat_or_dog.jpg”) que deseamos predecir y ejecutar el siguiente código:
import numpy as np
from keras.preprocessing import image as image_utils
= image_utils.load_img('dataset/single_prediction/cat_or_dog.jpg',
test_image = (64, 64))
target_size = image_utils.img_to_array(test_image)
test_image = np.expand_dims(test_image, axis = 0)
test_image = classifier.predict_on_batch(test_image)
result
training_set.class_indicesif result[0][0] == 1:
= 'dog'
prediction else:
= 'cat' prediction