如果LSTM单元由相同的功能创建,它们会共享权重吗?

时间:2019-02-28 17:19:25

标签: python tensorflow lstm

我正在使用下面的代码创建一个堆叠的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)

2 个答案:

答案 0 :(得分:0)

我认为您误解了共享的权重。每个不同的单元都有自己的内核和偏差值。共享权重的观点来自对RNN的思考,因为前馈网络会随着时间的推移展开。如果权重在每个时刻都不同,那么这将只是一个前馈网络。权重共享意味着一个单元对所有给定序列应用相同的内核和偏差。因此,单元不共享权重,但是如果您想询问是,这些单元是否按顺序运行?第一个lstmcell提供输出,第二个lstmcell处理第一个lstm单元输出

答案 1 :(得分:0)

仅当单元在构建过程中在同一tf.get_variable中使用tf.variable_scope时,它们才共享权重。通常,让堆叠的单元共享权重是没有意义的,因此TensorFlow(特别是tf.nn.rnn_cell.MultiRNNCell)会为您调用的每个tf.variable_scope创建不同的tf.nn.rnn_cell.LSTMCell。因此,如果我正确理解了您的问题,答案是 (1)是; (2)不。

要查看更多详细信息,请尝试以下代码:

import tensorflow as tf

cells = [tf.nn.rnn_cell.LSTMCell(100) for _ in range(2)]
multi_rnn_cells = tf.nn.rnn_cell.MultiRNNCell(cells)

batch_size, max_time, dim = 1, 10, 2
rnn_inputs = tf.zeros(shape=(batch_size, max_time, dim))
dynamic_rnn = tf.nn.dynamic_rnn(multi_rnn_cells, rnn_inputs, dtype=tf.float32)

for variable in tf.trainable_variables(): print(variable)

您将在2个不同的tf.variable_sope中看到4个变量(每个单元1个内核和1个偏差)。

运行时,堆叠的LSTM在每个时间步均共享权重,即堆叠的RNN在时间上而非空间上共享权重。