使用LSTM logits进行值预测

时间:2018-05-01 07:25:42

标签: tensorflow lstm recurrent-neural-network

我正在查看this LSTM示例。在训练网络后,使用相同的输入批次获得多个预测,会得到不同的结果。

for z in range(3):
  o = session.run([model.logits], feed_dict={model.inputs:X_test[0:0+batch_size]})
  print(o)

例如,第一个预测值为-0.24326998, -0.23387843, -0.22564721 鉴于最终的logits,它们是不是应该修复并给出一个固定的预测?我错过了什么?

1 个答案:

答案 0 :(得分:2)

如果仔细观察这个函数的定义:

def LSTM_cell(hidden_layer_size, batch_size,number_of_layers, dropout=True, dropout_rate=0.8):
    # ...
    if dropout:
        layer = tf.contrib.rnn.DropoutWrapper(layer, output_keep_prob=dropout_rate)

它将dropout函数应用于每个LSTM单元格的输出,tf.nn.dropout()tf.contrib.rnn.DropoutWrapper()将一些百分比的张量元素随机设置为零,您可以查看链接以获取更多详细信息。根据LSTM_cell()的定义,每次调用

o = session.run([model.logits], feed_dict={model.inputs:X_test[0:0+batch_size]})

模型中每个LSTM细胞的每个输出神经元随机设置为零,概率为1 - 0.8 = 0.2 = 20%。因此,您的模型是随机的,即使在针对相同输入运行模型时,您也会得到不同的结果。 Dropout是一种在训练神经网络时很有用的正则化方法,在验证和测试模式下应用它是没用的(也许是反直觉的)。我不想调用你提到的代码不正确,但通常会使用这样的占位符实现dropout:

def LSTM_cell(hidden_layer_size, batch_size,number_of_layers,  dropout_rate):
    # ...
    layer = tf.contrib.rnn.BasicLSTMCell(hidden_layer_size)
    layer = tf.contrib.rnn.DropoutWrapper(layer, output_keep_prob=dropout_rate)

class StockPredictionRNN(object):
    def __init__(...)
    # ...
    self.dropout_placeholder = tf.placeholder(tf.float32)
    cell, init_state = LSTM_cell(hidden_layer_size, batch_size, number_of_layers, self.dropout_placeholder)

在训练阶段将辍学率设定为0.8:

for i in range(epochs):
    # ...
    o, c, _ = session.run([model.logits, model.loss, model.opt], feed_dict={model.inputs:X_batch, model.targets:y_batch, model.dropout_placeholder: 0.8})

通过在测试阶段将辍学率设置为1.0来禁用辍学:

o = session.run([model.logits], feed_dict={model.inputs:X_test[i:i+batch_size], model.dropout_placeholder: 1.0})

有关辍学的详情,请查看the original paper