Tensorflow 利用LSTM-logits进行价值预测

Tensorflow 利用LSTM-logits进行价值预测,tensorflow,lstm,recurrent-neural-network,Tensorflow,Lstm,Recurrent Neural Network,我正在看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 考虑到最后的逻辑,它们不应该被修正并给出一个固定的预测吗?我遗漏了什么?如果仔细查看此函数的定义:

我正在看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


考虑到最后的逻辑,它们不应该被修正并给出一个固定的预测吗?我遗漏了什么?

如果仔细查看此函数的定义:

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)
它对每个LSTM单元的输出应用dropout函数,并随机将张量元素的某些百分比设置为零,您可以查看链接了解更多详细信息。根据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是一种正则化方法,在训练神经网络时非常有用,在验证和测试模式中应用它是无用的(可能是违反直觉的)。我不想认为您提到的代码不正确,但通常会使用如下占位符实现退出:

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})
o = session.run([model.logits], feed_dict={model.inputs:X_test[i:i+batch_size], model.dropout_placeholder: 1.0})
在测试阶段,通过将辍学率设置为1.0禁用辍学:

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})
o = session.run([model.logits], feed_dict={model.inputs:X_test[i:i+batch_size], model.dropout_placeholder: 1.0})

有关辍学的更多信息,请查看。

如果仔细查看此函数的定义:

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)
它对每个LSTM单元的输出应用dropout函数,并随机将张量元素的某些百分比设置为零,您可以查看链接了解更多详细信息。根据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是一种正则化方法,在训练神经网络时非常有用,在验证和测试模式中应用它是无用的(可能是违反直觉的)。我不想认为您提到的代码不正确,但通常会使用如下占位符实现退出:

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})
o = session.run([model.logits], feed_dict={model.inputs:X_test[i:i+batch_size], model.dropout_placeholder: 1.0})
在测试阶段,通过将辍学率设置为1.0禁用辍学:

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})
o = session.run([model.logits], feed_dict={model.inputs:X_test[i:i+batch_size], model.dropout_placeholder: 1.0})
有关辍学的更多信息,请查看