głęboka sieć neuronowa tensorflow do regresji zawsze przewiduje takie same wyniki w jednej partii
Używam tensorflow do implementacji prostego perceptronu wielowarstwowego do regresji. Kod jest zmodyfikowany ze standardowego klasyfikatora mnist, który zmieniłem tylko koszt wyjściowy na MSE( użyj tf.reduce_mean(tf.square(pred-y))
), i niektóre ustawienia wielkości wejścia, wyjścia. Jeśli jednak trenuję sieć za pomocą regresji, po kilku epokach, partia wyjściowa jest całkowicie taka sama. na przykład:
target: 48.129, estimated: 42.634
target: 46.590, estimated: 42.634
target: 34.209, estimated: 42.634
target: 69.677, estimated: 42.634
......
Próbowałem różnych rozmiarów partii, różnych inicjalizacji, normalizacji wprowadzania za pomocą sklearn.obróbka wstępna.skala (mój zakres wejść jest zupełnie inny). Jednak żaden z nich nie zadziałał. Wypróbowałem również jeden z przykładów sklearn z Tensorflow (Deep Neural Network Regression with Boston Data ). Ale mam kolejny błąd w linii 40:
'module' obiekt nie posiada atrybutu 'infer_real_valued_columns_from_input'
Ktoś wie, gdzie jest problem? DziękujęMój kod jest wymieniony poniżej, może być trochę długi, ale bardzo straghtforward:
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}))
2 answers
Krótka odpowiedź :
TRANSPONUJ swój pred
wektor używając tf.transpose(pred)
.
Dłuższa odpowiedź :
Problem polega na tym, że pred
(przewidywania) i y
(etykiety) nie mają tego samego kształtu: jeden jest wektorem wiersza, a drugi wektorem kolumny. Najwidoczniej, gdy zastosujesz na nich operację elementową, otrzymasz matrycę, która nie jest tym, czego chcesz.
Rozwiązaniem jest transpozycja wektora predykcyjnego za pomocą tf.transpose()
, aby uzyskać właściwy wektor, a więc prawidłowa funkcja utraty. W rzeczywistości, jeśli ustawisz rozmiar partii na 1 w twoim przykładzie zobaczysz, że działa nawet bez poprawki, ponieważ transpozycja wektora 1x1 jest no-op.
Zastosowałem tę poprawkę do przykładowego kodu i zaobserwowałem następujące zachowanie. Przed poprawką:
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]
I po fixie w tym samym momencie:
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]
Zobaczysz, że koszt jest znacznie niższy i że właściwie nauczył się wartości 50. Będziesz musiał trochę dopracować na szybkość uczenia się i takie, aby poprawić swoje wyniki oczywiście.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-07-27 14:17:38
Prawdopodobnie występuje problem z załadowaniem lub indeksowaniem zestawu danych. Jeśli tylko zmodyfikowałeś koszt do MSE, upewnij się, że pred
i y
są prawidłowo aktualizowane i nie nadpisałeś ich inną operacją wykresu.
Kolejną rzeczą, która pomoże debugować, byłoby przewidywanie rzeczywistych wyników regresji. Pomogłoby również, gdybyś opublikował więcej swojego kodu, abyśmy mogli zobaczyć Twoją konkretną implementację ładowania danych itp.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-07-15 20:25:01