首页 > 解决方案 > 我正在尝试使用神经网络使用 tensorflow 对波士顿数据集进行回归。不知何故,我把所有的预测都弄错了

问题描述

我得到的正确评估为 0。我使用了波士顿数据集。分为训练和测试。使用 tensorflow 训练模型。(不是喀拉拉邦)。神经网络由 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 或完全随机。请帮我解决这个问题。

标签: pythontensorflow

解决方案


看看这行代码:

correct_pred=tf.equal(pred,y_train)

您正在使用等式评估未经训练的回归模型的输出。这有几个问题。

  1. 中的值y_train由具有随机权重和偏差的 3 层产生。每一层都使用完全随机的变换来变换输入。在数据集上训练模型之前, 中的值y_train将与 中的值大不相同pred

  2. pred并且y_train都包含连续值。检查两个连续值之间的绝对相等几乎总是一个坏主意,因为它们需要完全相同的值才能相等True。假设您已经训练了模型,并且输出pred与值y_train非常匹配。除非它们与最后一个有效数字完全False匹配,否则比较将始终为。因此,您总是得到correct_eval=0.

最有可能的是,您需要计算一个指标,例如 和 之间的均方误差 (MSE pred) y_traintf.keras.losses.MeanSquaredError是 Tensorflow 2.0 中计算 MSE 的常用方法。

至于这个,

pred 值大多为 0 或完全随机。

您正在通过 ReLU 函数传递最后一层的输出,该函数为所有负输入返回 0。同样,由于网络的输出来自随机变换,因此输出是用零代替负值的随机值。这是意料之中的,您需要训练您的网络以提供任何有意义的输出。

看起来您正在使用 Tensorflow 1.x,在这种情况下您可以使用tf.losses.mean_squared_error

祝你好运!


推荐阅读