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,如下图所示 :
rnn中的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.reshape()操作

tf.concat()

tf.concat()将Tensor矩阵按照某一维度连接, tf.concat(concat_dim, values, name=‘concat’)
第一个参数concat_dim:必须是一个数,表明在哪一维上连接
举例:
tf.concat()实例
tf.contrib.rnn下的函数介绍

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值