Alberto Beiz

Mis pruebas y experimentos.

Contacta sin miedo:

Clasificando Fashion MNIST con una Red Neuronal Convolucional en Keras

Vamos a probar a ver que tal se comportan las convoluciones. Las capas convolucionales funcionan muy bien cuando los datos siguen una estructura, como es el caso de las imágenes.

import keras
import utils
import math
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.gridspec import GridSpec

from keras.models import Sequential
from keras.layers import Dense, Dropout, Flatten, Convolution2D, MaxPooling2D
from keras.optimizers import adam
# Cargamos el dataset
(x_train, y_train), (x_test, y_test) = utils.load_f_mnist_as_images()
# 60.000 imágenes de 28x28 y 1 canal de color
x_train.shape
(60000, 28, 28, 1)
# Trabajamos de 128 en 128 imágenes
batch_size = 128
# Pasamos 20 veces por todo el dataset
epochs = 20

# Iniciamos el modelo
model = Sequential()

# Una capa convolucional básica consta de la convolución
# una activación y una capa de pooling
# añadimos dropout para mejorar el entrenamiento
model.add(Convolution2D(32, (3, 3), activation='relu', input_shape=(28,28,1)))
model.add(MaxPooling2D(pool_size=(2,2)))
model.add(Dropout(0.3))

# Segunda capa con más filtros
model.add(Convolution2D(64, (3, 3), activation='relu'))
model.add(MaxPooling2D(pool_size=(2,2)))
model.add(Dropout(0.3))

# Despues de las convolucionales, vienen las capas densas.
# Son las capas que se encargan de clasificar en base a la
# información extraida por las capas anteriores

# Hay que hacer que la información solo tenga una dimensión
model.add(Flatten())

# Capa clasificadora
model.add(Dense(512, activation='relu'))
model.add(Dropout(0.3))

# Output
model.add(Dense(10, activation='softmax'))

model.compile(loss='categorical_crossentropy',
              optimizer='adam',
              metrics=['accuracy'])
# Entrenamos el modelo
history = model.fit(x_train, y_train,
                    batch_size=batch_size,
                    epochs=epochs,                   
                    validation_data=(x_test, y_test))
Train on 60000 samples, validate on 10000 samples
Epoch 20/20
60000/60000 [==============================] - 6s 105us/step - loss: 0.1733 - acc: 0.9348 - val_loss: 0.2246 - val_acc: 0.9212
# la red con capas densas consiguió 0.8982
score = model.evaluate(x_test, y_test)
print('Test loss:', score[0])
print('Test accuracy:', score[1])
10000/10000 [==============================] - 1s 70us/step
Test loss: 0.2246396294474602
Test accuracy: 0.9212

Conclusión

Hemos comprobado que las redes convolucionales consiguen una mejor precisión al clasificar imágenes. También que son más costosas de entrenar, para entrenar esta red he necesitado una GPU, la red anterior pude entrenarla con la CPU.

Fuentes