【问题标题】:Evaluation of Regression Neural Network回归神经网络的评估
【发布时间】: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


【解决方案1】:

这是因为 Relu 激活函数导致梯度爆炸。因此,您需要相应地降低学习率。此外,您还可以尝试不同的激活函数(为此,您可能必须先对数据集进行标准化)

在这里,(In simple multi-layer FFNN only ReLU activation function doesn't converge) 与您的情况类似。按照答案,你就会明白。

希望这会有所帮助。

【讨论】:

  • 感谢您的回答。你是对的,更改 learning_rate 会有所帮助,但最好将激活函数更改为 sigmoid 并将优化器更改为 AdagradOptimizer 并收到 5.0 的损失,我认为假设这些值都是随机的,这很好。在 tf.estimator 示例中,损失或错误在评估期间不断出现。在浏览数据集时我会怎么做才能不断看到不断变化的错误?
猜你喜欢
  • 1970-01-01
  • 2020-03-27
  • 2013-06-30
  • 2019-01-27
  • 2016-11-04
  • 2021-09-13
  • 1970-01-01
  • 2017-04-13
  • 2020-10-24
相关资源
最近更新 更多