una tutorial redes neuronales neuronal learning implementacion español ejemplos basicos python neural-network regression tensorflow

python - tutorial - La red neuronal profunda de tensorflow para la regresión siempre predice los mismos resultados en un lote



tensorflow python (2)

Es probable que haya un problema con la implementación de carga o indexación de su conjunto de datos. Si solo modificó el costo para MSE, asegúrese de que pred y y se estén actualizando correctamente y que no los sobrescribió con una operación gráfica diferente.

Otra cosa para ayudar a depurar sería predecir los resultados de regresión reales. También ayudaría si publicaras más de tu código para que podamos ver tu implementación específica de carga de datos, etc.

Uso un tensorflow para implementar un perceptrón multicapa simple para la regresión. El código se modifica desde el clasificador mnist estándar, que solo cambié el costo de salida a MSE (use tf.reduce_mean(tf.square(pred-y)) ), y algunos ajustes de entrada, tamaño de salida. Sin embargo, si entreno la red usando la regresión, después de varias épocas, el lote de salida es totalmente el mismo. por ejemplo:

target: 48.129, estimated: 42.634 target: 46.590, estimated: 42.634 target: 34.209, estimated: 42.634 target: 69.677, estimated: 42.634 ......

He intentado diferentes tamaños de lotes, diferentes inicializaciones, entrada de normalización usando sklearn.preprocessing.scale (mi rango de entradas es bastante diferente). Sin embargo, ninguno de ellos funcionó. También probé uno de los ejemplos de sklearn de Tensorflow ( Regresión de red neuronal profunda con datos de Boston ). Pero tengo otro error en la línea 40:

El objeto ''módulo'' no tiene atributo ''infer_real_valued_columns_from_input''

¿Alguien tiene pistas sobre dónde está el problema? Gracias

Mi código se enumera a continuación, puede ser un poco largo, pero muy directo:

from __future__ import absolute_import from __future__ import division from __future__ import print_function import tensorflow as tf from tensorflow.contrib import learn import matplotlib.pyplot as plt from sklearn.pipeline import Pipeline from sklearn import datasets, linear_model from sklearn import cross_validation import numpy as np boston = learn.datasets.load_dataset(''boston'') x, y = boston.data, boston.target X_train, X_test, Y_train, Y_test = cross_validation.train_test_split( x, y, test_size=0.2, random_state=42) total_len = X_train.shape[0] # Parameters learning_rate = 0.001 training_epochs = 500 batch_size = 10 display_step = 1 dropout_rate = 0.9 # Network Parameters n_hidden_1 = 32 # 1st layer number of features n_hidden_2 = 200 # 2nd layer number of features n_hidden_3 = 200 n_hidden_4 = 256 n_input = X_train.shape[1] n_classes = 1 # tf Graph input x = tf.placeholder("float", [None, 13]) y = tf.placeholder("float", [None]) # 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) # Hidden layer with RELU activation layer_3 = tf.add(tf.matmul(layer_2, weights[''h3'']), biases[''b3'']) layer_3 = tf.nn.relu(layer_3) # Hidden layer with RELU activation layer_4 = tf.add(tf.matmul(layer_3, weights[''h4'']), biases[''b4'']) layer_4 = tf.nn.relu(layer_4) # Output layer with linear activation out_layer = tf.matmul(layer_4, weights[''out'']) + biases[''out''] return out_layer # Store layers weight & bias weights = { ''h1'': tf.Variable(tf.random_normal([n_input, n_hidden_1], 0, 0.1)), ''h2'': tf.Variable(tf.random_normal([n_hidden_1, n_hidden_2], 0, 0.1)), ''h3'': tf.Variable(tf.random_normal([n_hidden_2, n_hidden_3], 0, 0.1)), ''h4'': tf.Variable(tf.random_normal([n_hidden_3, n_hidden_4], 0, 0.1)), ''out'': tf.Variable(tf.random_normal([n_hidden_4, n_classes], 0, 0.1)) } biases = { ''b1'': tf.Variable(tf.random_normal([n_hidden_1], 0, 0.1)), ''b2'': tf.Variable(tf.random_normal([n_hidden_2], 0, 0.1)), ''b3'': tf.Variable(tf.random_normal([n_hidden_3], 0, 0.1)), ''b4'': tf.Variable(tf.random_normal([n_hidden_4], 0, 0.1)), ''out'': tf.Variable(tf.random_normal([n_classes], 0, 0.1)) } # Construct model pred = multilayer_perceptron(x, weights, biases) # Define loss and optimizer cost = tf.reduce_mean(tf.square(pred-y)) optimizer = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(cost) # Launch the graph with tf.Session() as sess: sess.run(tf.initialize_all_variables()) # Training cycle for epoch in range(training_epochs): avg_cost = 0. total_batch = int(total_len/batch_size) # Loop over all batches for i in range(total_batch-1): batch_x = X_train[i*batch_size:(i+1)*batch_size] batch_y = Y_train[i*batch_size:(i+1)*batch_size] # Run optimization op (backprop) and cost op (to get loss value) _, c, p = sess.run([optimizer, cost, pred], feed_dict={x: batch_x, y: batch_y}) # Compute average loss avg_cost += c / total_batch # sample prediction label_value = batch_y estimate = p err = label_value-estimate print ("num batch:", total_batch) # Display logs per epoch step if epoch % display_step == 0: print ("Epoch:", ''%04d'' % (epoch+1), "cost=", / "{:.9f}".format(avg_cost)) print ("[*]----------------------------") for i in xrange(3): print ("label value:", label_value[i], / "estimated value:", estimate[i]) print ("[*]============================") print ("Optimization Finished!") # Test model correct_prediction = tf.equal(tf.argmax(pred, 1), tf.argmax(y, 1)) # Calculate accuracy accuracy = tf.reduce_mean(tf.cast(correct_prediction, "float")) print ("Accuracy:", accuracy.eval({x: X_test, y: Y_test}))


Respuesta corta :

Transponga su vector pred utilizando tf.transpose(pred) .

Respuesta más larga :

El problema es que pred (las predicciones) y y (las etiquetas) no tienen la misma forma: una es un vector de fila y el otro un vector de columna. Aparentemente, cuando aplica una operación de elemento sobre ellos, obtendrá una matriz, que no es lo que quiere.

La solución es transponer el vector de predicción utilizando tf.transpose() para obtener un vector apropiado y, por lo tanto, una función de pérdida adecuada. En realidad, si configuras el tamaño del lote en 1 en tu ejemplo, verás que funciona incluso sin la corrección, porque transponer un vector 1x1 es una operación no operativa.

Apliqué esta corrección a su código de ejemplo y observé el siguiente comportamiento. Antes de la corrección:

Epoch: 0245 cost= 84.743440580 [*]---------------------------- label value: 23 estimated value: [ 27.47437096] label value: 50 estimated value: [ 24.71126747] label value: 22 estimated value: [ 23.87785912]

Y después de la corrección en el mismo momento:

Epoch: 0245 cost= 4.181439120 [*]---------------------------- label value: 23 estimated value: [ 21.64333534] label value: 50 estimated value: [ 48.76105118] label value: 22 estimated value: [ 24.27996063]

Verá que el costo es mucho menor y que realmente aprendió el valor 50 correctamente. Tendrás que afinar la tasa de aprendizaje para mejorar tus resultados, por supuesto.