tensorflow中rnn内cell的添加操作

来源:互联网 发布:网络工程学什么 编辑:程序博客网 时间:2024/06/06 17:30

操作版本python 3.5 ,tensorflow version =1.1,本操作1.2也是可以的,但是1.0及其以下是有error的,如果是1.0以下那么此处的技术没有意义。 不清楚版本的可以在cmd下进行三步操作查看1 输入:python 2 输入: import tensorflow as tf  3输入:tf.__version__

正文:

rnn中的cell常用的有LSTM同意GRU,但是有时候我们需要堆叠多层cell或者需要自定义cell的初状态,即最开始时候的第一个cell的状态,我再此处进行以下演示:

1  构造placeholder,因为不构造后面的演示不会通过,所以我不是只给出关键部分,那样很多时候别人也不会明白,这也是现在很多代码无法运行的原因之一,不告知版本,不全部贴出来。

# 导入所需的包

import tensorflow as tffrom tensorflow.contrib.rnn import LSTMCell,MultiRNNCell,LSTMStateTuple,NASCell # 导入几个常用的cell注意:NASCell与LSTM相同(可以这么理解...其他的我没有研究)
# 定义rnn与inpute使用到的参数
num_units =16 # rnn 中每个cell的单元数量
batch_size =8 # 每次进入输入的truncated_series_length=16num_layers=3
state_placeholder = tf.placeholder(tf.float32, [num_layers, 2, batch_size, num_units])# 这一段的意思是堆叠3层cell, 因为是lstm所以cell的state有c与h因此第一个数字是2,第三个数字
# 是batch的数量也可以添None,最后一个是每个cell单元的内部的单元数量。
x = tf.placeholder(tf.float32, [None, truncated_series_length, 1]) # 这个就是输入的input,
states = tf.unstack(state_placeholder, axis=0) 这段代码的意思是将cell的state进行拆解,axis是按照那个维度拆解,0就是第一个维度num_layers,因此拆成3组,每组都是的
# shape都是(2,8,16)
rnn_tuple_state = tuple(   [LSTMStateTuple(states[idx][0], states[idx][1])     for idx in range(num_layers)])# 这几段就是创建3个cell每个cell中state的c与h都是states[idx][0]与states[idx][1]就是(batch_size,num_units)
# 下面就是测试了,记住tensorflow 1.1之后MultiRNNCell的每一层的cell都会有自己的参数,而不是都共享一组参数。
rnn_cells = tf.contrib.rnn.MultiRNNCell([LSTMCell(num_units) for _ in range(num_layers)], state_is_tuple = True)outputs, current_state = tf.nn.dynamic_rnn(rnn_cells, x,initial_state=rnn_tuple_state)print(current_state)