Estuve jugando con una simple Red Neural con una sola capa oculta, por Tensorflow, y luego probé diferentes activaciones para la capa oculta:
- Relu
- Sigmoide
- Softmax (bueno, normalmente softmax se utiliza en la última capa..)
Relu ofrece la mejor precisión de entrenamiento y de validación. No estoy seguro de cómo explicar esto.
Sabemos que Relu tiene buenas cualidades, como la dispersión, como el no-gradiente-vanishing, etc, pero
P: ¿es la neurona Relu en general mejor que las neuronas sigmoides/softmax? ¿Deberíamos utilizar casi siempre neuronas Relu en las NN (o incluso en las CNN)? Pensé que una neurona más compleja introduciría un mejor resultado, al menos la precisión del tren si nos preocupamos por el sobreajuste.
Gracias PD: El código básicamente es de "Udacity-Machine learning -assignment2", que es el reconocimiento de notMNIST usando una simple NN de 1 capa oculta.
batch_size = 128
graph = tf.Graph()
with graph.as_default():
# Input data.
tf_train_dataset = tf.placeholder(tf.float32, shape=(batch_size, image_size * image_size))
tf_train_labels = tf.placeholder(tf.float32, shape=(batch_size, num_labels))
tf_valid_dataset = tf.constant(valid_dataset)
tf_test_dataset = tf.constant(test_dataset)
# hidden layer
hidden_nodes = 1024
hidden_weights = tf.Variable( tf.truncated_normal([image_size * image_size, hidden_nodes]) )
hidden_biases = tf.Variable( tf.zeros([hidden_nodes]))
hidden_layer = **tf.nn.relu**( tf.matmul( tf_train_dataset, hidden_weights) + hidden_biases)
# Variables.
weights = tf.Variable( tf.truncated_normal([hidden_nodes, num_labels]))
biases = tf.Variable(tf.zeros([num_labels]))
# Training computation.
logits = tf.matmul(hidden_layer, weights) + biases
loss = tf.reduce_mean( tf.nn.softmax_cross_entropy_with_logits(logits, tf_train_labels) )
# Optimizer.
optimizer = tf.train.GradientDescentOptimizer(0.5).minimize(loss)
# Predictions for the training, validation, and test data.
train_prediction = tf.nn.softmax(logits)
valid_relu = **tf.nn.relu**( tf.matmul(tf_valid_dataset, hidden_weights) + hidden_biases)
valid_prediction = tf.nn.softmax( tf.matmul(valid_relu, weights) + biases)
test_relu = **tf.nn.relu**( tf.matmul( tf_test_dataset, hidden_weights) + hidden_biases)
test_prediction = tf.nn.softmax(tf.matmul(test_relu, weights) + biases)