关于tf.nn.dynamic_rnn返回值详解
函数原型
tf.nn.dynamic_rnn( cell, inputs, sequence_length=None, initial_state=None, dtype=None, parallel_iterations=None, swap_memory=False, time_major=False, scope=None )
实例讲解:
importtensorflowastf
importnumpyasnp
n_steps=2
n_inputs=3
n_neurons=5
X=tf.placeholder(tf.float32,[None,n_steps,n_inputs])
basic_cell=tf.contrib.rnn.BasicRNNCell(num_units=n_neurons)
seq_length=tf.placeholder(tf.int32,[None])
outputs,states=tf.nn.dynamic_rnn(basic_cell,X,dtype=tf.float32,
sequence_length=seq_length)
init=tf.global_variables_initializer()
X_batch=np.array([
#step0step1
[[0,1,2],[9,8,7]],#instance1
[[3,4,5],[0,0,0]],#instance2(paddedwithzerovectors)
[[6,7,8],[6,5,4]],#instance3
[[9,0,1],[3,2,1]],#instance4
])
seq_length_batch=np.array([2,1,2,2])
withtf.Session()assess:
init.run()
outputs_val,states_val=sess.run(
[outputs,states],feed_dict={X:X_batch,seq_length:seq_length_batch})
print("outputs_val.shape:",outputs_val.shape,"states_val.shape:",states_val.shape)
print("outputs_val:",outputs_val,"states_val:",states_val)
loginfo:
outputs_val.shape:(4,2,5)states_val.shape:(4,5) outputs_val: [[[0.53073734-0.61281306-0.54375170.7320347-0.6109526] [0.999969360.99990636-0.98671810.99726075-0.99999976]] [[0.99315840.5877845-0.91004120.988892-0.9982337] [0.0.0.0.0.]] [[0.999923170.96815354-0.9851010.9995968-0.9999936] [0.999481440.9998127-0.574938060.91015154-0.99998355]] [[0.999992550.99989290.267327850.36024097-0.99991137] [0.988752540.99223270.65057340.4732064-0.9957567]]] states_val: [[0.999969360.99990636-0.98671810.99726075-0.99999976] [0.99315840.5877845-0.91004120.988892-0.9982337] [0.999481440.9998127-0.574938060.91015154-0.99998355] [0.988752540.99223270.65057340.4732064-0.9957567]]
首先输入X是一个[batch_size,step,input_size]=[4,2,3]的tensor,注意我们这里调用的是BasicRNNCell,只有一层循环网络,outputs是最后一层每个step的输出,它的结构是[batch_size,step,n_neurons]=[4,2,5],states是每一层的最后那个step的输出,由于本例中,我们的循环网络只有一个隐藏层,所以它就代表这一层的最后那个step的输出,因此它和step的大小是没有关系的,我们的X有4个样本组成,输出神经元大小n_neurons是5,因此states的结构就是[batch_size,n_neurons]=[4,5],最后我们观察数据,states的每条数据正好就是outputs的最后一个step的输出。
下面我们继续讲解多个隐藏层的情况,这里是三个隐藏层,注意我们这里仍然是调用BasicRNNCell
importtensorflowastf
importnumpyasnp
n_steps=2
n_inputs=3
n_neurons=5
n_layers=3
X=tf.placeholder(tf.float32,[None,n_steps,n_inputs])
seq_length=tf.placeholder(tf.int32,[None])
layers=[tf.contrib.rnn.BasicRNNCell(num_units=n_neurons,
activation=tf.nn.relu)
forlayerinrange(n_layers)]
multi_layer_cell=tf.contrib.rnn.MultiRNNCell(layers)
outputs,states=tf.nn.dynamic_rnn(multi_layer_cell,X,dtype=tf.float32,sequence_length=seq_length)
init=tf.global_variables_initializer()
X_batch=np.array([
#step0step1
[[0,1,2],[9,8,7]],#instance1
[[3,4,5],[0,0,0]],#instance2(paddedwithzerovectors)
[[6,7,8],[6,5,4]],#instance3
[[9,0,1],[3,2,1]],#instance4
])
seq_length_batch=np.array([2,1,2,2])
withtf.Session()assess:
init.run()
outputs_val,states_val=sess.run(
[outputs,states],feed_dict={X:X_batch,seq_length:seq_length_batch})
print("outputs_val.shape:",outputs,"states_val.shape:",states)
print("outputs_val:",outputs_val,"states_val:",states_val)
loginfo:
outputs_val.shape:
Tensor("rnn/transpose_1:0",shape=(?,2,5),dtype=float32)
states_val.shape:
(,
,
)
outputs_val:
[[[0.0.0.0.0.]
[0.0.187407420.0.29975180.]]
[[0.0.072221440.0.115515740.]
[0.0.0.0.0.]]
[[0.0.134633840.0.215342240.]
[0.037026040.184432460.0.345393660.]]
[[0.0.545110940.0.87188640.]
[0.53821220.0.043964250.40402630.]]]
states_val:
(array([[0.,0.83723307,0.,0.,2.8518028],
[0.,0.1996038,0.,0.,1.5456247],
[0.,1.1372368,0.,0.,0.832613],
[0.,0.7904129,2.4675028,0.,0.36980057]],
dtype=float32),
array([[0.6524607,0.,0.,0.,0.],
[0.25143963,0.,0.,0.,0.],
[0.5010576,0.,0.,0.,0.],
[0.,0.3166597,0.4545995,0.,0.]],
dtype=float32),
array([[0.,0.18740742,0.,0.2997518,0.],
[0.,0.07222144,0.,0.11551574,0.],
[0.03702604,0.18443246,0.,0.34539366,0.],
[0.5382122,0.,0.04396425,0.4040263,0.]],
dtype=float32))
我们说过,outputs是最后一层的输出,即[batch_size,step,n_neurons]=[4,2,5]
states是每一层的最后一个step的输出,即三个结构为[batch_size,n_neurons]=[4,5]的tensor
继续观察数据,states中的最后一个array,正好是outputs的最后那个step的输出
下面我们继续讲当由BasicLSTMCell构造单元工厂的时候,只讲多层的情况,我们只需要将上面的BasicRNNCell替换成BasicLSTMCell就行了,打印信息如下:
outputs_val.shape:
Tensor("rnn/transpose_1:0",shape=(?,2,5),dtype=float32)
states_val.shape:
(LSTMStateTuple(c=,
h=),
LSTMStateTuple(c=,
h=),
LSTMStateTuple(c=,
h=))
outputs_val:
[[[1.2949290e-040.0000000e+002.7623639e-040.0000000e+000.0000000e+00]
[9.4675866e-050.0000000e+002.0214770e-040.0000000e+000.0000000e+00]]
[[4.3100454e-064.2123037e-071.4312843e-060.0000000e+000.0000000e+00]
[0.0000000e+000.0000000e+000.0000000e+000.0000000e+000.0000000e+00]]
[[0.0000000e+000.0000000e+000.0000000e+000.0000000e+000.0000000e+00]
[0.0000000e+000.0000000e+000.0000000e+000.0000000e+000.0000000e+00]]
[[0.0000000e+000.0000000e+000.0000000e+000.0000000e+000.0000000e+00]
[0.0000000e+000.0000000e+000.0000000e+000.0000000e+000.0000000e+00]]]
states_val:
(LSTMStateTuple(
c=array([[0.,0.,0.04676079,0.04284539,0.],
[0.,0.,0.0115245,0.,0.],
[0.,0.,0.,0.,0.],
[0.,0.,0.,0.,0.]],
dtype=float32),
h=array([[0.,0.,0.00035096,0.04284406,0.],
[0.,0.,0.00142574,0.,0.],
[0.,0.,0.,0.,0.],
[0.,0.,0.,0.,0.]],
dtype=float32)),
LSTMStateTuple(
c=array([[0.0000000e+00,1.0477135e-02,4.9871090e-03,8.2785974e-04,
0.0000000e+00],
[0.0000000e+00,2.3306280e-04,0.0000000e+00,9.9445322e-05,
5.9535629e-05],
[0.0000000e+00,0.0000000e+00,0.0000000e+00,0.0000000e+00,
0.0000000e+00],
[0.0000000e+00,0.0000000e+00,0.0000000e+00,0.0000000e+00,
0.0000000e+00]],dtype=float32),
h=array([[0.00000000e+00,5.23016974e-03,2.47756205e-03,4.11730434e-04,
0.00000000e+00],
[0.00000000e+00,1.16522635e-04,0.00000000e+00,4.97301044e-05,
2.97713632e-05],
[0.00000000e+00,0.00000000e+00,0.00000000e+00,0.00000000e+00,
0.00000000e+00],
[0.00000000e+00,0.00000000e+00,0.00000000e+00,0.00000000e+00,
0.00000000e+00]],dtype=float32)),
LSTMStateTuple(
c=array([[1.8937115e-04,0.0000000e+00,4.0442235e-04,0.0000000e+00,
0.0000000e+00],
[8.6200516e-06,8.4243663e-07,2.8625946e-06,0.0000000e+00,
0.0000000e+00],
[0.0000000e+00,0.0000000e+00,0.0000000e+00,0.0000000e+00,
0.0000000e+00],
[0.0000000e+00,0.0000000e+00,0.0000000e+00,0.0000000e+00,
0.0000000e+00]],dtype=float32),
h=array([[9.4675866e-05,0.0000000e+00,2.0214770e-04,0.0000000e+00,
0.0000000e+00],
[4.3100454e-06,4.2123037e-07,1.4312843e-06,0.0000000e+00,
0.0000000e+00],
[0.0000000e+00,0.0000000e+00,0.0000000e+00,0.0000000e+00,
0.0000000e+00],
[0.0000000e+00,0.0000000e+00,0.0000000e+00,0.0000000e+00,
0.0000000e+00]],dtype=float32)))
我们先看看LSTM单元的结构
如果您不查看框内的内容,LSTM单元看起来与常规单元格完全相同,除了它的状态分为两个向量:h(t)和c(t)。你可以将h(t)视为短期状态,将c(t)视为长期状态。
因此我们的states包含三个LSTMStateTuple,每一个表示每一层的最后一个step的输出,这个输出有两个信息,一个是h表示短期记忆信息,一个是c表示长期记忆信息。维度都是[batch_size,n_neurons]=[4,5],states的最后一个LSTMStateTuple中的h就是outputs的最后一个step的输出
以上这篇关于tf.nn.dynamic_rnn返回值详解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。