python - 我正在尝试使用神经网络使用 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 或完全随机。请帮我解决这个问题。
解决方案
看看这行代码:
correct_pred=tf.equal(pred,y_train)
您正在使用等式评估未经训练的回归模型的输出。这有几个问题。
中的值
y_train
由具有随机权重和偏差的 3 层产生。每一层都使用完全随机的变换来变换输入。在数据集上训练模型之前, 中的值y_train
将与 中的值大不相同pred
。pred
并且y_train
都包含连续值。检查两个连续值之间的绝对相等几乎总是一个坏主意,因为它们需要完全相同的值才能相等True
。假设您已经训练了模型,并且输出pred
与值y_train
非常匹配。除非它们与最后一个有效数字完全False
匹配,否则比较将始终为。因此,您总是得到correct_eval=0
.
最有可能的是,您需要计算一个指标,例如 和 之间的均方误差 (MSE pred
) y_train
。tf.keras.losses.MeanSquaredError是 Tensorflow 2.0 中计算 MSE 的常用方法。
至于这个,
pred 值大多为 0 或完全随机。
您正在通过 ReLU 函数传递最后一层的输出,该函数为所有负输入返回 0。同样,由于网络的输出来自随机变换,因此输出是用零代替负值的随机值。这是意料之中的,您需要训练您的网络以提供任何有意义的输出。
看起来您正在使用 Tensorflow 1.x,在这种情况下您可以使用tf.losses.mean_squared_error。
祝你好运!
推荐阅读
- firebase - 组合futurebuilder和streambuilder时,Flutter中的Listview builder滚动不流畅
- java - 使用 WebSocket Angular 应用程序监听 REST 端点
- python - 我的弹丸停止射击问题如何解决?
- swiftui - 在 SwiftUI Picker 中为 NSManagedObject 设置默认值?
- webpack - Workbox - 如何忽略匹配前缀的 URI
- flutter - 我如何解决“在初始化程序中只能访问静态成员”错误
- sql - SQL 条件加一
- sql-server - 无法将 System.DBNull 转换为 System.Byte[]
- javascript - 如何使用谷歌表格脚本从 YouTube 播放列表中删除所有歌曲
- java - SQL 错误缺少数据库(“123”附近:语法错误)