Cómo utilizar TensorFlow 2.0 con Python

1

Redes neuronales con TensorFlow

2

Introducción a TensorFlow 2.0

Manejo y preprocesamiento de datos para redes neuronales

3

Uso de data pipelines

4

Cómo cargar bases de datos JSON

5

Cargar bases de datos CSV y BASE 64

6

Preprocesamiento y limpieza de datos

7

Keras datasets

8

Datasets generators

9

Aprende a buscar bases de datos para deep learning

10

Cómo distribuir los datos

11

Crear la red neural, definir capas, compilar, entrenar, evaluar y predicciones

Optimización de precisión de modelos

12

Métodos de regularización: overfitting y underfitting

13

Recomendaciones prácticas para ajustar un modelo

14

Métricas para medir la eficiencia de un modelo: callback

15

Monitoreo del entrenamiento en tiempo real: early stopping y patience

16

KerasTuner: construyendo el modelo

17

KerasTuner: buscando la mejor configuración para tu modelo

Almacenamiento y carga de modelos

18

Almacenamiento y carga de modelos: pesos y arquitectura

19

Criterios para almacenar los modelos

Fundamentos de aprendizaje por transferencia

20

Introducción al aprendizaje por transferencia

21

Cuándo utilizar aprendizaje por transferencia

22

Carga de sistemas pre-entrenados en Keras

23

API funcional de Keras

24

Uso sistemas pre-entrenados de TensorFlow Hub

Resultados de entrenamiento

25

Introducción a variables relevantes del TensorBoard

26

Análisis y publicación de resultados del entrenamiento

27

Introducción al despliegue de modelos en producción

28

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

Convierte tus certificados en títulos universitarios en USA

Antes: $249

Currency
$209

Paga en 4 cuotas sin intereses

Paga en 4 cuotas sin intereses
Suscríbete

Termina en:

19 Días
8 Hrs
45 Min
34 Seg

Cómo cargar bases de datos JSON

4/28
Recursos

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.

Cómo descargar bases de datos desde la web

Para esta ocasión usaremos la librería os y zipfile para la manipulación y procesamiento del dataset.

{code-block} python 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.

{code-block} bash !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.

{code-block} python 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).

{code-block} json {"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"}

Cómo hacer la deserialización de los datos

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.

{code-block} python 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.

{code-block} python 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.

```{code-block} python 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.

{code-block} python 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.

python 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.

{code-block} python plt.imshow(images[0][0].reshape(28,28)) print(images[0][1])

Representación de letra en lenguaje de señas

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 14

Preguntas 6

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad?

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. Se debe guardar la ubicación el fichero en una variable
  2. Se debe deserializar el archivo JSON (convertir los objetos a cadenas de texto)
    2.1. Debemos abrir el archivo y leer cada linea agregandola como elemento a un array
  3. Recorrer cada imágen y su label en el JSON y hacer una petición GET a la imágen
    3.1. Guardar la imágen y el label en cada indice de un array
  4. Ver la imágen
# 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.

no logre desacragar la base de datos, paredec un problema del servidor donde esta alojado
Para los que estan usando windows y le sale error `pip install wget` `!python -m wget `[`https://storage.googleapis.com/platzi-tf2/databasesLoadData.zip`](https://storage.googleapis.com/platzi-tf2/databasesLoadData.zip)` `

Asegúrate de que tu archivo JSON esté bien formado y no tenga errores.
Ten en cuenta la estructura de tu archivo JSON al elegir el método de carga.
Si necesitas modificar los datos de tu base de datos JSON, puedes hacerlo

🙈🙈

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’]])