└── ClasificadorRopa.py /ClasificadorRopa.py: -------------------------------------------------------------------------------- 1 | import tensorflow as tf 2 | import tensorflow_datasets as tfds 3 | 4 | #Descargar set de datos de Fashion MNIST de Zalando 5 | datos, metadatos = tfds.load('fashion_mnist', as_supervised=True, with_info=True) 6 | 7 | #Imprimir los metadatos para ver que trae el set 8 | metadatos 9 | 10 | #Obtenemos en variables separadas los datos de entrenamiento (60k) y pruebas (10k) 11 | datos_entrenamiento, datos_pruebas = datos['train'], datos['test'] 12 | 13 | #Etiquetas de las 10 categorias posibles 14 | nombres_clases = metadatos.features['label'].names 15 | 16 | 17 | #Funcion de normalizacion para los datos (Pasar de 0-255 a 0-1) 18 | #Hace que la red aprenda mejor y mas rapido 19 | def normalizar(imagenes, etiquetas): 20 | imagenes = tf.cast(imagenes, tf.float32) 21 | imagenes /= 255 #Aqui lo pasa de 0-255 a 0-1 22 | return imagenes, etiquetas 23 | 24 | #Normalizar los datos de entrenamiento y pruebas con la funcion que hicimos 25 | datos_entrenamiento = datos_entrenamiento.map(normalizar) 26 | datos_pruebas = datos_pruebas.map(normalizar) 27 | 28 | #Agregar a cache (usar memoria en lugar de disco, entrenamiento mas rapido) 29 | datos_entrenamiento = datos_entrenamiento.cache() 30 | datos_pruebas = datos_pruebas.cache() 31 | 32 | #Mostrar una imagen de los datos de pruebas, de momento mostremos la primera 33 | for imagen, etiqueta in datos_entrenamiento.take(1): 34 | break 35 | imagen = imagen.numpy().reshape((28,28)) #Redimensionar, cosas de tensores, lo veremos despues 36 | 37 | import matplotlib.pyplot as plt 38 | 39 | #Dibujar dibujar 40 | plt.figure() 41 | plt.imshow(imagen, cmap=plt.cm.binary) 42 | plt.colorbar() 43 | plt.grid(False) 44 | plt.show() 45 | 46 | #Dibujar mas 47 | plt.figure(figsize=(10,10)) 48 | for i, (imagen, etiqueta) in enumerate(datos_entrenamiento.take(25)): 49 | imagen = imagen.numpy().reshape((28,28)) 50 | plt.subplot(5,5,i+1) 51 | plt.xticks([]) 52 | plt.yticks([]) 53 | plt.grid(False) 54 | plt.imshow(imagen, cmap=plt.cm.binary) 55 | plt.xlabel(nombres_clases[etiqueta]) 56 | plt.show() 57 | 58 | #Crear el modelo 59 | modelo = tf.keras.Sequential([ 60 | tf.keras.layers.Flatten(input_shape=(28,28,1)), #1 - blanco y negro 61 | tf.keras.layers.Dense(50, activation=tf.nn.relu), 62 | tf.keras.layers.Dense(50, activation=tf.nn.relu), 63 | tf.keras.layers.Dense(10, activation=tf.nn.softmax) #Para redes de clasificacion 64 | ]) 65 | 66 | #Compilar el modelo 67 | modelo.compile( 68 | optimizer='adam', 69 | loss=tf.keras.losses.SparseCategoricalCrossentropy(), 70 | metrics=['accuracy'] 71 | ) 72 | 73 | #Los numeros de datos en entrenamiento y pruebas (60k y 10k) 74 | num_ej_entrenamiento = metadatos.splits["train"].num_examples 75 | num_ej_pruebas = metadatos.splits["test"].num_examples 76 | 77 | print(num_ej_entrenamiento) 78 | print(num_ej_pruebas) 79 | 80 | #El trabajo por lotes permite que entrenamientos con gran cantidad de datos se haga de manera mas eficiente 81 | TAMANO_LOTE = 32 82 | 83 | #Shuffle y repeat hacen que los datos esten mezclados de manera aleatoria para que la red 84 | #no se vaya a aprender el orden de las cosas 85 | datos_entrenamiento = datos_entrenamiento.repeat().shuffle(num_ej_entrenamiento).batch(TAMANO_LOTE) 86 | datos_pruebas = datos_pruebas.batch(TAMANO_LOTE) 87 | 88 | import math 89 | 90 | #Entrenar 91 | historial = modelo.fit(datos_entrenamiento, epochs=10, steps_per_epoch= math.ceil(num_ej_entrenamiento/TAMANO_LOTE)) 92 | 93 | 94 | #Ver la funcion de perdida 95 | plt.xlabel("# Epoca") 96 | plt.ylabel("Magnitud de pérdida") 97 | plt.plot(historial.history["loss"]) 98 | 99 | #Pintar una cuadricula con varias predicciones, y marcar si fue correcta (azul) o incorrecta (roja) 100 | import numpy as np 101 | 102 | for imagenes_prueba, etiquetas_prueba in datos_pruebas.take(1): 103 | imagenes_prueba = imagenes_prueba.numpy() 104 | etiquetas_prueba = etiquetas_prueba.numpy() 105 | predicciones = modelo.predict(imagenes_prueba) 106 | 107 | def graficar_imagen(i, arr_predicciones, etiquetas_reales, imagenes): 108 | arr_predicciones, etiqueta_real, img = arr_predicciones[i], etiquetas_reales[i], imagenes[i] 109 | plt.grid(False) 110 | plt.xticks([]) 111 | plt.yticks([]) 112 | 113 | plt.imshow(img[...,0], cmap=plt.cm.binary) 114 | 115 | etiqueta_prediccion = np.argmax(arr_predicciones) 116 | if etiqueta_prediccion == etiqueta_real: 117 | color = 'blue' 118 | else: 119 | color = 'red' 120 | 121 | plt.xlabel("{} {:2.0f}% ({})".format(nombres_clases[etiqueta_prediccion], 122 | 100*np.max(arr_predicciones), 123 | nombres_clases[etiqueta_real]), 124 | color=color) 125 | 126 | def graficar_valor_arreglo(i, arr_predicciones, etiqueta_real): 127 | arr_predicciones, etiqueta_real = arr_predicciones[i], etiqueta_real[i] 128 | plt.grid(False) 129 | plt.xticks([]) 130 | plt.yticks([]) 131 | grafica = plt.bar(range(10), arr_predicciones, color="#777777") 132 | plt.ylim([0, 1]) 133 | etiqueta_prediccion = np.argmax(arr_predicciones) 134 | 135 | grafica[etiqueta_prediccion].set_color('red') 136 | grafica[etiqueta_real].set_color('blue') 137 | 138 | filas = 5 139 | columnas = 5 140 | num_imagenes = filas*columnas 141 | plt.figure(figsize=(2*2*columnas, 2*filas)) 142 | for i in range(num_imagenes): 143 | plt.subplot(filas, 2*columnas, 2*i+1) 144 | graficar_imagen(i, predicciones, etiquetas_prueba, imagenes_prueba) 145 | plt.subplot(filas, 2*columnas, 2*i+2) 146 | graficar_valor_arreglo(i, predicciones, etiquetas_prueba) 147 | 148 | #Probar una imagen suelta 149 | imagen = imagenes_prueba[4] #AL ser la variable imagenes_prueba solo tiene lo que se le puso en el bloque anterior heheh 150 | imagen = np.array([imagen]) 151 | prediccion = modelo.predict(imagen) 152 | 153 | print("Prediccion: " + nombres_clases[np.argmax(prediccion[0])]) 154 | 155 | #Exportacion del modelo a h5 156 | modelo.save('modelo_exportado.h5') 157 | 158 | --------------------------------------------------------------------------------