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

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.

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 鈥攏o-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"}

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.

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

Preguntas 6

Ordenar por:

驴Quieres ver m谩s aportes, preguntas y respuestas de la comunidad?

o inicia sesi贸n.

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. 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 鈥渞鈥

No esta mas la DB HTTP request sent, awaiting response鈥 403 Forbidden

zip_ref = zipfile.ZipFile(local_zip, 鈥榬鈥)

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[鈥榗ontent鈥橾), data[鈥榣abel鈥橾])