Ejemplo de regresión logística en TensorFlow

| Última modificación: 3 de octubre de 2024 | Tiempo de Lectura: 4 minutos

Algunos de nuestros reconocimientos:

Premios KeepCoding

Llevar a cabo una serie de ejemplos prácticos te ayudará a comprender el desarrollo de los conocimientos teóricos adquiridos y, por ello, en este artículos te mostramos un ejemplo de regresión logística en TensorFlow.

Ejemplo de regresión logística en TensorFlow

Para el ejemplo de regresión logística en TensorFlow, te mostraremos cómo clasificar imágenes de dígitos con una regresión logística.

Vamos a utilizar el conocido dataset MNIST, que es como el “Hola mundo” de los datasets para este ejemplo de regresión logística en TensorFlow:

# Importamos el dataset que vamos a utilizar: el MNIST
import numpy as np
import matplotlib.pyplot as plt
import tensorflow as tf
from tensorflow.examples.tutorials.mnist import input_data

# Cargamos el dataset codificando las etiquetas con one-hot encoding (convierte 
# cada etiqueta en un vector de longitud = N_CLASES, con todo 0s excepto para 
# el índice que indica la clase a la que pertenece la imagen, que contiene un 1)
# Por ejemplo, si tenemos 10 clases (números del 0 al 9) y la etiqueta 
# pertenece al número 5:
# label = [0 0 0 0 0 1 0 0 0 0]
mnist = input_data.read_data_sets('MNIST_data/', one_hot=True)

# El dataset ya está dividido en train, validation y test. Dentro de cada uno
# de estos subsets podemos acceder a:
# images, labels y num_examples
print("Train examples: {}".format(mnist.train.num_examples))
print("Test examples: {}".format(mnist.test.num_examples))
print("Validation examples: {}".format(mnist.validation.num_examples))

# Las imágenes están guardadas en un tensor 2D: n_imagenes x pixels_imagen_vector
# Las etiquetas están guardadas en un tensor 2D: n_imagenes x n_clases (one-hot)
print("Tamaño imágenes train: {}".format(mnist.train.images.shape))
print("Tamaño etiquetas train: {}".format(mnist.train.labels.shape))

# Veamos el rango de valores de las imágenes
print("Valor min: {}".format(np.min(mnist.train.images)))
print("Valor max: {}".format(np.max(mnist.train.images)))

# Veamos algunas de las imágenes del dataset.
# Para ello, solo necesitamos acceder a un vector de nuestra matrix y 
# redimensionarlo a 28x28
plt.subplot(131)
plt.imshow(np.reshape(mnist.train.images[0, :], (28, 28)), cmap='gray')
plt.subplot(132)
plt.imshow(np.reshape(mnist.train.images[27500, :], (28, 28)), cmap='gray')
plt.subplot(133)
plt.imshow(np.reshape(mnist.train.images[54999, :], (28, 28)), cmap='gray')

WARNING: tensorflow:From :13: read_data_sets (from tensorflow.contrib.learn.python.learn.datasets.mnist) is deprecated and will be removed in a future version.
Instructions for updating:
Please use alternatives such as official/mnist/dataset.py from tensorflow/models.
WARNING: tensorflow:From /tensorflow-1.15.2/python3.7/tensorflow_core/contrib/learn/python/learn/datasets/mnist.py:260: maybe_download (from tensorflow.contrib.learn.python.learn.datasets.base) is deprecated and will be removed in a future version.
Instructions for updating:
Please write your own downloading logic.
WARNING: tensorflow:From /tensorflow-1.15.2/python3.7/tensorflow_core/contrib/learn/python/learn/datasets/base.py:252: _internal_retry..wrap..wrapped_fn (from tensorflow.contrib.learn.python.learn.datasets.base) is deprecated and will be removed in a future version.
Instructions for updating:
Please use urllib or similar directly.
Successfully downloaded train-images-idx3-ubyte.gz 9912422 bytes.
WARNING: tensorflow:From /tensorflow-1.15.2/python3.7/tensorflow_core/contrib/learn/python/learn/datasets/mnist.py:262: extract_images (from tensorflow.contrib.learn.python.learn.datasets.mnist) is deprecated and will be removed in a future version.
Instructions for updating:
Please use tf.data to implement this functionality.
Extracting MNIST_data/train-images-idx3-ubyte.gz
Successfully downloaded train-labels-idx1-ubyte.gz 28881 bytes.
WARNING: tensorflow:From /tensorflow-1.15.2/python3.7/tensorflow_core/contrib/learn/python/learn/datasets/mnist.py:267: extract_labels (from tensorflow.contrib.learn.python.learn.datasets.mnist) is deprecated and will be removed in a future version.
Instructions for updating:
Please use tf.data to implement this functionality.
Extracting MNIST_data/train-labels-idx1-ubyte.gz
WARNING: tensorflow:From /tensorflow-1.15.2/python3.7/tensorflow_core/contrib/learn/python/learn/datasets/mnist.py:110: dense_to_one_hot (from tensorflow.contrib.learn.python.learn.datasets.mnist) is deprecated and will be removed in a future version.
Instructions for updating:
Please use tf.one_hot on tensors.
Successfully downloaded t10k-images-idx3-ubyte.gz 1648877 bytes.
Extracting MNIST_data/t10k-images-idx3-ubyte.gz
Successfully downloaded t10k-labels-idx1-ubyte.gz 4542 bytes.
Extracting MNIST_data/t10k-labels-idx1-ubyte.gz
WARNING: tensorflow:From /tensorflow-1.15.2/python3.7/tensorflow_core/contrib/learn/python/learn/datasets/mnist.py:290: DataSet.init (from tensorflow.contrib.learn.python.learn.datasets.mnist) is deprecated and will be removed in a future version.
Instructions for updating:
Please use alternatives such as official/mnist/dataset.py from tensorflow/models.

