Tensorflow:底层LSTM实现

时间:2019-01-20 09:27:14

标签: python tensorflow lstm recurrent-neural-network

我正在使用Tensorflow中的LSTM单元寻找RNN的底层实现。我已经实现了一些使用低级API的前馈网络。这对我了解ANN的内部运作很有帮助。对于RNN,我可以这样做吗?还是建议使用LSTM单元(tf.nn.rnn_cell.BasicLSTMCell)的Tensorflow实现?我在Tensorflow中没有找到RNN的任何底层实现。在哪里可以找到这样的底层实现? Tensorflow完全为此设计吗?我从哪里开始? 我希望这里可以回答我的一些问题

1 个答案:

答案 0 :(得分:1)

1)使用tf.scan

可以使用tf.scan函数来实现RNN的低级实现。例如,对于SimpleRNN,其实现将类似于:

# our RNN variables
Wx = tf.get_variable(name='Wx', shape=[embedding_size, rnn_size])
Wh = tf.get_variable(name='Wh', shape=[rnn_size, rnn_size])
bias_rnn = tf.get_variable(name='brnn', initializer=tf.zeros([rnn_size]))


# single step in RNN
# simpleRNN formula is `tanh(WX+WH)`
def rnn_step(prev_hidden_state, x):
    return tf.tanh(tf.matmul(x, Wx) + tf.matmul(prev_hidden_state, Wh) + bias_rnn)

# our unroll function
# notice that our inputs should be transpose
hidden_states = tf.scan(fn=rnn_step,
                        elems=tf.transpose(embed, perm=[1, 0, 2]),
                        initializer=tf.zeros([batch_size, rnn_size]))

# covert to previous shape
outputs = tf.transpose(hidden_states, perm=[1, 0, 2])

# extract last hidden
last_rnn_output = outputs[:, -1, :]

请参见完整示例here

2)使用AutoGraph

tf.scan是一个for循环,您也可以实现它Auto-graph API:

from tensorflow.python import autograph as ag

@ag.convert()
def f(x):
# ...
for ch in chars:
      cell_output, (state, output) = cell.call(ch, (state, output))
      hidden_outputs.append(cell_output)
hidden_outputs = autograph.stack(hidden_outputs)
# ...

请参阅带有签名API here的完整示例。

3)用麻布的工具

如果您仍然需要深入了解实现RNN,请参阅this教程,该教程以numpy实现RNN。

4)Keras中的自定义RNN单元格

请参见here

相关问题