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}))
Author: Sufeng Niu, 2016-07-15

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.

 26
Author: CNugteren,
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.

 1
Author: ahaque,
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