El enlace para cargar los datos:
!wget --no-check-certificate https://storage.googleapis.com/platzi-tf2/databasesLoadData.zip \
-O /tmp/databasesLoadData.zip
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
Crea una cuenta o inicia sesión
¡Continúa aprendiendo sin ningún costo! Únete y comienza a potenciar tu carrera
A continuación vamos a cargar una base de datos en formato JSON que estará almacenada en GCP (Google Cloud Platform). Trabajaremos sobre Google Colab. Crea un Notebook, configúralo y prepárate.
Para esta ocasión usaremos la librería os y zipfile para la manipulación y procesamiento del dataset.
import os
import zipfile
Descargaremos el repositorio desde la locación en GCP, usaremos el comando wget para extraer el archivo, agregaremos la opción —no-check-certificate para omitir certificaciones y guardaremos la salida en la carpeta tmp con el nombre databasesLoadData.zip.
!wget --no-check-certificate https://storage.googleapis.com/platzi-tf2/databasesLoadData.zip \
-O /tmp/databasesLoadData.zip
Obtendremos la locación del archivo comprimido y crearemos una referencia en memoria con una instancia zipfile en modo lectura, posteriormente extraeremos el contenido y lo nombraremos de la misma manera sin extensión dado que será un directorio. Finalmente cerramos la instancia y tendremos nuestro dataset inicial listo para manipular.
local_zip = "/tmp/databasesLoadData.zip"
zip_ref = zipfile.ZipFile(local_zip, "r")
zip_ref.extractall("/tmp/databasesLoadData")
zip_ref.close()
Si navegamos en el directorio de archivos, podremos explorar el contenido de nuestra descarga, tendrá 4 carpetas, donde las 2 más importantes serán las de base64 (a trabajar próximamente) y la de formato JSON.
Si nos adentramos al contenido del dataset en formato JSON, encontraremos con objetos con 2 claves diferentes: Content (que contiene el link de la imagen) y label (que expresa la letra a la que se refiere).
{"content": "https://storage.googleapis.com/platzi-tf2/img_mnist/29_B.jpg","label":"b"}
{"content": "https://storage.googleapis.com/platzi-tf2/img_mnist/30_B.jpg","label":"b"}
{"content": "https://storage.googleapis.com/platzi-tf2/img_mnist/95_B.jpg","label":"b"}
{"content": "https://storage.googleapis.com/platzi-tf2/img_mnist/58_A.jpg","label":"a"}
{"content": "https://storage.googleapis.com/platzi-tf2/img_mnist/50_A.jpg","label":"a"}
{"content": "https://storage.googleapis.com/platzi-tf2/img_mnist/46_A.jpg","label":"a"}
{"content": "https://storage.googleapis.com/platzi-tf2/img_mnist/3_C.jpg","label":"c"}
{"content": "https://storage.googleapis.com/platzi-tf2/img_mnist/32_C.jpg","label":"c"}
{"content": "https://storage.googleapis.com/platzi-tf2/img_mnist/2_C.jpg","label":"c"}
Para el procesamiento del dataset haremos uso de varios módulos de Python, donde JSON, codecs, requests y bytesIO nos ayudarán al proceso de peticiones mientras que el resto nos serán útiles a nivel de manipulación y representación.
import json
import codecs
import requests
import numpy as np
from PIL import Image
from io import BytesIO
%matplotlib inline
import matplotlib.pyplot as plt
Determinamos la ubicación del dataset a cargar.
url = "/tmp/databasesLoadData/sign_mnist_json/data.json"
Creamos un array donde guardaremos los JSON, posteriormente abriremos el archivo, lo recorreremos línea a línea y lo guardaremos en formato de diccionario, finalmente, verificamos la cantidad de imágenes encontradas correlacionando el tamaño del array.
data_json = []
with codecs.open(url, "rU", "utf-8") as js:
for line in js:
data_json.append(json.loads(line))
print(f'{len(data_json)} imagenes encontradas')
Si verificamos el contenido nos encontraremos con un diccionario con las claves content y label y su respectivos valores.
data_json[0]
{'content': 'https://storage.googleapis.com/platzi-tf2/img_mnist/29_B.jpg', 'label': 'b'}
Con los datos aislados, podemos descargar cada imagen, por lo que haremos una petición HTTP, la encapsularemos en un objeto BytesIO, será interpretado como una imagen y finalmente se transformará en un array de Numpy.
Guardaremos en la lista de imágenes un array de 2 elementos donde el primero será la representación matricial de la imagen y el segundo la etiqueta.
images = []
for data in data_json:
response = requests.get(data["content"])
img = np.asarray(Image.open(BytesIO(response.content)))
images.append([img, data["label"]])
Para verificar la integridad del contenido lo mostraremos en pantalla con matplotlib, donde tomaremos la imagen y la redimensionaremos al tamaño esperado (de ser requerido), paralelamente tomaremos la etiqueta y las obtendremos ambas en pantalla.
plt.imshow(images[0][0].reshape(28,28))
print(images[0][1])
Con esto hemos completado el proceso, desde la mera descarga del archivo a su deserialización y manipulación interna en el scope de Python.
Contribución creada por Sebastián Franco Gómez.
Aportes 11
Preguntas 6
El enlace para cargar los datos:
!wget --no-check-certificate https://storage.googleapis.com/platzi-tf2/databasesLoadData.zip \
-O /tmp/databasesLoadData.zip
Me pareció importante entender esta parte en cada línea.
Muy enganchado con el curso. Ya tuve algunas clases con Adonai en otros programas de aprendizaje, avanza a buen ritmo sin pasar por alto lo importante.
images = []
# leemos el valor de content y el label de cada línea de la lista que creamos
for data in data_json:
# creamos una petición accediendo con request para poder ver el contenido de ellas de GCP
response = requests.get(data['content'])
# convertimos las imagenes en array
# abrimos la imagen con PIL
# convertimos la imagen en un BytesIO ya que está decodificada
img = np.asarray(Image.open(BytesIO(response.content)))
# guardamos la imagen en BytesIO y el labol en la lista images
images.append([img, data['label']])
¿QUÉ VIMOS EN ÉSTA CLASE?
Descargar la base de datos comprimirda y descomprimirla luego para cargarla a Google Cloud Platform (GCP) y poder acceder mediante una URL
El primer paso es importar dos librerías de python
import os # para trabajar con sistemas operativos
import zipfile # para manipular comprimidos
Después en la terminal de tu sistema operativo ejecuta !wget --no-check-certification o curl -k que nos permite poder descargar sin ningún requerimiento ni errores de SSL
# PARA LINUX
!wget --no-check-certificate https://storage.googleapis.com/platzi-tf2/databasesLoadData.zip -O /tmp/databasesLoadData.zip
# PARA WINDOWS
curl -k -o /c/Users/admin/Downloads/databasesLoadData.zip https://storage.googleapis.com/platzi-tf2/databasesLoadData.zip
# Esto es para descargar la base de datos del proyecto en un .zip
Luego de de descargarla podemos acceder a ella con python y descomprimirla si estás trabajando en Google Colab, si en cambio estás en tu local puedes omitir este paso:
zip_path = "/tmp/databasesLoadData.zip" # "C:/Users/admin/Downloads" for windows
zip_ref = zipfile.ZipFile(zip_path, "r") # ZipFile() metodo para ABRIR una instancia del fichero
zip_ref.extractall("/tmp/databasesLoadData.zip") # acceder al método extraerall los archivos y descomprimir
zip_ref.close() # CERRAR la instancia del fichero
Ahora hay que leer la bases de datos:
Leer la base de datos en JSON
# 1
import json
import codecs
import requests
import numpy as np
from PIL import Image
from io import BytesIO
import matplotlib.pyplot as plt
url = "/tmp/databasesLoadData/sign_mnist_json/data.json"
# 2
data_json=[]
with codecs.open(url, 'rU', 'utf8') as js:
# 2.1
for line in js:
data_json.append(json.loads(line)) #deserializamos al añadir
print("{} imágenes encontradas".format(len(data_json)))
# 3
images = []
for data in data_json:
response = requests.get(data["content"]) #secuencia de bytes
response = BytesIO(response.content) # decodifica a hexadecimal
img = np.asarray(Image.open(response)) #convierte a array
images.append([img, data["label"]])
plt.imshow(images[0][0])
# 4
print(images[0][1])
Según la documentación el modo U (Universal Newlines) está en desuso.
Ósea que es mejor utilizar solo “r”
No esta mas la DB HTTP request sent, awaiting response… 403 Forbidden
zip_ref = zipfile.ZipFile(local_zip, ‘r’)
el codigo muestra error en esta linea
BadZipFile: File is not a zip file
Las imágenes en el dataset ya están 28x28 por lo que el reshape es redundante
Tuve una duda sobre por qué usar codecs a la hora de abrir el json.
import codecs
with codecs.open(url, "rU", "utf-8") as js:
pass
En pocas palabras, el módulo codecs se implementó en los tiempos de Python 2 donde el modulo io.open seguía siendo relativamente primitivo y no soportaba algunos tipos de encoding, por lo que esta era una solución, sin embargo, cuando se actualizó a Python 3, el módulo io.open ya soportaba todas las características de codecs al punto que se busca activamente deprecarlo.
Lo anterior implica que usar open() y codecs.open() es virtualmente lo mismo, por lo que, a no ser que nuestro código deba ser retrocompatible, lo mejor es usar open (que es un atajo al módulo io.open).
Este código
data_json = []
with codecs.open(url, "rU", "utf-8") as js:
for line in js:
data_json.append(json.loads(line))
print(f'{len(data_json)} imagenes encontradas')
Es lo mismo que este
data_json = []
with open(url, mode = "r", encoding = "utf-8") as js:
for line in js:
data_json.append(json.loads(line))
print(f'{len(data_json)} imagenes encontradas')
Si quieren leer un poco más al respecto, pueden ir a este hilo de StackOverflow donde aprendí un poco sobre encoding y la necesidad de estos módulos.
Me di cuenta que de esta forma igual sirve, sin tener que hacer el reshape()
plt.imshow(images[0][0])
Estoy haciendo el curso en mi ambiente local por lo que si están usando Windows el ambiente virtual lo cree con conda e instalé Tensorflow como indican en su pagina
La información la descargué usando CMD con el siguiente comando
curl -L -o databasesLoadData.zip https://storage.googleapis.com/platzi-tf2/databasesLoadData.zip
Adicionalmente tuve que instalar librerías que no tenía pero la que mas me dio garra fue PIL pues se instala como
conda install -c anaconda pillow
y se llama normal
from PIL import Image
Los que quieran un método mas simple pueden utilizar lo aprendido en el curso de redes convolucionales, este seria el código:
from skimage import io
images = []
for data in data_json:
images.append([io.imread(data[‘content’]), data[‘label’]])
¿Quieres ver más aportes, preguntas y respuestas de la comunidad?
o inicia sesión.