MLP en tensorflow para regresión … no convergente

Hola, es la primera vez que trabajo con tensorflow. Intento adaptar el ejemplo aquí, TensorFlow-Example para usar este código para problemas de regresión con la base de datos de Boston. Básicamente, solo cambio la función de costo, la base de datos, el número de entradas y el número objective, pero cuando ejecuto el MPL no converge (uso una tasa muy baja). Lo pruebo con Adam Optimization y desciendo la optimización de gradiente pero tengo el mismo comportamiento. Aprecio sus sugerencias e ideas … !!!

Observación: cuando ejecuté este progtwig sin las modificaciones descritas anteriormente, el valor de la función de costo siempre disminuye.

Aquí la evolución cuando ejecuto el modelo, la función de costo oscila incluso con una tasa de aprendizaje muy baja. En el peor de los casos, espero que el modelo converja en un valor, por ejemplo, la época 944 muestra un valor de 0.2267548, si no otro valor mejor es encuentra entonces este valor debe permanecer hasta que la optimización haya finalizado.

Época: 0942 costo = 0.445707272

Época: 0943 costo = 0.389314095

Época: 0944 costo = 0.226754842

Época: 0945 costo = 0.404150135

Época: 0946 costo = 0.382190095

Época: 0947 costo = 0.897880572

Época: 0948 costo = 0.481954243

Época: 0949 costo = 0.269408980

Época: 0950 costo = 0.427961614

Época: 0951 costo = 1.206053280

Época: 0952 costo = 0,834200084

from __future__ import print_function # Import MNIST data #from tensorflow.examples.tutorials.mnist import input_data #mnist = input_data.read_data_sets("/tmp/data/", one_hot=True) import tensorflow as tf import ToolInputData as input_data ALL_DATA_FILE_NAME = "boston_normalized.csv" ##Load complete database, then this database is splitted in training, validation and test set completedDatabase = input_data.Databases(databaseFileName=ALL_DATA_FILE_NAME, targetLabel="MEDV", trainPercentage=0.70, valPercentage=0.20, testPercentage=0.10, randomState=42, inputdataShuffle=True, batchDataShuffle=True) # Parameters learning_rate = 0.0001 training_epochs = 1000 batch_size = 5 display_step = 1 # Network Parameters n_hidden_1 = 10 # 1st layer number of neurons n_hidden_2 = 10 # 2nd layer number of neurons n_input = 13 # number of features of my database n_classes = 1 # one target value (float) # tf Graph input x = tf.placeholder("float", [None, n_input]) y = tf.placeholder("float", [None, n_classes]) # Create model def multilayer_perceptron(x, weights, biases): # Hidden layer with RELU activation layer_1 = tf.add(tf.matmul(x, weights['h1']), biases['b1']) layer_1 = tf.nn.relu(layer_1) # Hidden layer with RELU activation layer_2 = tf.add(tf.matmul(layer_1, weights['h2']), biases['b2']) layer_2 = tf.nn.relu(layer_2) # Output layer with linear activation out_layer = tf.matmul(layer_2, weights['out']) + biases['out'] return out_layer # Store layers weight & bias weights = { 'h1': tf.Variable(tf.random_normal([n_input, n_hidden_1])), 'h2': tf.Variable(tf.random_normal([n_hidden_1, n_hidden_2])), 'out': tf.Variable(tf.random_normal([n_hidden_2, n_classes])) } biases = { 'b1': tf.Variable(tf.random_normal([n_hidden_1])), 'b2': tf.Variable(tf.random_normal([n_hidden_2])), 'out': tf.Variable(tf.random_normal([n_classes])) } # Construct model pred = multilayer_perceptron(x, weights, biases) # Define loss and optimizer cost = tf.reduce_mean(tf.square(pred-y)) #cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(pred, y)) optimizer = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(cost) # Initializing the variables init = tf.initialize_all_variables() # Launch the graph with tf.Session() as sess: sess.run(init) # Training cycle for epoch in range(training_epochs): avg_cost = 0. total_batch = int(completedDatabase.train.num_examples/batch_size) # Loop over all batches for i in range(total_batch): batch_x, batch_y = completedDatabase.train.next_batch(batch_size) # Run optimization op (backprop) and cost op (to get loss value) _, c = sess.run([optimizer, cost], feed_dict={x: batch_x, y: batch_y}) # Compute average loss avg_cost += c / total_batch # Display logs per epoch step if epoch % display_step == 0: print("Epoch:", '%04d' % (epoch+1), "cost=", \ "{:.9f}".format(avg_cost)) print("Optimization Finished!") 

Un par de puntos.

Tu modelo es bastante superficial siendo solo dos capas. Por supuesto, necesitará más datos para entrenar a un modelo más grande, así que no sé cuántos datos tiene en el conjunto de datos de Boston.

¿Cuáles son tus tags? Eso informaría mejor si el error al cuadrado es mejor para su modelo.

También su tasa de aprendizaje es bastante baja.

Usted declaró que sus tags están en el rango [0,1], pero no puedo ver que las predicciones estén en el mismo rango. Para hacerlos comparables a las tags, debe transformarlos al mismo rango antes de regresar, por ejemplo, usando la función sigmoide:

 out_layer = tf.matmul(...) out = tf.sigmoid(out_layer) return out 

Tal vez esto solucione el problema con la estabilidad. También es posible que desee boost un poco el tamaño del lote, por ejemplo, 20 ejemplos por lote. Si esto mejora el rendimiento, probablemente puede boost un poco la velocidad de aprendizaje.