Entrenando nuestra primera red convolucional
Clase 5 de 25 • Curso de Redes Neuronales Convolucionales con Python y Keras
Contenido del curso
FELIX DAVID CORDOVA GARCIA
Alarcon7a
Alarcon7a
luis fernando Tapia
Andres Gutiérrez Castillo
Romel Manrique
María Verónica García Atehortúa
Alarcon7a
GABRIEL OMAR TARAPUES RODRIGUEZ
Alarcon7a
Carlos Isael Ramírez González
YEICO LAINER GIRALDO ESCOBAR
Alarcon7a
Mateo González Marulanda
Robert Junior Buleje del Carpio
Platzi Team
Mario Alexander Vargas Celis
Ricardo Cruz
Fernando Marquez
Jhon Freddy Tavera Blandon
Manuel Sosa
Pold Anampa Saravia
Cristian Tinipuclla
Cristian Tinipuclla
Hola¡ Les traigo un método alternativo para desarrollar esta red neuronal, con este método no usarán categorical_crossentropy ni from tensorflow.keras.utils import to_categorical, ni tampoco “softmax” en la ultima capa Dense, en cambio solo usarán SparseCategoricalCrossEntropy. El codigo es el siguiente:
Excelente aporte
gran aporte
Trate con 15 y con 20 epochs pero sigue dando el mismo resultado
Esto es debido a que tu modelo es muy simple para la tarea o necesitas mas o mejor dataset. Este es el verdadero reto la ingenieria de datos e ingenieria de modelo
Si están haciendo el proceso desde su pc en local y no tienen una gpu Nvidia, pueden utilizar un backend como PlaidML.
Lo que observo es que a mayor épocas, se reduce la precisión del algoritmo.
es un interesante hallazgo... la red empieza a diverger :ok
yo probe con 10, 25 y 50, y estos fueron mis resultados:
10 [0.28235912322998047, 0.9017999768257141] 25 [0.36978527903556824, 0.8761000037193298] 50 [0.43726015090942383, 0.8583999872207642]
El algoritmo diverge .. fascinante
Como aporte, yo lo hice con la CPU de mi computadora, obtuve 0.08923 de accuracy con 10 epchs
Si uno vuelve a correr el model.fit y el model.evaluate, sin cambiar la epoca y nada de lo anterior, los resultados cambian, a qué se debe esto?
Cada entrenamiento tiene pesos distintos a pesar de ser la misma arquitectura
Estuve evaluando el accuracy aumentando las epocas y pude ver que, a pesar del ruido, la tendencia es a aumentar, teniendo el pico maximo en la 93. Les dejo las graficas quie consegui con 50 y 100 epocas: 50 epochs
Algo que no encontrado en los cursos, es que te enseñen a armar tu dataset desde cero. En vez de descargar uno de internet ya previamente trabajado, si no literal desde cero con tus propias imágenes, etc.
A little bit late, but TensorFlow has some information to create dataset from scratch. There you are the link:
¡Claro! Vamos a crear un ejemplo de entrenamiento de una red neuronal convolucional (CNN) utilizando TensorFlow y el conjunto de datos Fashion MNIST. Este conjunto de datos contiene imágenes de ropa en 10 categorías diferentes. Te proporcionaré el código y una explicación detallada del proceso.
### Ejemplo de Código
Aquí tienes un ejemplo de cómo construir y entrenar una CNN en TensorFlow:
import tensorflow as tf from tensorflow.keras.datasets import fashion\_mnist from tensorflow.keras.layers import Conv2D, MaxPooling2D, Dropout, Flatten, Dense, Input from tensorflow.keras.models import Sequential from tensorflow.keras.utils import to\_categorical import matplotlib.pyplot as plt \# Cargar el conjunto de datos (train\_images, train\_labels), (test\_images, test\_labels) = fashion\_mnist.load\_data() \# Preprocesar las imágenes train\_images = train\_images.reshape((60000, 28, 28, 1)).astype('float32') / 255.0 # Normalizar y redimensionar test\_images = test\_images.reshape((10000, 28, 28, 1)).astype('float32') / 255.0 # Normalizar y redimensionar \# Convertir etiquetas a formato categórico train\_labels = to\_categorical(train\_labels, num\_classes=10) test\_labels = to\_categorical(test\_labels, num\_classes=10) \# Definir el modelo model = Sequential() model.add(Input(shape=(28, 28, 1))) # Capa de entrada model.add(Conv2D(filters=64, kernel\_size=(3, 3), padding='same', activation='relu')) model.add(MaxPooling2D(pool\_size=(2, 2))) model.add(Dropout(0.3)) model.add(Conv2D(filters=32, kernel\_size=(3, 3), padding='same', activation='relu')) model.add(MaxPooling2D(pool\_size=(2, 2))) model.add(Dropout(0.3)) model.add(Flatten()) model.add(Dense(256, activation='relu')) model.add(Dropout(0.5)) model.add(Dense(10, activation='softmax')) \# Compilar el modelo model.compile(optimizer='adam', loss='categorical\_crossentropy', metrics=\['accuracy']) \# Entrenar el modelo history = model.fit(train\_images, train\_labels, epochs=10, batch\_size=64, validation\_split=0.2) \# Evaluar el modelo test\_loss, test\_accuracy = model.evaluate(test\_images, test\_labels) print(f'Test accuracy: {test\_accuracy:.4f}') \# Graficar la pérdida y precisión durante el entrenamiento plt.plot(history.history\['accuracy'], label='Precisión de entrenamiento') plt.plot(history.history\['val\_accuracy'], label='Precisión de validación') plt.title('Precisión del modelo') plt.ylabel('Precisión') plt.xlabel('Épocas') plt.legend() plt.show()
### Explicación del Código
1. **Carga de Datos**:
- Utilizamos fashion\_mnist.load\_data() para cargar el conjunto de datos. Contiene imágenes de ropa, divididas en un conjunto de entrenamiento (60,000 imágenes) y un conjunto de prueba (10,000 imágenes).
2. **Preprocesamiento**:
- Redimensionamos las imágenes a un formato adecuado para la red convolucional (28x28x1), ya que son imágenes en escala de grises.
- Normalizamos los valores de los píxeles dividiendo por 255.0 para que estén en el rango [0, 1].
- Convertimos las etiquetas en formato categórico utilizando to\_categorical(), para que el modelo pueda interpretar las clases de manera adecuada.
3. **Definición del Modelo**:
- Usamos Sequential() para construir el modelo de manera lineal.
- **Capas Convolucionales** (Conv2D):
- La primera capa convolucional tiene 64 filtros de tamaño 3x3 y usa la activación ReLU.
- La segunda capa tiene 32 filtros, también de tamaño 3x3.
- **Max Pooling** (MaxPooling2D): Se utiliza para reducir las dimensiones de la imagen, preservando características importantes.
- **Dropout**: Se agrega para prevenir el sobreajuste al desactivar un porcentaje de las neuronas durante el entrenamiento.
- **Capa densa** (Dense): Se utiliza para la clasificación final. La última capa tiene 10 neuronas (una por cada categoría) con activación softmax.
4. **Compilación del Modelo**:
- Usamos el optimizador Adam y la función de pérdida de entropía cruzada categórica. La métrica de precisión se utiliza para evaluar el rendimiento.
5. **Entrenamiento**:
- Entrenamos el modelo durante 10 épocas con un tamaño de lote de 64. Usamos una fracción del conjunto de entrenamiento (20%) para validación.
6. **Evaluación**:
- Evaluamos el modelo en el conjunto de prueba y mostramos la precisión.
7. **Visualización**:
- Graficamos la precisión de entrenamiento y validación a lo largo de las épocas para observar el rendimiento del modelo.
### Conclusión
Este código proporciona un punto de partida para trabajar con redes neuronales convolucionales en tareas de clasificación de imágenes. Puedes experimentar con diferentes arquitecturas, parámetros y técnicas de regularización para mejorar el rendimiento del modelo en el conjunto de datos de Fashion MNIST.
Llega un punto en donde el modelo no llega a aprender mas, si no que se queda estancado en solo un porcentaje de mejora esto puede dar como que el modelo es una tarea muy simple, pero ahora tonta el reto de verdad, ver si realmente etiqueta cada imagen.
Mis Resultados
Epoch 1/10 938/938 ━━━━━━━━━━━━━━━━━━━━ 5s 4ms/step - accuracy: 0.9922 - loss: 0.0249 Epoch 2/10 938/938 ━━━━━━━━━━━━━━━━━━━━ 2s 2ms/step - accuracy: 0.9943 - loss: 0.0185 Epoch 3/10 938/938 ━━━━━━━━━━━━━━━━━━━━ 2s 2ms/step - accuracy: 0.9952 - loss: 0.0148 Epoch 4/10 938/938 ━━━━━━━━━━━━━━━━━━━━ 2s 2ms/step - accuracy: 0.9963 - loss: 0.0115 Epoch 5/10 938/938 ━━━━━━━━━━━━━━━━━━━━ 2s 2ms/step - accuracy: 0.9974 - loss: 0.0088 Epoch 6/10 938/938 ━━━━━━━━━━━━━━━━━━━━ 2s 2ms/step - accuracy: 0.9973 - loss: 0.0080 Epoch 7/10 938/938 ━━━━━━━━━━━━━━━━━━━━ 2s 2ms/step - accuracy: 0.9981 - loss: 0.0058 Epoch 8/10 938/938 ━━━━━━━━━━━━━━━━━━━━ 2s 2ms/step - accuracy: 0.9984 - loss: 0.0047 Epoch 9/10 938/938 ━━━━━━━━━━━━━━━━━━━━ 2s 2ms/step - accuracy: 0.9985 - loss: 0.0056 Epoch 10/10 938/938 ━━━━━━━━━━━━━━━━━━━━ 2s 2ms/step - accuracy: 0.9991 - loss: 0.0030 <keras.src.callbacks.history.History at 0x7f65a80e5ea0>
[0.04491740092635155, 0.9926000237464905]
😽😽
obtuve 91.5% de precision, batch size de 100 y 15 epocas PD: no se como subir imagenes D:
jajaj le tomas captura, lo guardas en cualquier directorio y lo arrastras en tu comentario 🤭👍.
Sin validation split, resultado de evaluación: [0.2683935761451721, 0.9047999978065491]
Con validation split=0.2, resultado de evaluación: [0.24510954320430756, 0.9143000245094]
Esto confirma por qué tan importante es usar data de validación en el entrenamiento de nuestro modelo (como ya se vió en el curso de Fundamentos de Redes neuronales) :D