tensorflow中rnn内cell的添加操作

操作版本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 tf
from 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)



RNN改成biRNN可以通过在RNN层前加一个双向层来实现。下面是一个使用TensorFlow实现biRNN路径学习训练的示例代码: ```python import tensorflow as tf # 定义输入和输出的维度 num_input = 28 timesteps = 28 num_hidden = 128 num_classes = 10 # 定义输入占位符 X = tf.placeholder("float", [None, timesteps, num_input]) Y = tf.placeholder("float", [None, num_classes]) # 定义双向RNN层 fw_cell = tf.contrib.rnn.BasicLSTMCell(num_hidden, forget_bias=1.0) bw_cell = tf.contrib.rnn.BasicLSTMCell(num_hidden, forget_bias=1.0) outputs, _ = tf.nn.bidirectional_dynamic_rnn(fw_cell, bw_cell, X, dtype=tf.float32) # 将双向RNN的输出拼接起来 output = tf.concat(outputs, 2) # 定义输出层 weight = tf.Variable(tf.random_normal([2*num_hidden, num_classes])) bias = tf.Variable(tf.random_normal([num_classes])) output = tf.transpose(output, [1, 0, 2]) last = tf.gather(output, int(output.get_shape()[0])-1) prediction = tf.matmul(last, weight) + bias # 定义损失函数和优化器 loss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits=prediction, labels=Y)) optimizer = tf.train.AdamOptimizer(learning_rate=0.01).minimize(loss) # 定义准确率 correct_prediction = tf.equal(tf.argmax(prediction, 1), tf.argmax(Y, 1)) accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32)) # 训练模型 with tf.Session() as sess: sess.run(tf.global_variables_initializer()) for i in range(1000): batch_x, batch_y = mnist.train.next_batch(128) batch_x = batch_x.reshape((128, timesteps, num_input)) sess.run(optimizer, feed_dict={X: batch_x, Y: batch_y}) if i % 100 == 0: acc = sess.run(accuracy, feed_dict={X: batch_x, Y: batch_y}) loss_value = sess.run(loss, feed_dict={X: batch_x, Y: batch_y}) print("Iter " + str(i) + ", Minibatch Loss= " + \ "{:.6f}".format(loss_value) + ", Training Accuracy= " + \ "{:.5f}".format(acc)) ``` 在这个代码,我们添加了一个双向RNN层,并将其输出拼接起来作为输出层的输入。其他部分与标准的RNN路径学习训练的代码类似。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值