tensorflow中循环神经网络搭建时常用的函数介绍
tf.contrib.rnn.BasicLSTMCell()函数
tf.contrib.rnn.BasicLSTMCell()函数的使用
__init__(
num_units,
forget_bias=1.0,
state_is_tuple=True,
activation=None,
reuse=None,
name=None,
dtype=None
)
参数说明:
num_units: int类型,LSTM单元中的神经元数量,即输出神经元数量
forget_bias: float类型,偏置增加了忘记门。从CudnnLSTM训练的检查点(checkpoin)恢复时,必须手动设置为0.0。
state_is_tuple: 如果为True,则接受和返回的状态是c_state和m_state的2-tuple;如果为False,则他们沿着列轴连接。后一种即将被弃用。
activation:内部状态的激活函数。默认为tanh
reuse: 布尔类型,描述是否在现有范围中重用变量。如果不为True,并且现有范围已经具有给定变量,则会引发错误。
name: String类型,层的名称。具有相同名称的层将共享权重,但为了避免错误,在这种情况下需要reuse=True.
dtype:该层默认的数据类型。默认值为None表示使用第一个输入的类型。在call之前build被调用则需要该参数。
tf.contrinb.rnn.GRUCell
GRU是LSTM的一个变体,当然LSTM还有很多变体,相对于LSTM而言,GRU只有两个门了,分别为更新门和重置门,即图中的Zt和Rt。更新门用于控制前一时刻的状态信息被带入到当前状态中的程度,更新门的值越大说明前一时刻的状态信息带入越多。重置门用于控制忽略前一时刻的状态信息的程度,重置门的值越小说明忽略得越多。
初始化函数:
__init__(
num_units,
activation=None,
reuse=None,
kernel_initializer=None,
bias_initializer=None,
name=None,
dtype=None,
**kwargs
)
函数参数:
num_units: int型, 网络单元的个数,即隐藏层的节点数.
activation: 激活函数,默认为tanh.
reuse: (可选)bool型,是否重用已经存在scope中的变量. 如果为False, 而且已经存在的scope中已经有同一个变量,则会出错.
kernel_initializer: (可选) 权重和映射矩阵的初始化器.
bias_initializer: (可选) 偏置的初始化器.
name: String型, 网络层的名字,拥有相同名字的网络层将共享权重,但是为了避免出错,这种情况需要设置reuse=True.
dtype:网络层的默认类型,默认为None,意味着使用第一次输入的类型.
**kwargs: Dict型, 一般网络层属性的关键字命名属性.
tf.contrib.rnn.DropoutWrapper()函数
tf.contrib.rnn.DropoutWrapper()函数
__init__(
cell,
input_keep_prob=1.0,
output_keep_prob=1.0,
state_keep_prob=1.0,
variational_recurrent=False,
input_size=None,
dtype=None,
seed=None,
dropout_state_filter_visitor=None
)
在使用tf.nn.rnn_cell.DropoutWrapper时,同样有一些参数,例如input_keep_prob,output_keep_prob等,分别控制输入和输出的dropout概率,很好理解。
在rnn中进行dropout时,对于rnn的部分不进行dropout,也就是说从t-1时候的状态传递到t时刻进行计算时,这个中间不进行memory的dropout;仅在同一个t时刻中,多层cell之间传递信息的时候进行dropout,如下图所示 :
上图中,t-2时刻的输入xt−2首先传入第一层cell,这个过程有dropout,但是从t−2时刻的第一层cell传到t−1,t,t+1的第一层cell这个中间都不进行dropout。再从t+1时候的第一层cell向同一时刻内后续的cell传递时,这之间又有dropout了。
从官方文档中看到,它有input_keep_prob和output_keep_prob,也就是说裹上这个DropoutWrapper之后,如果我希望是input传入这个cell时dropout掉一部分input信息的话,就设置input_keep_prob,那么传入到cell的就是部分input;如果我希望这个cell的output只部分作为下一层cell的input的话,就定义output_keep_prob。
备注:Dropout只能是层与层之间(输入层与LSTM1层、LSTM1层与LSTM2层)的Dropout;同一个层里面,T时刻与T+1时刻是不会Dropout的。
tf.contrib.rnn.MultiRNNCell()函数
TensorFlow中,tf.nn.rnn_cell.BasicRNNCell和tf.nn.rnn_cell.Basic LSTM是循环神经网络的两个重要基础类;tf.nn.dynamic_rnn是用来一次执行多个时间步,tf.nn.rnn_cell.MultiRNNCell用来生成多层RNN网络。详情请见https://blog.csdn.net/starzhou/article/details/77848156。下面是一个用tf.nn.rnn_cell.MultiRNNCell实现的两层的RNN神经网络,用tf.nn.dynamic_rnn来一次执行多个时间步。
import tensorflow as tf;
import numpy as np;
X = tf.random_normal(shape=[3,5,6], dtype=tf.float32)#3为batch的size,5为时间步长,6为每个时间步的尺寸
X = tf.reshape(X, [-1, 5, 6])
rnn_layers =[tf.nn.rnn_cell.BasicRNNCell(size,reuse=True) for size in [128, 256]]#分别为每层RNN的神经元个数
multi_rnn_cell = tf.nn.rnn_cell.MultiRNNCell(rnn_layers)
state = multi_rnn_cell.zero_state(3, tf.float32)
output, state = tf.nn.dynamic_rnn(multi_rnn_cell, X, initial_state=state, time_major=False)
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
print(output.get_shape())
print(sess.run(state))
tf.nn.dynamic_rnn()函数
tf.nn.dynamic_rnn()函数解析
tf.nn.dynamic_rnn()的使用和理解
tf.nn.dynamic_rnn()产生两个输出outputs, last_states,其中outputs返回的是最后一层每个step的输出,其shape是[batch_size, step, lstmUnits] ,last_states是最后一层最后一个step的输出,shape是[batch_size, lstmUnits]。
tf.reshape()操作
tf.concat()
tf.concat()将Tensor矩阵按照某一维度连接, tf.concat(concat_dim, values, name=‘concat’)
第一个参数concat_dim:必须是一个数,表明在哪一维上连接
举例:
tf.concat()实例
tf.contrib.rnn下的函数介绍