Muy buenas!
Llevo algún tiempo dejando de lado el tema de ML, pero quería pediros un poco de ayuda con una duda que para muchos, será básica. Veréis, hasta ahora lo que más me ha faltado en este campo, más que otra cosa, es coger práctica y evaluar modelos. Tanto diseñar la arquitectura como parametrizarla son cosas en las que soy un noob total.
A ver si me podéis ayudar con este ejercicio, entonces. Me bajé un dataset de imágenes de células infectadas con malaria, con 2.5k de imágenes de células infectadas y 1.5k de células no infectadas. El código que vais a ver ahora en Keras trata de construir una red convolucional que actúe como clasificador:
spoiler
# Importing the Keras libraries and packages
from keras.models import Sequential
from keras.layers import Convolution2D
from keras.layers import MaxPooling2D
from keras.layers import Flatten
from keras.layers import Dense
# Initialising the CNN
classifier = Sequential()
# Step 1 - Convolution
classifier.add(Convolution2D(32, 3, 3, input_shape = (64, 64, 3), activation = 'relu'))
# Step 2 - Pooling
classifier.add(MaxPooling2D(pool_size = (2, 2)))
# Adding a second convolutional layer
classifier.add(Convolution2D(32, 3, 3, activation = 'relu'))
classifier.add(MaxPooling2D(pool_size = (2, 2)))
# Step 3 - Flattening
classifier.add(Flatten())
# Step 4 - Full connection
classifier.add(Dense(output_dim = 128, activation = 'relu'))
classifier.add(Dense(output_dim = 1, activation = 'sigmoid'))
# Compiling the CNN
classifier.compile(optimizer = 'adam', loss = 'binary_crossentropy', metrics = ['accuracy'])
# Part 2 - Fitting the CNN to the images
from keras.preprocessing.image import ImageDataGenerator
train_datagen = ImageDataGenerator(rescale = 1./255,
shear_range = 0.2,
zoom_range = 0.2,
horizontal_flip = True)
test_datagen = ImageDataGenerator(rescale = 1./255)
training_set = train_datagen.flow_from_directory('train_set',
target_size = (64, 64),
batch_size = 32,
class_mode = 'binary')
test_set = test_datagen.flow_from_directory('test_set',
target_size = (64, 64),
batch_size = 32,
class_mode = 'binary')
fit = classifier.fit_generator(training_set,
samples_per_epoch = 8000,
nb_epoch = 5,
validation_data = test_set,
nb_val_samples = 2000)
print(fit.history)
Resultados: tras acabar todos los epochs, he llegado a conseguir resultados entre el 91 y 93% de accuracy. Creo que pese a que no está mal para un first try, es muy, muy mejorable. He probado a añadir distintas capas, a cambiar ciertos parámetros y demás, pero lo máximo que he llegado a conseguir creo que fue 93.43% de accuracy si no recuerdo mal.
¿Qué cambios me recomendaríais hacer en la CNN para mejorarla? ¿Veis algún error grande y tosco en mi código sobre el que pueda aprender?
¡Gracias!