Soy bastante nuevo en redes neuronales y actualmente estoy intentando entrenar una red neuronal no convolucional en el conjunto de datos MNIST. Estoy observando algunos comportamientos que no entiendo muy bien.
Este es el código escrito con keras como librería:
# the data, split between train and test sets
(x_train, y_train), (x_test, y_test) = fashion_mnist.load_data()
y_train = keras.utils.to_categorical(y_train, 10)
y_test = keras.utils.to_categorical(y_test, 10)
model = Sequential()
early_stopper = EarlyStopping(patience=3)
model.add(Flatten(input_shape=(28,28)))
model.add(Dense(128, activation="relu"))
model.add(Dense(128, activation="relu"))
model.add(Dense(10, activation="softmax"))
model.compile(loss="categorical_crossentropy", optimizer="adam", metrics=["accuracy"])
model.fit(x_train, y_train, epochs=20, validation_data=(x_test, y_test), callbacks=[early_stopper])
Esto me da una validación_acc de alrededor del 20%. Lo curioso es que cuando cambio las funciones de activación a "sigmoid", la función de pérdida a "mean_squared_error" y el optimizador a "sgd" mi rendimiento mejora hasta alrededor del 85% después de 50 epochs.
Habiendo leído http://neuralnetworksanddeeplearning.com/ Me pregunto a qué se debe el mal rendimiento de la red que presenté en el código. ReLU, entropía cruzada y un optimizador dinámico como Adam parecen mejorar la idea de una red neuronal muy vainilla con optimización de gradiente estocástico, error cuadrático medio como pérdida y funciones de activación sigmoideas. Sin embargo, obtengo un rendimiento realmente malo y si aumento el número de nodos en las capas ocultas a menudo obtengo una red que no aprende en absoluto.
EDITAR: Me di cuenta de que tiene algo que ver conmigo no normalizar la entrada a valores entre 0 y 1 ... pero por qué ¿es este el problema?