Tensorflow:低级LSTM实现

5

我正在寻找一个低级别的Tensorflow实现,用于RNN和LSTM单元。我已经实现了几个前馈网络,其中我使用了低级别的API。这帮助我很好地理解了人工神经网络的内部工作原理。我是否可以对RNN执行相同的操作,或者建议使用Tensorflow实现的LSTM单元(tf.nn.rnn_cell.BasicLSTMCell)? 我没有在Tensorflow中找到任何低级别的RNN实现。我该在哪里找到这样的低级别实现?Tensorflow是否专门为此设计?我应该从哪里开始?希望能在这里得到一些答案。

1个回答

2

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, :]

完整的示例请点击此处查看。

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的示例请参见此处

3)使用Numpy实现

如果您仍需要深入了解RNN的实现,请参见教程,该教程使用numpy实现了RNN。

4)Keras中的自定义RNN单元

请参见此处


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接