Ia de cambio de f a c import tensorflow as tf import tensorflow_datasets as tfds
#Descargar set de datos de Fashion MNIST de Zalando datos, metadatos = tfds.load('fashion_mnist', as_supervised=True, with_info=True)
#Imprimir los metadatos para ver que trae el set metadatos
#Obtenemos en variables separadas los datos de entrenamiento (60k) y pruebas (10k) datos_entrenamiento, datos_pruebas = datos['train'], datos['test']
#Etiquetas de las 10 categorias posibles nombres_clases = metadatos.features['label'].names
nombres_clases
['T-shirt/top', 'Trouser', 'Pullover', 'Dress', 'Coat', 'Sandal', 'Shirt', 'Sneaker', 'Bag', 'Ankle boot']
#Funcion de normalizacion para los datos (Pasar de 0-255 a 0-1) #Hace que la red aprenda mejor y mas rapido def normalizar(imagenes, etiquetas): imagenes = tf.cast(imagenes, tf.float32) imagenes /= 255 #Aqui lo pasa de 0-255 a 0-1 return imagenes, etiquetas
#Normalizar los datos de entrenamiento y pruebas con la funcion que hicimos datos_entrenamiento = datos_entrenamiento.map(normalizar) datos_pruebas = datos_pruebas.map(normalizar)
#Agregar a cache (usar memoria en lugar de disco, entrenamiento mas rapido) datos_entrenamiento = datos_entrenamiento.cache() datos_pruebas = datos_pruebas.cache()
#Mostrar una imagen de los datos de pruebas, de momento mostremos la primera for imagen, etiqueta in datos_entrenamiento.take(1): break imagen = imagen.numpy().reshape((28,28)) #Redimensionar, cosas de tensores, lo veremos despues
import matplotlib.pyplot as plt
#Dibujar dibujar plt.figure() plt.imshow(imagen, cmap=plt.cm.binary) plt.colorbar() plt.grid(False) plt.show()
#Dibujar mas plt.figure(figsize=(10,10)) for i, (imagen, etiqueta) in enumerate(datos_entrenamiento.take(25)): imagen = imagen.numpy().reshape((28,28)) plt.subplot(5,5,i+1) plt.xticks([]) plt.yticks([]) plt.grid(False) plt.imshow(imagen, cmap=plt.cm.binary) plt.xlabel(nombres_clases[etiqueta]) plt.show()
#Crear el modelo modelo = tf.keras.Sequential([ tf.keras.layers.Flatten(input_shape=(28,28,1)), #1 - blanco y negro tf.keras.layers.Dense(50, activation=tf.nn.relu), tf.keras.layers.Dense(50, activation=tf.nn.relu), tf.keras.layers.Dense(10, activation=tf.nn.softmax) #Para redes de clasificacion ])
#Compilar el modelo modelo.compile( optimizer='adam', loss=tf.keras.losses.SparseCategoricalCrossentropy(), metrics=['accuracy'] )
#Los numeros de datos en entrenamiento y pruebas (60k y 10k) num_ej_entrenamiento = metadatos.splits["train"].num_examples num_ej_pruebas = metadatos.splits["test"].num_examples
print(num_ej_entrenamiento) print(num_ej_pruebas)
60000 10000
#El trabajo por lotes permite que entrenamientos con gran cantidad de datos se haga de manera mas eficiente TAMANO_LOTE = 32
#Shuffle y repeat hacen que los datos esten mezclados de manera aleatoria para que la red #no se vaya a aprender el orden de las cosas datos_entrenamiento = datos_entrenamiento.repeat().shuffle(num_ej_entrenamiento).batch(TAMANO_LOTE) datos_pruebas = datos_pruebas.batch(TAMANO_LOTE)
import math
#Entrenar historial = modelo.fit(datos_entrenamiento, epochs=5, steps_per_epoch= math.ceil(num_ej_entrenamiento/TAMANO_LOTE))
#Ver la funcion de perdida plt.xlabel("# Epoca") plt.ylabel("Magnitud de pérdida") plt.plot(historial.history["loss"])
[<matplotlib.lines.Line2D at 0x7f037024aad0>]
#Pintar una cuadricula con varias predicciones, y marcar si fue correcta (azul) o incorrecta (roja) import numpy as np
for imagenes_prueba, etiquetas_prueba in datos_pruebas.take(1): imagenes_prueba = imagenes_prueba.numpy() etiquetas_prueba = etiquetas_prueba.numpy() predicciones = modelo.predict(imagenes_prueba)
def graficar_imagen(i, arr_predicciones, etiquetas_reales, imagenes): arr_predicciones, etiqueta_real, img = arr_predicciones[i], etiquetas_reales[i], imagenes[i] plt.grid(False) plt.xticks([]) plt.yticks([])
plt.imshow(img[...,0], cmap=plt.cm.binary)
etiqueta_prediccion = np.argmax(arr_predicciones) if etiqueta_prediccion == etiqueta_real: color = 'blue' else: color = 'red'
plt.xlabel("{} {:2.0f}% ({})".format(nombres_clases[etiqueta_prediccion], 100*np.max(arr_predicciones), nombres_clases[etiqueta_real]), color=color)
def graficar_valor_arreglo(i, arr_predicciones, etiqueta_real): arr_predicciones, etiqueta_real = arr_predicciones[i], etiqueta_real[i] plt.grid(False) plt.xticks([]) plt.yticks([]) grafica = plt.bar(range(10), arr_predicciones, color="#777777") plt.ylim([0, 1]) etiqueta_prediccion = np.argmax(arr_predicciones)
grafica[etiqueta_prediccion].set_color('red') grafica[etiqueta_real].set_color('blue')
filas = 5 columnas = 5 num_imagenes = filascolumnas plt.figure(figsize=(22columnas, 2filas)) for i in range(num_imagenes): plt.subplot(filas, 2columnas, 2i+1) graficar_imagen(i, predicciones, etiquetas_prueba, imagenes_prueba) plt.subplot(filas, 2columnas, 2i+2) graficar_valor_arreglo(i, predicciones, etiquetas_prueba)
#Probar una imagen suelta imagen = imagenes_prueba[4] #AL ser la variable imagenes_prueba solo tiene lo que se le puso en el bloque anterior heheh imagen = np.array([imagen]) prediccion = modelo.predict(imagen)
print("Prediccion: " + nombres_clases[np.argmax(prediccion[0])])
Prediccion: Sandal
#Exportacion del modelo a h5 modelo.save('modelo_exportado.h5')
#Instalar tensorflowjs para convertir el h5 a un modelo que pueda cargar tensorflowjs en un explorador !pip install tensorflowjs
#Convertir el archivo h5 a formato de tensorflowjs !mkdir tfjs_target_dir !tensorflowjs_converter --input_format keras modelo_exportado.h5 tfjs_target_dir
2021-07-17 02:57:45.147570: I tensorflow/stream_executor/platform/default/dso_loader.cc:53] Successfully opened dynamic library libcudart.so.11.0
#Veamos si si creo la carpeta !ls
modelo_exportado.h5 sample_data tfjs_target_dir
#Veamos el contenido de la carpeta !ls tfjs_target_dir
group1-shard1of1.bin model.json