2016-08-25 50 views
3
堆栈LSTM层

我有什么是下面的,我相信这是一个隐藏LSTM层的网络:如何使用TensorFlow

# Parameters 
learning rate = 0.001 
training_iters = 100000 
batch_size = 128 
display_step = 10 

# Network Parameters 
n_input = 13 
n_steps = 10 
n_hidden = 512 
n_classes = 13 

# tf Graph input 
x = tf.placeholder("float", [None, n_steps, n_input]) 
y = tf.placeholder("float", [None, n_classes]) 

# Define weights 
weights = { 
    'out' : tf.Variable(tf.random_normal([n_hidden, n_classes])) 
} 
biases = { 
    'out' : tf.Variable(tf.random_normal([n_classes])) 
} 

不过,我尝试使用TensorFlow预测构建LSTM网络能量消耗。我一直在寻找一个很好的例子,但我找不到任何带有2个隐藏LSTM图层的模型。这里,我想构建模型:

1输入层, 1个输出层, 2隐藏LSTM层(在每个512元), 时间步骤(序列长度):10

莫非任何人指导我使用TensorFlow来构建这个? (从定义权重,构建输入形状,训练,预测,优化器或成本函数的使用等),任何帮助将不胜感激。

非常感谢你提前!

回答

5

下面是我在具有GRU单元的翻译模型中如何做到这一点。您可以用LSTM替换GRU。只需使用tf.nn.rnn_cell.MultiRNNCell和它应该包装的多个单元的列表就可以了。在下面的代码中,我手动展开它,但您也可以将它传递给tf.nn.dynamic_rnntf.nn.rnn

y = input_tensor 
with tf.variable_scope('encoder') as scope: 
    rnn_cell = rnn.MultiRNNCell([rnn.GRUCell(1024) for _ in range(3)]) 
    state = tf.zeros((BATCH_SIZE, rnn_cell.state_size)) 
    output = [None] * TIME_STEPS 
    for t in reversed(range(TIME_STEPS)): 
     y_t = tf.reshape(y[:, t, :], (BATCH_SIZE, -1)) 
     output[t], state = rnn_cell(y_t, state) 
     scope.reuse_variables() 
    y = tf.pack(output, 1) 
+0

感谢您的回答。我是否还需要将隐藏层1中的变量(参数)初始化为隐藏层2,还是需要内部处理? – subbie

+0

LSTM的变量在类中使用时会被初始化。看看源代码是非常有用的。 – chasep255

+0

我看到LSTM的四个门的变量被初始化了,但是不应该有从第一个隐藏层到第二个参数的参数?如果MultiRNNCell将参数从一个隐藏的参数初始化到另一个隐藏参数,这将是有意义的。 – subbie

2

首先,你需要一些占位符,把你的训练数据(一个批次)

x_input = tf.placeholder(tf.float32, [batch_size, truncated_series_length, 1]) 
y_output = tf.placeholder(tf.float32, [batch_size, truncated_series_length, 1]) 

一个LSTM需要的状态,它由两个部分组成,隐藏的状态和电池状态,很不错这里指导:https://arxiv.org/pdf/1506.00019.pdf。对于LSTM中的每个图层,您都有一个单元格状态和一个隐藏状态。

问题是,Tensorflow将此存储在LSTMStateTuple中,您无法将其发送到占位符。所以,你需要将其存储在一个张量,然后把它解压到一个元组:

state_placeholder = tf.placeholder(tf.float32, [num_layers, 2, batch_size, state_size]) 

l = tf.unpack(state_placeholder, axis=0) 
rnn_tuple_state = tuple(
    [tf.nn.rnn_cell.LSTMStateTuple(l[idx][0], l[idx][1]) 
    for idx in range(num_layers)] 
) 

然后你可以使用内置的Tensorflow API来创建堆叠LSTM层。

cell = tf.nn.rnn_cell.LSTMCell(state_size, state_is_tuple=True) 
cell = tf.nn.rnn_cell.MultiRNNCell([cell]*num_layers, state_is_tuple=True) 
outputs, state = tf.nn.dynamic_rnn(cell, x_input, initial_state=rnn_tuple_state) 

从这里你与输出继续计算logits再损失关于y_inputs

然后运行每批与sess.run -command,被截断的反向传播(这里http://r2rt.com/styles-of-truncated-backpropagation.html很好的解释)

init_state = np.zeros((num_layers, 2, batch_size, state_size)) 

...current_state... = sess.run([...state...], feed_dict={x_input:batch_in, state_placeholder:current_state ...}) 
current_state = np.array(current_state) 

你将不得不再次喂养它之前的状态转换为numpy阵列。

也许最好是使用像Tflearn或Keras的图书馆呢?

+0

不想编辑,因为它取决于您使用的tensorflow版本:但似乎tf.unpack已更改为tf.unstack – vanilla