Entrenamiento de Red Neuronal Convolucional (CNN) en TensorFlow

En este artículo, implementaremos y entrenaremos una red neuronal convolucional CNN utilizando TensorFlow, una biblioteca de aprendizaje automático masivo.

Ahora, en este artículo, vamos a trabajar en un conjunto de datos llamado ‘rock_paper_sissors’ en el que simplemente debemos clasificar los signos de las manos como piedra, papel o tijera. 

Implementación paso a paso

Paso 1: Importación de las bibliotecas

Vamos a comenzar con la importación de algunas bibliotecas importantes. Son TensorFlow, NumPy, Matplotlib y, finalmente, de TensorFlow, necesitamos conjuntos de datos de TensorFlow y Keras.

Python

pip install -q tensorflow tensorflow-datasets
 
# Importing the packages
import matplotlib.pyplot as plt
import numpy as np
 
import tensorflow as tf
import tensorflow_datasets as tfds
 
from tensorflow import keras

Paso 2: Cargar el conjunto de datos

Antes de elegir el conjunto de datos, no dude en explorar todos los conjuntos de datos disponibles en TensorFlow

Python

tfds.list_builders()

Producción:

['abstract_reasoning',
 'accentdb',
 'aeslc',
 'aflw2k3d',
 'ag_news_subset',
 'ai2_arc',
 'ai2_arc_with_ir',
 'amazon_us_reviews',
 'anli',
 'arc',
 'bair_robot_pushing_small',
 'bccd',
 'beans',
 'big_patent',
 ....
 ..
 .

Antes de cargar el conjunto de datos, veremos información sobre nuestro conjunto de datos para que nos resulte fácil trabajar con los datos y recopilar información muy importante.

Python

# Getting info about the dataset
Dataset = tfds.builder('rock_paper_scissors')
info = Dataset.info
 
print(info)

Producción: 

tfds.core.DatasetInfo(
    name='rock_paper_scissors',
    full_name='rock_paper_scissors/3.0.0',
    description="""
    Images of hands playing rock, paper, scissor game.
    """,
    homepage='http://laurencemoroney.com/rock-paper-scissors-dataset',
    data_path='C:\\Users\\ksaty\\tensorflow_datasets\\rock_paper_scissors\\3.0.0',
    download_size=Unknown size,
    dataset_size=Unknown size,
    features=FeaturesDict({
        'image': Image(shape=(300, 300, 3), dtype=tf.uint8),
        'label': ClassLabel(shape=(), dtype=tf.int64, num_classes=3),
    }),
    supervised_keys=('image', 'label'),
    disable_shuffling=False,
    splits={
    },
    citation="""@ONLINE {rps,
    author = "Laurence Moroney",
    title = "Rock, Paper, Scissors Dataset",
    month = "feb",
    year = "2019",
    url = "http://laurencemoroney.com/rock-paper-scissors-dataset"
    }""",
)

Finalmente cargando el conjunto de datos,

Python

# Loading the dataset
ds_train = tfds.load(name="rock_paper_scissors", split="train")
ds_test = tfds.load(name="rock_paper_scissors", split="test")

Producción:

Descargando y preparando el conjunto de datos Tamaño desconocido (descargar: Tamaño desconocido, generado: Tamaño desconocido, total: Tamaño desconocido) a C:\Users\ksaty\tensorflow_datasets\rock_paper_scissors\3.0.0…

Dl Completado…: 100%

2/2 [00:50<00:00, 25.01s/url]

Tamaño Dl…: 100%

219/219 [00:50<00:00, 4,38 MB/s]

Conjunto de datos rock_paper_scissors descargado y preparado en C:\Users\ksaty\tensorflow_datasets\rock_paper_scissors\3.0.0. Las llamadas posteriores reutilizarán estos datos.

Algunos de los ejemplos 

Paso 3: Análisis y preprocesamiento de las imágenes

Primero, para mantenerlo limpio, iteramos sobre los datos y los almacenamos como una array NumPy y cancelamos las dimensiones de la imagen y la almacenamos como train_images, y probamos las imágenes con etiquetas.

Python

# Iterating over the images and storing
# it in train and test datas
train_images = np.array([image['image'].numpy()[:, :, 0]
                         for image in ds_train])
train_labels = np.array([image['label']
                         .numpy() for image in ds_train])
 
test_images = np.array([image['image'].numpy()[:, :, 0] for image in ds_test])
test_labels = np.array([image['label'].numpy() for image in ds_test])

y luego, ahora vamos a remodelar las imágenes y luego convertir el tipo de datos a float32 desde uint8, y luego vamos a bajar todos los valores de 0 a 1 para que sea más fácil para el modelo aprender de él.

Python

# Reshaping the images
train_images = train_images.reshape(2520, 300, 300, 1)
test_images = test_images.reshape(372, 300, 300, 1)
 
# Changing the datatype
train_images = train_images.astype('float32')
test_images = test_images.astype('float32')
 
# getting the values down to 0 and 1
train_images /= 255
test_images /= 255

Paso 4: Una red neuronal convolucional básica

Ahora vamos a crear una CNN básica con solo 2 capas convolucionales con una función de activación relu y 64 y 32 kernels y un tamaño de kernel de 3 y aplanar la imagen a una array 1D y las capas convolucionales están directamente conectadas a la capa de salida.

Y para compilar usamos el optimizador Adam y para la pérdida usamos SparseCategoricalCrossentropy() y para las métricas, usamos la precisión y vamos a ajustar los datos.

Python

# A convolutional neural network
 
# Defining the model
model = keras.Sequential([
    keras.layers.Conv2D(64, 3, activation='relu',
                        input_shape=(300, 300, 1)),
    keras.layers.Conv2D(32, 3, activation='relu'),
    keras.layers.Flatten(),
    keras.layers.Dense(3, activation='softmax')
])
 
# Compiling the model
model.compile(optimizer='adam',
              loss=keras.losses.SparseCategoricalCrossentropy(),
              metrics=['accuracy'])
 
# Fitting the model with data
model.fit(train_images, train_labels, epochs=5,
          batch_size=32)

Producción:

Y para evaluar el modelo.

Python

model.evaluate(test_images, test_labels)

Como puede ver, hay una precisión muy baja en los datos no vistos, esto se llama sobreajuste del modelo, lo que significa que el modelo está sobreajustado por los datos de entrenamiento, por lo que no puede manejar los datos no vistos. Para resolver esto, podemos modificar el modelo un poco.

Mejor red neuronal convolucional

Podemos mejorar este modelo agregando:

  • Nodes de abandono
  • puesta en común
  • Capas densas totalmente conectadas

Python

# A better convolutional neural network
 
# Model defining
model = keras.Sequential([
    keras.layers.AveragePooling2D(6, 3,
                                  input_shape=(300, 300, 1)),
    keras.layers.Conv2D(64, 3, activation='relu'),
    keras.layers.Conv2D(32, 3, activation='relu'),
    keras.layers.MaxPool2D(2, 2),
    keras.layers.Dropout(0.5),
    keras.layers.Flatten(),
    keras.layers.Dense(128, activation='relu'),
    keras.layers.Dense(3, activation='softmax')
])
 
# Compiling a model
model.compile(optimizer='adam',
              loss=keras.losses.SparseCategoricalCrossentropy(),
              metrics=['accuracy'])
 
# Fitting the model
model.fit(train_images, train_labels, epochs=5,
          batch_size=32)

Ahora si evaluamos nuestro modelo, como pueden ver el modelo ha mejorado mucho.

Estos son los pasos para entrenar una red neuronal convolucional.

Nota: Todavía puede hacer algunos ajustes y giros al modelo para aumentar la precisión. TI es un proceso de aprendizaje continuo.

Publicación traducida automáticamente

Artículo escrito por sanjaysdev0901 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *