Un claro caso de overfitting, Me esta encantado el curso, Gracias maestro
Cómo utilizar TensorFlow 2.0 con Python
Redes neuronales con TensorFlow
Introducción a TensorFlow 2.0
Manejo y preprocesamiento de datos para redes neuronales
Uso de data pipelines
Cómo cargar bases de datos JSON
Cargar bases de datos CSV y BASE 64
Preprocesamiento y limpieza de datos
Keras datasets
Datasets generators
Aprende a buscar bases de datos para deep learning
Cómo distribuir los datos
Crear la red neural, definir capas, compilar, entrenar, evaluar y predicciones
Optimización de precisión de modelos
Métodos de regularización: overfitting y underfitting
Recomendaciones prácticas para ajustar un modelo
Métricas para medir la eficiencia de un modelo: callback
Monitoreo del entrenamiento en tiempo real: early stopping y patience
KerasTuner: construyendo el modelo
KerasTuner: buscando la mejor configuración para tu modelo
Almacenamiento y carga de modelos
Almacenamiento y carga de modelos: pesos y arquitectura
Criterios para almacenar los modelos
Fundamentos de aprendizaje por transferencia
Introducción al aprendizaje por transferencia
Cuándo utilizar aprendizaje por transferencia
Carga de sistemas pre-entrenados en Keras
API funcional de Keras
Uso sistemas pre-entrenados de TensorFlow Hub
Resultados de entrenamiento
Introducción a variables relevantes del TensorBoard
Análisis y publicación de resultados del entrenamiento
Introducción al despliegue de modelos en producción
Siguientes pasos con deep learning
No tienes acceso a esta clase
¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera
No se trata de lo que quieres comprar, sino de quién quieres ser. Aprovecha el precio especial.
Antes: $249
Paga en 4 cuotas sin intereses
Termina en:
Ya tenemos todas las configuraciones previas para programar nuestra red, lo siguiente será definir una arquitectura, compilar el modelo y revisar el rendimiento de la red.
Definiremos un modelo con la clase Sequential de Keras, esta nos permitirá apilar varias capas una encima de otra para lograr el efecto de aprendizaje profundo.
La primer capa será de entrada, donde recibiremos una imagen de 28x28 pixeles en un solo canal, una vez recibida será aplanada para ser procesada como un array unidimensional.
Las siguientes 2 capas serán capas profundas con 256 y 128 neuronas respectivamente, y tendrán como función de activación la ReLU.
La capa de salida será una capa de 24 neuronas (una por cada posible clase) de activación Softmax que nos retornará un array con las probabilidades de cada letra.
python
model_base = tf.keras.models.Sequential(
[tf.keras.layers.Flatten(input_shape = (28, 28, 1)),
tf.keras.layers.Dense(256, activation = "relu"),
tf.keras.layers.Dense(128, activation = "relu"),
tf.keras.layers.Dense(len(classes), activation = "softmax")]
)
Si llamamos el método summary obtendremos un resumen de la arquitectura de la red.
```python model_base.summary()
Model: "sequential"
flatten_2 (Flatten) (None, 784) 0
dense_5 (Dense) (None, 256) 200960
dense_6 (Dense) (None, 128) 32896
dense_7 (Dense) (None, 24) 3096
================================================================= Total params: 236,952 Trainable params: 236,952 Non-trainable params: 0
```
Compilaremos el modelo definiendo un optimizador, para este caso determinamos adam, un algoritmo que permite actualizar automáticamente el learning rate según el desempeño de la red. Como función de pérdida aplicaremos categorical cross entropy y la métrica de éxito será la precisión.
Entrenaremos el modelo con el image generator de entrenamiento, durante 20 épocas y con los datos de validación.
```python model_base.compile(optimizer = "adam", loss = "categorical_crossentropy", metrics = ["accuracy"])
history = model_base.fit( train_generator, epochs = 20, validation_data = validation_generator ) ```
En la época final tendremos una precisión casi total durante el entrenamiento pero un rendimiento diferente sobre los datos de validación.
python
Epoch 20/20
215/215 [==============================] - 6s 27ms/step - loss: 0.0101 - accuracy: 0.9999 - val_loss: 1.3020 - val_accuracy: 0.7572
Si evaluamos el modelo, nos encontraremos con una precisión del 76%, donde entrenamiento era casi absoluta.
python
results = model_base.evaluate(test_generator)
57/57 [==============================] - 2s 36ms/step - loss: 1.2101 - accuracy: 0.7616
Para entender más gráficamente lo que sucedió, crearemos la función de visualización de resultados, que comparará el rendimiento del entrenamiento sobre el rendimiento de validación tanto términos de accuracy como de loss.
```python def visualizacion_resultados(history): epochs = [i for i in range(20)] fig, ax = plt.subplots(1, 2) train_acc = history.history["accuracy"] train_loss = history.history["loss"] val_acc = history.history["val_accuracy"] val_loss = history.history["val_loss"] fig.set_size_inches(16, 9)
ax[0].plot(epochs, train_acc, "go-", label = "Train accuracy") ax[0].plot(epochs, val_acc, "ro-", label = "Validation accuracy") ax[0].set_title("Train and Val accuracy") ax[0].legend() ax[0].set_xlabel("Epochs") ax[0].set_ylabel("Accuracy")
ax[1].plot(epochs, train_loss, "go-", label = "Train Loss") ax[1].plot(epochs, val_loss, "ro-", label = "Validation Loss") ax[1].set_title("Train and Val loss") ax[1].legend() ax[1].set_xlabel("Epochs") ax[1].set_ylabel("Loss")
plt.show() ```
Si corremos la función obtendremos información valiosísima con respecto al comportamiento del modelo.
python
visualizacion_resultados(history)
Puedes notar una diferencia abrupta tanto en el accuracy como en el loss, en la etapa de entrenamiento la red aprendió óptimamente y redujo la pérdida de manera constante, mientras que en validación sufrió de un rápido estancamiento, esto puede ser señal de overfitting, donde la red calcó los ejemplos y no los patrones.
Contribución creada por Sebastián Franco Gómez.
Aportes 16
Preguntas 5
Un claro caso de overfitting, Me esta encantado el curso, Gracias maestro
Para ahorrar tiempo:
def visualizacion_resultados(history):
epochs = [i for i in range(20)]
fig, ax = plt.subplots(1,2)
train_acc = history.history["accuracy"]
train_loss = history.history["loss"]
val_acc = history.history["val_accuracy"]
val_loss = history.history["val_loss"]
fig.set_size_inches(16,9)
ax[0].plot(epochs, train_acc, "go-",label = "Entrenamiento accuracy")
ax[0].plot(epochs, val_acc, "ro-",label = "Validación accuracy")
ax[0].set_title("Entrenamiento y validación accuracy")
ax[0].legend()
ax[0].set_xlabel("Epochs")
ax[0].set_ylabel("Accuracy")
ax[1].plot(epochs, train_loss, "go-",label = "Entrenamiento loss")
ax[1].plot(epochs, val_loss, "ro-",label = "Validación loss")
ax[1].set_title("Entrenamiento y validación loss")
ax[1].legend()
ax[1].set_xlabel("Epochs")
ax[1].set_ylabel("Loss")
plt.show()
Para que ahorren tiempo
si, es un vivo ejemplo de overfitting, y el curso esta confirmando de forma mucho mas practica todo el background que se debe de tener en NN
Trabajando con el dataset de Malaria se obtienen los siguientes resultados:
Existe una buena relación entre la curva de entrenamiento y la curva de validación, se podría decir que el modelo se ha generalizado correctamente, aunque debemos tomar en cuenta que solamente se ha logrado una precisión de 0.72.
cada vez se pone mejor el curso 😃
El sobreajuste es un problema común en el aprendizaje automático, particularmente cuando se entrenan redes neuronales, donde el modelo aprende demasiado bien los datos de entrenamiento pero no logra generalizar de manera efectiva a datos invisibles.
Tomando en cuenta el curso de fundamentos de redes neuronales, realicé un dropout del 40% para mejorar el overffiting presentado en las gráficas. Vale la pena decir que se puede mejorar
Código:
#Implementar modelo y creación de capas
model_base = tf.keras.models.Sequential([#La capa siguiente depende de la anterior
tf.keras.layers.Flatten(input_shape=(28,28,1)),
tf.keras.layers.Dense(256,activation = "relu"),
tf.keras.layers.Dropout(0.40),
tf.keras.layers.Dense(128,activation = "relu"),
tf.keras.layers.Dense(len(classes),activation = "softmax")
])
El split de validación siempre debe salir de training, es por esto que solo existen las etiquetas “training” y “validation” para los subset.
*
En el dataset de señales, hay en total 27455 imágenes de train y 7172 de test.
*
Si saco el 0.2 de validación del dataset de training al final obtengo:
train: 21974
validation: 5481
test: 7172
Es decir, las imágenes de validación no se tienen en cuenta en el training.
*
Sin embargo, si saco el 0.2 de validación del dataset de testeo (como lo hizo el profesor), obtengo:
train: 27455
validation: 1425
test: 7172
Es decir, las imágenes que estoy usando en validación, son imágenes que luego uso en el test, ya que estas no son descontadas del otro generador sino copiadas.
Existe overfitting dado que el modelo se ajusto de sobremanera a los datos de entrenamiento y no generalizó para los datos de validación.
ejemplo si estoy trabajando en una clasificacion binaria donde haria dos elecciones es positivo o es negativo
seria algo asi
classes=[‘positivo’,‘negativo’]
tf.keras.layers .dense (len(classes) , activation =‘sigmoud’)
??? esta bn ??
¿Quieres ver más aportes, preguntas y respuestas de la comunidad?