Я пытаюсь использовать нейронные сети для регрессии на бостонском наборе данных с использованием тензорного потока. Почему-то я все прогнозы ошибаюсь - PullRequest
0 голосов
/ 19 апреля 2020

Я получаю correct_eval как 0. Я использовал бостонский набор данных. Разделены на обучение и тестирование. Используется тензор потока для обучения модели. (Не керас). Нейронные сети состоят из 2 скрытых слоев размером 13 каждый и входной размер также равен 13.

import pandas as pd
import numpy as np

data=pd.read_csv("Boston_Housing.csv")

x=data.iloc[:,0:13]
x=np.array(x)
y=data.iloc[:,13]
y=np.array(y)

from sklearn.model_selection import train_test_split
x_train,x_test,y_train,y_test=train_test_split(x,y)


import tensorflow as tf
tf.__version__

input_width=13;
num_layers=2
n_hidden_layer1=13
n_hidden_layer2=13
n_op=1

weights={
    "w_h1":tf.Variable(tf.random_normal([input_width,n_hidden_layer1])),
    "w_h2":tf.Variable(tf.random_normal([n_hidden_layer1,n_hidden_layer2])),
    "w_op":tf.Variable(tf.random_normal([n_hidden_layer2,n_op]))
}
biases={
    "b_h1":tf.Variable(tf.random_normal([n_hidden_layer1])),
    "b_h2":tf.Variable(tf.random_normal([n_hidden_layer2])),
    "b_op":tf.Variable(tf.random_normal([n_op]))
}

tf.trainable_variables()

def forwardPropagation(x,weights,biases):
    ip_h1=tf.add(tf.matmul(x,weights['w_h1']),biases['b_h1'])
    op_h1=tf.nn.relu(ip_h1)  
    ip_h2=tf.add(tf.matmul(op_h1,weights['w_h2']),biases['b_h2'])
    op_h2=tf.nn.relu(ip_h2)
    ip_op=tf.add(tf.matmul(op_h2,weights['w_op']),biases['b_op'])
    op_op=tf.nn.relu(ip_op)
    return op_op

s=tf.Session()
s.run(tf.global_variables_initializer())
x=tf.placeholder("float",[None,input_width])
y=tf.placeholder("float",[None,n_op])
pred=forwardPropagation(x,weights,biases)

correct_pred=tf.equal(pred,y_train)
pred_eval,correct_eval=s.run([pred,correct_pred],feed_dict={x:x_train,y:y_train})
pred_eval,correct_eval

correct_eval.sum()
correct_eval

correct_eval равен 0. Это означает, что прогноз не верен. значения pred в основном равны 0 или полностью случайны. пожалуйста, помогите мне решить эту проблему.

1 Ответ

0 голосов
/ 20 апреля 2020

Взгляните на эту строку кода:

correct_pred=tf.equal(pred,y_train)

Вы оцениваете результаты неподготовленной регрессионной модели, используя равенство. Есть несколько проблем с этим.

  1. Значения в y_train создаются 3 слоями, которые имеют произвольные веса и смещения. Каждый слой преобразует входные данные, используя совершенно случайные преобразования. Перед тем, как приступить к обучению вашей модели на наборе данных, значения в y_train будут сильно отличаться от значений в pred.

  2. pred и y_train, которые содержат непрерывные значения , Почти всегда плохая идея проверять абсолютное равенство между двумя непрерывными значениями, потому что они должны быть точно одинаковыми значениями, чтобы равенство было True. Скажем, что вы обучили свою модель, и выходные данные в pred очень близко соответствуют значениям в y_train. Если они точно не соответствуют последним значащим ди git, сравнение всегда будет False. Таким образом, вы всегда получаете correct_eval=0.

Скорее всего, вы захотите рассчитать метри c, как среднеквадратическая ошибка (MSE) между pred и y_train , tf.keras.losses.MeanSquaredError является распространенным способом вычисления MSE в Tensorflow 2.0.

Что касается этого, значения

pred в основном равны 0 или совершенно случайно.

Вы передаете выходы последнего слоя через функцию ReLU, которая возвращает 0 для всех отрицательных входов. Опять же, поскольку выходы сети происходят из случайных преобразований, выходы являются случайными значениями с нулями вместо отрицательных значений. Это ожидаемо, и вам нужно будет настроить свою сеть, чтобы она давала какие-либо значимые результаты.

Также похоже, что вы используете Tensorflow 1.x, и в этом случае вы можете использовать tf.losses .mean_squared_error .

Удачи!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...