【发布时间】:2018-04-30 15:39:54
【问题描述】:
嘿嘿,
我正在尝试编写一个小程序来解决回归问题。我的数据集是 4 个随机 x(x1、x2、x3 和 x4)和 1 个 y 值。其中一行如下所示:
0.634585 0.552366 0.873447 0.196890 8.75
我知道想要尽可能接近地预测 y 值,因此在训练后我想通过显示损失来评估我的模型有多好。不幸的是,我总是收到
Training cost= nan
可能最重要的几行是:
X_data = tf.placeholder(shape=[None, 4], dtype=tf.float32)
y_target = tf.placeholder(shape=[None, 1], dtype=tf.float32)
# Input neurons : 4
# Hidden neurons : 2 x 8
# Output neurons : 3
hidden_layer_nodes = 8
w1 = tf.Variable(tf.random_normal(shape=[4,hidden_layer_nodes])) # Inputs -> Hidden Layer1
b1 = tf.Variable(tf.random_normal(shape=[hidden_layer_nodes])) # First Bias
w2 = tf.Variable(tf.random_normal(shape=[hidden_layer_nodes,1])) # Hidden layer2 -> Outputs
b2 = tf.Variable(tf.random_normal(shape=[1])) # Third Bias
hidden_output = tf.nn.relu(tf.add(tf.matmul(X_data, w1), b1))
final_output = tf.nn.relu(tf.add(tf.matmul(hidden_output, w2), b2))
loss = tf.reduce_mean(-tf.reduce_sum(y_target * tf.log(final_output), axis=0))
optimizer = tf.train.GradientDescentOptimizer(learning_rate=0.001)
train = optimizer.minimize(loss)
init = tf.global_variables_initializer()
steps = 10000
with tf.Session() as sess:
sess.run(init)
for i in range(steps):
sess.run(train,feed_dict={X_data:X_train,y_target:y_train})
# PRINT OUT A MESSAGE EVERY 100 STEPS
if i%500 == 0:
print('Currently on step {}'.format(i))
training_cost = sess.run(loss, feed_dict={X_data:X_test,y_target:y_test})
print("Training cost=", training_cost)
也许有人知道我的错误在哪里,甚至更好,如何在我的训练过程中不断地显示错误:) 我知道这是如何使用 tf.estimator 完成的,但并非没有。如果您需要数据集,请告诉我。
干杯!
【问题讨论】:
-
回归中的输入和输出激活应该是“线性的”。隐藏 - 'relu' 或其他东西。而且我不了解您关于回归案例的损失函数。请检查一下。我想你的“南”是由日志功能引起的。
-
感谢您的回答。我试图改变我的激活函数和损失函数,但我的错误没有达到7000。现在使用的激活函数在隐藏层是relu,在输出层根本没有激活,所以只有“final_output = tf.add( tf.matmul(hidden_output, w2), b2)”和成本函数“tf.reduce_sum(tf.square(final_output-y_target))”。我只是想知道当标签仅在 0 到 8 之间变化时,巨大的错误来自哪里?
-
我现在明白的是,sigmoid 激活函数不应该在输出层,因为它只能为我提供 0 到 1 之间的值。但无论我尝试什么,将其更改为没有激活函数或改变代价函数,误差总是很大!
-
对于回归情况 - 最后只有线性激活。尝试另一种架构,例如,不是 4 -> 8 -> 1,而是 4 -> 8 -> 6 -> 3 -> 1。也许随机生成的特征也有问题?如果你有大量的行,NN 可能不适合它。
-
啊,数据标准化了吗?如果不是,则使用 (0, 1)、(-1, 1) 或 (0.1, 0.9) 对其应用 MinMax 缩放器。
标签: python tensorflow neural-network regression