我正在使用下面的代码创建一个堆叠的LSTM模型。我有两个问题。首先,在下面的代码中,两个单元格的权重是否相同?第二,一般来说,当人们谈论堆叠的LSTM时,所有的细胞通常都共享权重吗?你知道吗
def lstm_cell(size, output_keep_prob):
cell = tf.nn.rnn_cell.LSTMCell(size)
return tf.nn.rnn_cell.DropoutWrapper(cell, output_keep_prob=output_keep_prob)
with tf.variable_scope("tech_lstm"):
tech_lstm_okp = tf.placeholder(tf.float64)
tech_lstm_cells = [lstm_cell(100, tech_lstm_okp) for _ in range(2)]
stkd_tech_lstm_cell = tf.contrib.rnn.MultiRNNCell(tech_lstm_cells)
stkd_tech_lstm_init = stkd_tech_lstm_cell.zero_state(batch_size, tf.float64)
stkd_tech_lstm_outputs, _ = tf.nn.dynamic_rnn(
stkd_tech_lstm_cell,
tech_data_windows,
initial_state=stkd_tech_lstm_init)
我想你误解了共享重量。每个不同的单元都有自己的内核和偏差值。共享权重的观点来自于将RNN看作是跨时间展开的前馈网络。如果每个时刻的权值不同,这就是一个前馈网络。共享权重意味着一个单元对所有给定的序列应用相同的内核和偏差。所以单元格不共享权重,但是如果你想问“是”,这些单元格是否按顺序运行第一个lstmcell给出一个输出,第二个lstmcell处理第一个lstm单元格的输出
只有在构建过程中在同一个
tf.variable_scope
中使用tf.get_variable
时,单元才会共享权重。一般来说,让堆叠的单元格共享权重是没有意义的,因此TensorFlow(特别是tf.nn.rnn_cell.MultiRNNCell
)将为您调用的每个tf.nn.rnn_cell.LSTMCell
创建不同的tf.variable_scope
。因此,如果我正确理解你的问题,答案是 (1) 是;(2)否要查看更多详细信息,请尝试以下代码:
您将在2个不同的
tf.variable_sope
中看到4个变量(每个单元1个内核和1个偏差)。你知道吗当运行时,堆叠的LSTM在每个时间步中共享权重,即堆叠的RNN在时间上共享权重,但在空间上不共享。你知道吗
相关问题 更多 >
编程相关推荐