Tensorflow выдает точность 1, но все результаты одинаковы (и неверны) - PullRequest
0 голосов
/ 27 апреля 2018

Я пытаюсь построить нейронную сеть Tensorflow, но не могу заставить ее работать правильно. Он всегда выводит одинаковые значения для каждого наблюдения. Пытался изменить функции активации, изменить скорость обучения, изменить тензоры и массивы, я что-то здесь упускаю.

Набор данных полностью числовой.

import tensorflow as tf
import numpy as np
import pandas as pd
from sklearn.preprocessing import Normalizer
from sklearn.model_selection import train_test_split

df = pd.read_csv("data.csv")
X = np.array(df[["area","bathrooms", "sq_price"]])
y = df[["price"]]
y = np.array(y).reshape([47, 1])

normalizer = Normalizer()
X = normalizer.fit_transform(X)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)
X_test = np.array(X_test, dtype='float32')
y_test = np.array(y_test, dtype="float32")
X_test.shape

n_inputs = len(X_train[0])
n_hidden = 5
n_outputs = 1
lr = 0.001
epochs = 5000
batch_size = 1

xph = tf.placeholder(tf.float32, [None, n_inputs])
yph = tf.placeholder(tf.float32, [None, n_outputs])

W1 = tf.Variable(tf.truncated_normal([n_inputs, n_hidden], stddev=0.1))
W2 = tf.Variable(tf.truncated_normal([n_hidden, n_outputs], stddev=0.1))
b1 = tf.Variable(tf.ones([n_hidden]))
b2 = tf.Variable(tf.ones([n_outputs]))

def feed_forward(X, W1, W2, b1, b2):
    l1 = tf.tanh(tf.add(tf.matmul(X, W1), b1))
    l2 = tf.add(tf.matmul(l1, W2),b2)
    return l2

output = feed_forward(xph, W1, W2, b1, b2)

error = tf.reduce_mean((output - yph)**2)
optimizer = tf.train.GradientDescentOptimizer(lr).minimize(error)

init = tf.global_variables_initializer()
correct_prediction = tf.equal(tf.argmax(output,1), tf.argmax(yph,1))
accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))

with tf.Session() as sess:
    sess.run(init)
    print("Weights 1 before training:\n ", sess.run([W1]), "\n")
    for i in range(epochs):
        rand_ind = np.random.randint(len(X_train), size = batch_size)
        loss = sess.run([optimizer], feed_dict={xph: X_train[rand_ind], yph: y_train[rand_ind]})
        if i == (epochs-1):
            print("Done!\n")

    print("Weights 1 after training: \n", sess.run([W1]), "\n")
    print("Accuracy: ", sess.run(accuracy, feed_dict={xph:X_test, yph:y_test}), "\n")
    print("Results for testing:\n ", sess.run(feed_forward(X_test, W1, W2, b1, b2), feed_dict={xph: X_test}), "\n")
    print("Expected values:\n ", y_test)

Вывод кода:

Weights 1 before training:
[array([[ 0.02620826, -0.11837681,  0.01349821,  0.04195584,  0.14087772],
       [-0.10512593,  0.1383599 , -0.0632275 ,  0.07759375, -0.09907298],
       [-0.14932911,  0.13720822,  0.15072195, -0.09748196,  0.08388615]],
      dtype=float32)]

Done!

Weights 1 after training:
 [array([[ 1.0387952e+01,  1.7232073e+01,  2.9152514e+01, -1.8471668e+01,
         2.2215986e+01],
       [-8.4001064e-02,  1.7373289e-01, -3.8207369e-03,  3.9849356e-02,
        -5.4067656e-02],
       [ 5.5025685e-01,  1.3086454e+00,  2.1180787e+00, -1.3474523e+00,
         1.5743145e+00]], dtype=float32)]

Accuracy:  1.0

Results for testing:
  [[340043.88]
 [340043.88]
 [340043.88]
 [340043.88]
 [340043.88]
 [340043.88]
 [340043.88]
 [340043.88]
 [340043.88]
 [340043.88]]

Expected values:
  [[349900.]
 [369000.]
 [573900.]
 [252900.]
 [299900.]
 [329900.]
 [449900.]
 [285900.]
 [212000.]
 [229900.]]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...