Este artículo fue publicado como parte del Blogatón de ciencia de datos
Los diversos métodos de aprendizaje profundo utilizan datos para entrenar algoritmos de redes neuronales para realizar una variedad de tareas de aprendizaje automático, como la clasificación de diferentes clases de objetos. Las redes neuronales convolucionales son algoritmos de aprendizaje profundo muy poderosos para el análisis de imágenes. Este artículo le explicará cómo construir, entrenar y evaluar redes neuronales convolucionales.
También aprenderá cómo mejorar su capacidad para aprender de los datos y cómo interpretar los resultados de la capacitación. El Deep Learning tiene varias aplicaciones como procesamiento de imágenes, procesamiento de lenguaje natural, etc. También se usa en Ciencias Médicas, Medios y Entretenimiento, Autos Autónomos, etc.
¿Qué es CNN?
CNN es un poderoso algoritmo para el procesamiento de imágenes. Estos algoritmos son actualmente los mejores algoritmos que tenemos para el procesamiento automatizado de imágenes. Muchas empresas utilizan estos algoritmos para hacer cosas como identificar los objetos en una imagen.
Las imágenes contienen datos de combinación RGB. Matplotlib se puede utilizar para importar una imagen a la memoria desde un archivo. La computadora no ve una imagen, todo lo que ve es una matriz de números. Las imágenes en color se almacenan en matrices tridimensionales. Las dos primeras dimensiones corresponden a la altura y el ancho de la imagen (el número de píxeles). La última dimensión corresponde a los colores rojo, verde y azul presentes en cada píxel.
Tres capas de CNN
Redes neuronales convolucionales especializadas para aplicaciones en reconocimiento de imagen y video. CNN se utiliza principalmente en tareas de análisis de imágenes como reconocimiento de imágenes, detección de objetos y segmentación.
Hay tres tipos de capas en las redes neuronales convolucionales:
1) Capa convolucional: en una red neuronal típica, cada neurona de entrada está conectada a la siguiente capa oculta. En CNN, solo una pequeña región de las neuronas de la capa de entrada se conecta a la capa oculta de neuronas.
2) Capa de agrupación: la capa de agrupación se utiliza para reducir la dimensionalidad del mapa de características. Habrá múltiples capas de activación y agrupación dentro de la capa oculta de la CNN.
3) Capa completamente conectada: Capas completamente conectadas formar los últimos capas en la red. La entrada al capa completamente conectada es la salida de la agrupación o convolución final Capa, que se aplana y luego se introduce en el capa completamente conectada.
Conjunto de datos MNIST
En este artículo, trabajaremos en el reconocimiento de objetos en datos de imágenes utilizando el conjunto de datos MNIST para el reconocimiento de dígitos escritos a mano.
El conjunto de datos MNIST consta de imágenes de dígitos de una variedad de documentos escaneados. Cada imagen es un cuadrado de 28 x 28 píxeles. En este conjunto de datos, se utilizan 60.000 imágenes para entrenar el modelo y 10.000 imágenes para probar el modelo. Hay 10 dígitos (0 a 9) o 10 clases para predecir.
Cargando el conjunto de datos MNIST
Instale la biblioteca de TensorFlow e importe el conjunto de datos como un conjunto de datos de entrenamiento y prueba.
Trazar la salida de muestra de la imagen
!pip install tensorflow from keras.datasets import mnist import matplotlib.pyplot as plt (X_train,y_train), (X_test, y_test)= mnist.load_data() plt.subplot() plt.imshow(X_train[9], cmap=plt.get_cmap('gray'))
Producción:
Modelo de aprendizaje profundo con perceptrones multicapa utilizando MNIST
En este modelo, crearemos un modelo de red neuronal simple con una sola capa oculta para el conjunto de datos MNIST para el reconocimiento de dígitos escritos a mano.
Un perceptrón es un modelo de neurona única que es el componente básico de las redes neuronales más grandes. El perceptrón multicapa consta de tres capas, es decir, la capa de entrada, la capa oculta y la capa de salida. La capa oculta no es visible para el mundo exterior. Solo la capa de entrada y la capa de salida son visibles. Para todos los modelos DL, los datos deben ser de naturaleza numérica.
Paso 1: importar bibliotecas de claves
import numpy as np from keras.models import Sequential from keras.layers import Dense from keras.utils import np_utils
Paso 2: remodelar los datos
Cada imagen tiene un tamaño de 28X28, por lo que hay 784 píxeles. Entonces, la capa de salida tiene 10 salidas, la capa oculta tiene 784 neuronas y la capa de entrada tiene 784 entradas. Luego, el conjunto de datos se convierte en un tipo de datos flotante.
number_pix=X_train.shape[1]*X_train.shape[2] X_train=X_train.reshape(X_train.shape[0], number_pix).astype('float32') X_test=X_test.reshape(X_test.shape[0], number_pix).astype('float32')
Paso 3: normaliza los datos
Los modelos NN generalmente requieren datos escalados. En este fragmento de código, los datos se normalizan de (0-255) a (0-1) y la variable de destino se codifica en un solo uso para su posterior análisis. La variable de destino tiene un total de 10 clases (0-9)
X_train=X_train/255 X_test=X_test/255 y_train= np_utils.to_categorical(y_train) y_test= np_utils.to_categorical(y_test) num_classes=y_train.shape[1] print(num_classes)
Producción:
10
Ahora, crearemos una función NN_model y compilaremos la misma
Paso 4: definir la función del modelo
def nn_model(): model=Sequential() model.add(Dense(number_pix, input_dim=number_pix, activation='relu')) mode.add(Dense(num_classes, activation='softmax')) model.compile(loss="categorical_crossentropy", optimiser="Adam", metrics=['accuracy']) return model
Hay dos capas, una es una capa oculta con la función de activación ReLu y la otra es la capa de salida que usa la función softmax.
Paso 5: ejecutar el modelo
model=nn_model() model.fit(X_train, y_train, validation_data=(X_test,y_test),epochs=10, batch_size=200, verbose=2) score= model.evaluate(X_test, y_test, verbose=0) print('The error is: %.2f%%'%(100-score[1]*100))
Producción:
Epoch 1/10 300/300 - 11s - loss: 0.2778 - accuracy: 0.9216 - val_loss: 0.1397 - val_accuracy: 0.9604 Epoch 2/10 300/300 - 2s - loss: 0.1121 - accuracy: 0.9675 - val_loss: 0.0977 - val_accuracy: 0.9692 Epoch 3/10 300/300 - 2s - loss: 0.0726 - accuracy: 0.9790 - val_loss: 0.0750 - val_accuracy: 0.9778 Epoch 4/10 300/300 - 2s - loss: 0.0513 - accuracy: 0.9851 - val_loss: 0.0656 - val_accuracy: 0.9796 Epoch 5/10 300/300 - 2s - loss: 0.0376 - accuracy: 0.9892 - val_loss: 0.0717 - val_accuracy: 0.9773 Epoch 6/10 300/300 - 2s - loss: 0.0269 - accuracy: 0.9928 - val_loss: 0.0637 - val_accuracy: 0.9797 Epoch 7/10 300/300 - 2s - loss: 0.0208 - accuracy: 0.9948 - val_loss: 0.0600 - val_accuracy: 0.9824 Epoch 8/10 300/300 - 2s - loss: 0.0153 - accuracy: 0.9962 - val_loss: 0.0581 - val_accuracy: 0.9815 Epoch 9/10 300/300 - 2s - loss: 0.0111 - accuracy: 0.9976 - val_loss: 0.0631 - val_accuracy: 0.9807 Epoch 10/10 300/300 - 2s - loss: 0.0082 - accuracy: 0.9985 - val_loss: 0.0609 - val_accuracy: 0.9828 The error is: 1.72%
En los resultados del modelo, es visible a medida que aumenta el número de épocas, mejora la precisión. El error es del 1,72%, menor es el error, mayor es la precisión del modelo.
Modelo de red neuronal convolucional usando MNIST
En esta sección, crearemos modelos CNN simples para MNIST que demuestran capas convolucionales, capas de agrupación y capas de abandono.
Paso 1: importar todas las bibliotecas necesarias
import numpy as np from keras.models import Sequential from keras.layers import Dense from keras.utils import np_utils from keras.layers import Dropout from keras.layers import Flatten from keras.layers.convolutional import Conv2D from keras.layers.convolutional import MaxPooling2D
Paso 2: Configure la semilla para la reproducibilidad y cargue los datos MNIST data
seed=10 np.random.seed(seed) (X_train,y_train), (X_test, y_test)= mnist.load_data()
Paso 3: convierta los datos en valores flotantes
X_train=X_train.reshape(X_train.shape[0], 1,28,28).astype('float32') X_test=X_test.reshape(X_test.shape[0], 1,28,28).astype('float32')
Paso 4: normaliza los datos
X_train=X_train/255 X_test=X_test/255 y_train= np_utils.to_categorical(y_train) y_test= np_utils.to_categorical(y_test) num_classes=y_train.shape[1] print(num_classes)
Una arquitectura clásica de CNN se ve como se muestra a continuación:
Capa de salida (10 salidas) |
Capa oculta (128 neuronas) |
Capa plana |
Capa de abandono 20% |
Capa de agrupación máxima 2 × 2 |
Capa convolucional 32 mapas, 5 × 5 |
Capa visible 1x28x28 |
La primera capa oculta es una capa convolucional llamada Convolution2D. Dispone de 32 mapas de características con tamaño 5 × 5 y función rectificadora. Esta es la capa de entrada. La siguiente es la capa de agrupación que toma el valor máximo llamada MaxPooling2D. En este modelo, se configura como un tamaño de piscina de 2 × 2.
En la capa de abandono ocurre la regularización. Está configurado para excluir aleatoriamente el 20% de las neuronas de la capa para evitar el sobreajuste. La quinta capa es la capa aplanada que convierte los datos de la matriz 2D en un vector llamado Aplanar. Permite que la salida sea procesada completamente por una capa estándar completamente conectada.
A continuación, se utiliza la capa completamente conectada con 128 neuronas y la función de activación del rectificador. Finalmente, la capa de salida tiene 10 neuronas para las 10 clases y una función de activación softmax para generar predicciones similares a la probabilidad para cada clase.
Paso 5: ejecutar el modelo
def cnn_model(): model=Sequential() model.add(Conv2D(32,5,5, padding='same',input_shape=(1,28,28), activation='relu')) model.add(MaxPooling2D(pool_size=(2,2), padding='same')) model.add(Dropout(0.2)) model.add(Flatten()) model.add(Dense(128, activation='relu')) model.add(Dense(num_classes, activation='softmax')) model.compile(loss="categorical_crossentropy", optimizer="adam", metrics=['accuracy']) return model
model=cnn_model() model.fit(X_train, y_train, validation_data=(X_test,y_test),epochs=10, batch_size=200, verbose=2) score= model.evaluate(X_test, y_test, verbose=0) print('The error is: %.2f%%'%(100-score[1]*100))
Producción:
Epoch 1/10 300/300 - 2s - loss: 0.7825 - accuracy: 0.7637 - val_loss: 0.3071 - val_accuracy: 0.9069 Epoch 2/10 300/300 - 1s - loss: 0.3505 - accuracy: 0.8908 - val_loss: 0.2192 - val_accuracy: 0.9336 Epoch 3/10 300/300 - 1s - loss: 0.2768 - accuracy: 0.9126 - val_loss: 0.1771 - val_accuracy: 0.9426 Epoch 4/10 300/300 - 1s - loss: 0.2392 - accuracy: 0.9251 - val_loss: 0.1508 - val_accuracy: 0.9537 Epoch 5/10 300/300 - 1s - loss: 0.2164 - accuracy: 0.9325 - val_loss: 0.1423 - val_accuracy: 0.9546 Epoch 6/10 300/300 - 1s - loss: 0.1997 - accuracy: 0.9380 - val_loss: 0.1279 - val_accuracy: 0.9607 Epoch 7/10 300/300 - 1s - loss: 0.1856 - accuracy: 0.9415 - val_loss: 0.1179 - val_accuracy: 0.9632 Epoch 8/10 300/300 - 1s - loss: 0.1777 - accuracy: 0.9433 - val_loss: 0.1119 - val_accuracy: 0.9642 Epoch 9/10 300/300 - 1s - loss: 0.1689 - accuracy: 0.9469 - val_loss: 0.1093 - val_accuracy: 0.9667 Epoch 10/10 300/300 - 1s - loss: 0.1605 - accuracy: 0.9493 - val_loss: 0.1053 - val_accuracy: 0.9659 The error is: 3.41%
En los resultados del modelo, es visible a medida que aumenta el número de épocas, mejora la precisión. El error es 3.41%, menor error mayor precisión del modelo.
Espero que haya disfrutado de la lectura y no dude en usar mi código para probarlo para sus propósitos. Además, si hay algún comentario sobre el código o solo la publicación del blog, no dude en comunicarse conmigo en [email protected]
Los medios que se muestran en este artículo sobre el procesamiento de imágenes mediante CNN no son propiedad de DataPeaker y se utilizan a discreción del autor.