Para este ejemplo de Regresión logística en TensorFlow los resultados arrojados son:
Train examples: 55000
Test examples: 10000
Validation examples: 5000
Tamaño imágenes train: (55000, 784)
Tamaño etiquetas train: (55000, 10)
Valor min: 0.0
Valor max: 1.0

# Ya hemos visto un poco en qué consiste el dataset del MNIST. 
# Ahora, vamos a crear nuestro regresor:

# Lo primero es que creemos el placeholder para nuestros datos de entrada. En
# este caso, la entrada va a ser un conjunto de vectores de tamaño 768
# (vamos a pasarle varias imágenes a la vez a nuestro regresor, de esta forma, 
# cuando calcule el gradiente se basará en varias imágenes, con lo que la 
# estimación será más precisa que si utilizase solo una)

n_input = 784  # Número de características de los datos: nº píxeles de la imagen
n_output = 10  # Número de clases: del 0 al 9
net_input = tf.placeholder(tf.float32, [None, n_input])  # Creamos el placeholder

# Ahora tenemos que definir la ecuación de nuestra regresión. En este caso vamos
# a definir nuestra regresión como y = W*x + b
W = tf.Variable(tf.zeros([n_input, n_output]))  # Variable destinada a los pesos
b = tf.Variable(tf.zeros([n_output]))  # Variable destinada a la bias

# Como la salida es multiclase, necesitamos una función que nos devuelva las 
# probabilidades de una imagen de pertenecer a cada de las posibles clases. Lo
# ideal, además, es que estas probabilidades sumasen 1.
# Por ejemplo, si metemos una imagen con un 5, una posible salida sería:
# [0.05 0.05 0.05 0.05 0.05 0.55 0.05 0.05 0.05 0.05]
# cuya suma de probabilidades es 1, y la clase con la mayor probabilidad es 5.

# Aplicamos la función softmax para normalizar las probabilidades de salida
net_output = tf.nn.softmax(tf.matmul(net_input, W) + b)
#net_output = tf.sigmoid(tf.matmul(net_input, W) + b)

En este post, te hemos expuesto un breve ejemplo de regresión logística en TensorFlow. Ahora, te aconsejamos adaptarlo a tu procesamiento.

Por otra parte, puedes contar con nuestro Bootcamp Big Data, con el que recorrerás de forma práctica y teórica todos los módulos de Spark, iniciando camino en su “core” y transitando por Spark SQL, Spark Streaming (Structured), Spark MLlib (Machine learning) y GraphX (información almacenada en estructuras arborescentes). ¡Inscríbete!

Sandra Navarro

Business Intelligence & Big Data Advisor & Coordinadora del Bootcamp en Data Science, Big Data & Machine Learning.

Posts más leídos

¡CONVOCATORIA ABIERTA!

Big Data, IA & Machine Learning

Full Stack Bootcamp

Clases en Directo | Profesores en Activo | Temario 100% actualizado