tensorflow实战自学【六】

本文介绍了如何使用TensorFlow实现RNN,特别是LSTM(长短期记忆)网络。详细解析了相关函数,如tf.contrib.rnn.BasicLSTMCell、tf.contrib.rnn.DropoutWrapper等,以及RNN模型的构建过程,包括数据处理、网络结构和训练步骤。适合初学者了解RNN和LSTM在TensorFlow中的应用。
摘要由CSDN通过智能技术生成

RNN(循环神经网络)初步之LSTM(长短期记忆)

所用部分函数解读

tf.contrib.rnn.BasicLSTMCell(num_units,forget_bias=1.0,state_is_tuple=True,activation=None,reuse=None,name=None,dtype=None)

BasicLSTMCell类是最基本的LSTM循环神经网络单元。它不被允许cell clipping,projection layer,以及不能使用peep-hole connections。
num_units:int类型,LSTM单元中的神经元数量,即输出神经元数量。
forget_bias:float类型,偏置增加了忘记门,是为了减小在训练开始时忘记操作的范围。从CudnnLSTM训练的检查点(checkpoin)恢复时,必须手动设置为0.0。
state_is_tuple:如果为True,则接受和返回的是由c_state和m_state的2-tuple:(hidden_state,[cell_state,hidden_state]),其中m_state便为hidden_state;如果为False,则他们沿着列轴连接。后一种即将被弃用。
activation:内部状态的激活函数。默认为tanh
reuse:布尔类型,描述是否在现有范围中重用变量。如果不为True,并且现有范围已经具有给定变量,则会引发错误。
name:String类型,层的名称。具有相同名称的层将共享权重,但为了避免错误,在这种情况下需要reuse=True.
dtype:该层默认的数据类型。默认值为None表示使用第一个输入的类型。在call之前build被调用则需要该参数。

tf.contrib.rnn.DropoutWrapper(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)

所谓dropout,就是指网络中每个单元在每次有数据流入时以一定的概率(keep prob)正常工作,否则输出0值。这是是一种有效的正则化方法,可以有效防止过拟合。在rnn中使用dropout的方法和cnn不同,
cell:一个RNNCell,将要进行dropout的RNNCell层
input_keep_prob:unit Tensor 或者是介于0与1的float,输入保持率;若它为constant与1,则不对输入进行dropout。
output_keep_prob:unit Tensor 或者是介于0与1的float,输出保持率;若它为constant与1,则不对输出进行dropout。
state_keep_prob:unit Tensor 或者是介于0与1的float,输出保持率;若它为constant与1,则不对输出进行dropout。当cell处于output states时执行State dropout。
variational_recurrent:Python bool。若为True,则在每次运行调用时,进行相同的dropout pattern。如果设置了此参数,则必须提供input_size。
input_size: (可选参数) (可能是嵌套的tuple) TensorShape,包含输入用于通过DropoutWrapper的tensor的深度。当且仅当variational_recurrent = True且input_keep_prob < 1时才使用这个参数。

tf.nn.dropout(x,keep_prob,noise_shape=None,seed=None,name=None)

该函数用于计算dropout。使用概率keep_prob,输出按照1/keep_prob的比例放大输入元素,否则输出0。缩放是为了使预期的总和不变。默认情况下,每个元素都是独立保留或删除的。如果已指定noise_shape,则必须将其广播为x的形状,并且只有具有noise_shape[i] == shape(x)[i]的维度才作出独立决定。
例如,如果shape(x) = [k, l, m, n]并且noise_shape = [k, 1, 1, n],则每个批处理和通道组件将独立保存,并且每个行和列将保留或不保留在一起。
x:一个浮点型Tensor。
keep_prob:一个标量Tensor,它与x具有相同类型.保留每个元素的概率。
noise_shape:类型为int32的1维Tensor,表示随机产生的保持/丢弃标志的形状。
seed:一个Python整数。用于创建随机种子。
name:此操作的名称(可选)。

tf.contrib.rnn.MultiRNNCell(cells,state_is_tuple=True)

构建多重RNN
cells:RNNCells的list。
state_is_tuple:如果为True,接受和返回的states是n-tuples,其中n=len(cells),即将每层RNNCell的状态给组成一个n-tuple返回。如果为False,states是concatenated沿着列轴。后者即将弃用。
note:关于它的使用
下面这样直接用一个BasicLSTMCell复制是错误的,会导致各层共享权重

basic_cell = tf.nn.rnn_cell.BasicLSTMCell(rnn_unit)
multi_cell = tf.nn.rnn_cell.MultiRNNCell([basic_cell]*layer_num)

在新版本TensorFlow源码中可以看到,上面这样的写法会给出警告:

if len(set([id(cell) for cell in cells])) < len(cells):
    logging.log_first_n(logging.WARN,
                        "At least two cells provided to MultiRNNCell "
                        "are the same object and will share weights.", 1)

官方推荐的写法,使用列表生成器:

  num_units = [128, 64]
  cells = [BasicLSTMCell(num_units=n) for n in num_units]
  stacked_rnn_cell = MultiRNNCell(cells)

cell.zero_state

设置LSTM单元的初始化状态,返回[batch_size, 2*len(cells)],或者[batch_size, s]

tf.get_variable(name,shape=None,dtype=None,initializer=None,regularizer=None,trainable=True,collections=None,caching_device=None,partitioner=None,validate_shape=True,use_resource=None,custom_getter=None,constraint=None)

获取一个已经存在的变量或者创建一个新的变量。
name:新变量或现有变量的名称。
shape:新变量或现有变量的形状。
dtype:新变量或现有变量的类型(默认为DT_FLOAT)。
ininializer:如果创建了则用它来初始化变量。
regularizer:A(Tensor - > Tensor或None)函数;将它应用于新创建的变量的结果将添加到集合tf.GraphKeys.REGULARIZATION_LOSSES中,并可用于正则化。
trainable:如果为True,还将变量添加到图形集合GraphKeys.TRAINABLE_VARIABLES(参见tf.Variable)。
collections:要将变量添加到的图表集合列表。默认为[GraphKeys.GLOBAL_VARIABLES](参见tf.Variable)。
caching_device:可选的设备字符串或函数,描述变量应被缓存以供读取的位置。默认为Variable的设备。如果不是None,则在另一台设备上缓存。典型用法是在使用变量驻留的Ops的设备上进行缓存,以通过Switch和其他条件语句进行重复数据删除。
partitioner:可选callable,接受完全定义的TensorShape和要创建的Variable的dtype,并返回每个轴的分区列表(当前只能对一个轴进行分区࿰

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值