- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章关于tf.nn.dynamic_rnn返回值详解由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
函数原型 。
1
2
3
4
5
6
7
8
9
10
11
|
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
)
|
实例讲解:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
import
tensorflow as tf
import
numpy as np
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([
# step 0 step 1
[[
0
,
1
,
2
], [
9
,
8
,
7
]],
# instance 1
[[
3
,
4
,
5
], [
0
,
0
,
0
]],
# instance 2 (padded with zero vectors)
[[
6
,
7
,
8
], [
6
,
5
,
4
]],
# instance 3
[[
9
,
0
,
1
], [
3
,
2
,
1
]],
# instance 4
])
seq_length_batch
=
np.array([
2
,
1
,
2
,
2
])
with tf.Session() as sess:
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)
|
log info
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
outputs_val.shape: (
4
,
2
,
5
) states_val.shape: (
4
,
5
)
outputs_val:
[[[
0.53073734
-
0.61281306
-
0.5437517
0.7320347
-
0.6109526
]
[
0.99996936
0.99990636
-
0.9867181
0.99726075
-
0.99999976
]]
[[
0.9931584
0.5877845
-
0.9100412
0.988892
-
0.9982337
]
[
0.
0.
0.
0.
0.
]]
[[
0.99992317
0.96815354
-
0.985101
0.9995968
-
0.9999936
]
[
0.99948144
0.9998127
-
0.57493806
0.91015154
-
0.99998355
]]
[[
0.99999255
0.9998929
0.26732785
0.36024097
-
0.99991137
]
[
0.98875254
0.9922327
0.6505734
0.4732064
-
0.9957567
]]]
states_val:
[[
0.99996936
0.99990636
-
0.9867181
0.99726075
-
0.99999976
]
[
0.9931584
0.5877845
-
0.9100412
0.988892
-
0.9982337
]
[
0.99948144
0.9998127
-
0.57493806
0.91015154
-
0.99998355
]
[
0.98875254
0.9922327
0.6505734
0.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 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
|
import
tensorflow as tf
import
numpy as np
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)
for
layer
in
range
(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([
# step 0 step 1
[[
0
,
1
,
2
], [
9
,
8
,
7
]],
# instance 1
[[
3
,
4
,
5
], [
0
,
0
,
0
]],
# instance 2 (padded with zero vectors)
[[
6
,
7
,
8
], [
6
,
5
,
4
]],
# instance 3
[[
9
,
0
,
1
], [
3
,
2
,
1
]],
# instance 4
])
seq_length_batch
=
np.array([
2
,
1
,
2
,
2
])
with tf.Session() as sess:
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)
|
log info
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
|
outputs_val.shape:
Tensor(
"rnn/transpose_1:0"
, shape
=
(?,
2
,
5
), dtype
=
float32)
states_val.shape:
(<tf.Tensor
'rnn/while/Exit_3:0'
shape
=
(?,
5
) dtype
=
float32>,
<tf.Tensor
'rnn/while/Exit_4:0'
shape
=
(?,
5
) dtype
=
float32>,
<tf.Tensor
'rnn/while/Exit_5:0'
shape
=
(?,
5
) dtype
=
float32>)
outputs_val:
[[[
0.
0.
0.
0.
0.
]
[
0.
0.18740742
0.
0.2997518
0.
]]
[[
0.
0.07222144
0.
0.11551574
0.
]
[
0.
0.
0.
0.
0.
]]
[[
0.
0.13463384
0.
0.21534224
0.
]
[
0.03702604
0.18443246
0.
0.34539366
0.
]]
[[
0.
0.54511094
0.
0.8718864
0.
]
[
0.5382122
0.
0.04396425
0.4040263
0.
]]]
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就行了,打印信息如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
|
outputs_val.shape:
Tensor(
"rnn/transpose_1:0"
, shape
=
(?,
2
,
5
), dtype
=
float32)
states_val.shape:
(LSTMStateTuple(c
=
<tf.Tensor
'rnn/while/Exit_3:0'
shape
=
(?,
5
) dtype
=
float32>,
h
=
<tf.Tensor
'rnn/while/Exit_4:0'
shape
=
(?,
5
) dtype
=
float32>),
LSTMStateTuple(c
=
<tf.Tensor
'rnn/while/Exit_5:0'
shape
=
(?,
5
) dtype
=
float32>,
h
=
<tf.Tensor
'rnn/while/Exit_6:0'
shape
=
(?,
5
) dtype
=
float32>),
LSTMStateTuple(c
=
<tf.Tensor
'rnn/while/Exit_7:0'
shape
=
(?,
5
) dtype
=
float32>,
h
=
<tf.Tensor
'rnn/while/Exit_8:0'
shape
=
(?,
5
) dtype
=
float32>))
outputs_val:
[[[
1.2949290e
-
04
0.0000000e
+
00
2.7623639e
-
04
0.0000000e
+
00
0.0000000e
+
00
]
[
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
]
[
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
0.0000000e
+
00
0.0000000e
+
00
0.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返回值详解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我.
原文链接:https://blog.csdn.net/junjun150013652/article/details/81331448 。
最后此篇关于关于tf.nn.dynamic_rnn返回值详解的文章就讲到这里了,如果你想了解更多关于关于tf.nn.dynamic_rnn返回值详解的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我试图在长字符序列中标记字母。数据的固有结构要求我使用双向方法。 此外基于on this idea我需要在每个时间步访问隐藏状态,而不仅仅是最后一个。 为了尝试这个想法,我使用了固定长度的方法。我目前
我目前正在使用 tf.Dynamic RNN 构建文本分类模型。我的输入长度不同,因此我将输入填充为相同(最大)长度。 我在 tf.nn.dynamic_rnn 中使用了 sequence_lengt
似乎 tf.nn.dynamic_rnn 已被弃用: Warning: THIS FUNCTION IS DEPRECATED. It will be removed in a future vers
我的问题是关于 TensorFlow 方法 tf.nn.dynamic_rnn。它返回每个时间步的输出和最终状态。 我想知道返回的最终状态是最大序列长度的细胞状态,还是由 sequence_lengt
我想加速我的 LSTM 网络,但是当我将它用于 OCR(其中序列具有可变长度)时,我不能使用普通的 LSTM 实现。这就是我使用“tf.nn.dynamic_rnn”的原因。 基于 tensorflo
我正在尝试构建 CNN + RNN 模型,但收到以下错误。任何帮助将不胜感激。 fc2 has shape (?,4096) cell = tf.contrib.rnn.BasicLSTMCell(s
在tensorflow中,tf.nn.static_rnn和tf.nn.dynamic_rnn有什么区别,什么时候用? 两者都采用一个 sequence_length 参数,使计算适应输入的实际长度;
对于单个的 RNNCell , 使用色的 call 函数进行运算时 ,只是在序列时间上前进了一步 。 如使用 x1、 ho 得到此h1, 通过 x2 、 h1 得到 h2 等
我无法理解 tf.nn.dynamic_rnn 的输出 tensorflow 函数。该文档仅说明输出的大小,但并未说明每行/列的含义。从文档: outputs: The RNN output Tens
tensorflow.nn.dynamic_rnn给定 cell 创建一个循环神经网络,它是 RNNCell 的一个实例,并返回一对包含: outputs:RNN 输出张量 state:最终状态 这是
我有一个形状为 [batch, None, dim] 的 3-D 张量,其中第二维(即时间步长)是未知的。我使用 dynamic_rnn 来处理此类输入,如以下代码片段所示: import numpy
我正在尝试使用 tf.nn.dynamic_rnn 在 TensorFlow 0.9.0 中使用词嵌入和递归神经网络编写语言模型。图操作,但我不明白input是怎么回事张量是结构化的。 假设我有一个包
我想保存我的 LSTM 的最终状态,以便在我恢复模型时包含它并可用于预测。如下所述,当我使用 tf.assign 时,Saver 只知道最终状态。但是,这会引发错误(也在下面解释)。 在训练期间,我总
我正在尝试使用低级 API tf.nn.raw_rnn 复制 tf.nn.dynamic_rnn 的行为。为此,我使用相同的数据 block 、设置随机种子并使用相同的 hparams 来创建单元格和
我想构建一个用于回归的玩具 LSTM 模型。 This不错的教程对于初学者来说已经太复杂了。 给定一个长度为 time_steps 的序列,预测下一个值。考虑 time_steps=3 和序列: ar
根据Tensorflow官网,(https://www.tensorflow.org/api_docs/python/tf/contrib/rnn/BasicLSTMCell#zero_state)z
我无法理解 tensorflow 的 dynamic_rnn 的输入参数.如果我能理解如何转换 static_rnn 会很有帮助输入 dynamic_rnn输入。 对于 static_rnn ,输入应
这里我问的是动态行为是如何工作的。这是 tensorflow documentation对于上面的dynamic_rnn函数。该函数创建的 RNN 输入 block 的最大长度是多少?它会根据最大的输
默认情况下,函数 dynamic_rnn 只输出每个时间点的隐藏状态(称为 m),可以通过以下方式获得: cell = tf.contrib.rnn.LSTMCell(100) rnn_outputs
上下文 我正在阅读 Hands on ML 的第二部分并且正在寻找关于何时使用“输出”以及何时在 RNN 的损失计算中使用“状态”的一些清晰度。 在书中(对于那些拥有该书的人,第 396 页),作者说
我是一名优秀的程序员,十分优秀!