使用 LSTM logits 进行价值预测
Value prediction using LSTM logits
我正在查看 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
.
鉴于最终的逻辑,他们不应该固定并给出固定的预测吗?我错过了什么?
如果你仔细看一下这个函数的定义:
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 函数,tf.nn.dropout() and 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 是一种在训练神经网络时有用的正则化方法,在验证和测试模式下应用它是无用的(并且可能违反直觉)。我不想调用您提到的代码不正确,但通常会使用这样的占位符实现丢失:
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})
有关dropout的更多信息,请查看the original paper。
我正在查看 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
.
鉴于最终的逻辑,他们不应该固定并给出固定的预测吗?我错过了什么?
如果你仔细看一下这个函数的定义:
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 函数,tf.nn.dropout() and 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 是一种在训练神经网络时有用的正则化方法,在验证和测试模式下应用它是无用的(并且可能违反直觉)。我不想调用您提到的代码不正确,但通常会使用这样的占位符实现丢失:
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})
有关dropout的更多信息,请查看the original paper。