【问题标题】:Tensorflow Predicting SequenceTensorFlow 预测序列
【发布时间】:2018-12-01 16:48:42
【问题描述】:

所以我的任务是预测序列。我在时间 t 有 x,y,z 值,它们是浮点类型。我必须预测在时间 (t + 1) 具有值 x,y,z 的序列。

TIME_STEP = 10
N_FEATURES = N_CLASSES = 3
LEARNING_RATE = 0.01
EPOCHS = 50
BATCH_SIZE = 10

x = tf.placeholder(tf.float32, shape = [None, N_FEATURES], name = 'name')
y = tf.placeholder(tf.float32, shape = [N_CLASSES], name = 'labels')

然后我有我的 lstm 模型,它看起来像:

    x = tf.transpose(x, [1, 0])
    x = tf.reshape(x, [-1, num_features])

    hidden = tf.nn.relu(tf.matmul(x, self.h_W) + self.h_biases)
    hidden = tf.split(hidden, self.time_step)

    lstm_layers = [tf.contrib.rnn.BasicLSTMCell(self.hidden_units, forget_bias=1.0) for _ in range(2)]

    lstm_layers = tf.contrib.rnn.MultiRNNCell(lstm_layers)
    outputs, _ = tf.contrib.rnn.static_rnn(lstm_layers, hidden, dtype = tf.float32)

    lstm_output = outputs[-1]

最后我定义了损失函数和优化器

loss = tf.reduce_mean(tf.square(y - y_pred))
opt = tf.train.AdamOptimizer(learning_rate = LEARNING_RATE).minimize(loss)

现在我想用之前的 10 个值来预测第 11 个。所以我像

一样运行会话
for time in range(0, len(X)):
        sess.run(opt, feed_dict = {x : X[time: time + TIME_STEP ],
                                   y : Y[time + TIME_STEP + 1]})

但是当我检查这个函数的损失时,它具有像 99400290.0 这样的巨大价值,并且它会随着时间的推移而增加。这是我第一次预测序列,所以我想我一定错过了一些巨大的东西

【问题讨论】:

  • 你试过降低学习率吗?
  • 我用 0.00001 检查了学习率,但它仍然不起作用。
  • x、y 和 z 的取值范围是多少,您最后的激活函数是否反映了这一点?例如,如果您的网络只能输出 0 和 1 之间的值,但应该能够预测 99,这将是一个问题。一般来说,对 x、y 和 z 进行归一化可能会很好。
  • 你是对的,值有很大的差异,它们可以从 -100 到 163 000,我在 X 数据上使用了 MinMaxScaler,但我没有改变我的 Y,愚蠢的错误。现在我也尝试将它应用于测试数据并且损失得到 1e-7 并且它开始减少。感谢您的评论,但有一个问题,MinMaxScaler 适用于某些训练案例,以及在应用实际问题时我应该如何规范化我的输入数据。

标签: python python-3.x tensorflow neural-network sequence


【解决方案1】:

是的,您应该标准化您的真实世界输入数据,并且它应该使用您在训练集上使用的相同缩放比例(相同的参数)。

原因是,现在您的模型经过训练可以接受特定形状和比例的输入,并且要使其按预期执行,您必须将测试输入扩展到它。

(很抱歉将其发布为答案,没有足够的代表发表评论)

【讨论】:

  • 谢谢你的回答,是的,现在我明白了,但是你能提供任何缩放算法,可以很好地处理从 0 到 300 000 变化的数据吗?
  • 据我所知,最小-最大缩放和标准化是几乎只使用的方法。还有另一种称为归一化的方法,但它仅用于矩阵。在规范化方面,它展开的范围并不是什么大问题,因为这就是这样做的重点。当输入很大时,它们倾向于输出位于激活函数两端的值,这使得 back prop 变得困难,因为梯度几乎为 0。这就是为什么我们倾向于使用从 0 到 1 或 -1 到 1 的值。
  • 我知道这种标准化技术。但是当我在训练数据上拟合我的缩放函数时,我认为我必须保存它来规范化与训练值相对应的输入数据。我已经找到了从 Sklearn 库中保存规范化的方法,所以我会继续这样做。谢谢。
  • 是的,您必须保存用于标准化的值,例如“μ”和“σ”。很高兴帮助:)
猜你喜欢
  • 2017-05-28
  • 2020-10-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-03
  • 1970-01-01
  • 1970-01-01
  • 2016-10-29
  • 2018-04-22
相关资源
最近更新 更多