TensorFlow框架下的RNN实践小结

本文介绍如何使用TensorFlow的RNN API构建基础RNN、LSTM和GRU单元,并通过实例展示如何添加Dropout及搭建多层网络。此外,还提供了关于输入数据格式转换的建议。

截至目前,TensorFlow的RNN APIs还处于Draft阶段。不过据官方解释,RNN的相关API已经出现在Tutorials里了,大幅度的改动应该是不大可能,现在入手TF的RNN APIs风险应该是不大的。

目前TF的RNN APIs主要集中在tensorflow.models.rnn中的rnn和rnn_cell两个模块。其中,后者定义了一些常用的RNN cells,包括RNN和优化的LSTM、GRU等等;前者则提供了一些helper方法。

创建一个基础的RNN很简单:

1from tensorflow.models.rnn import rnn_cell
2cell = rnn_cell.BasicRNNCell(inputs, state)

创建一个LSTM或者GRU的cell?

1cell = rnn_cell.BasicLSTMCell(num_units)  #最最基础的,不带peephole。
2cell = rnn_cell.LSTMCell(num_units, input_size)  #可以设置peephole等属性。
3cell = rnn_cell.GRUCell(num_units)

调用呢?

1output, state = cell(input, state)

这样自己按timestep调用需要设置variable_scope的reuse属性为True,懒人怎么做,TF也给想好了:

1state = cell.zero_state(batch_size, dtype=tf.float32)
2outputs, states = rnn.rnn(cell, inputs, initial_state=state)

再懒一点:

1outputs, states = rnn.rnn(cell, inputs, dtype=tf.float32)

怕overfit,加个Dropout如何?

1cell = rnn_cell.DropoutWrapper(cell, input_keep_prob=0.5, output_keep_prob=0.5)

做个三层的带Dropout的网络?

1cell = rnn_cell.DropoutWrapper(cell, output_keep_prob=0.5)
2cell = rnn_cell.MultiRNNCell([cell] * 3)
3inputs = tf.nn.dropout(inputs, 0.5)  #给第一层单独加个Dropout。

一个坑——用rnn.rnn要按照timestep来转换一下输入数据,比如像这样:

1inputs = [tf.reshape(t, (input_dim[0], 1)) for in tf.split(1, input_dim[1], inputs)]

rnn.rnn()的输出也是对应每一个timestep的,如果只关心最后一步的输出,取outputs[-1]即可。

注意一下子返回值的dimension和对应关系,损失函数和其它情况没有大的区别。

目前饱受诟病的是TF本身还不支持Theano中scan()那样可以轻松实现的不定长输入的RNN,不过有人反馈说Theano中不定长训练起来还不如提前给inputs加个padding改成定长的训练快。

转载于:https://www.cnblogs.com/mfryf/p/7874742.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值