kyl*_*tor 3 machine-learning sequence deep-learning tensorflow recurrent-neural-network
我正在尝试使用dynamic_rnn
Tensorflow中的功能来加快训练速度。阅读后,我的理解是,加快训练速度的一种方法是sequence_length
在此函数中将值显式传递给参数。经过一番阅读之后,找到了这样的解释,看来我需要传递的是一个向量(可能由定义tf.placeholder
),其中包含批处理中每个序列的长度。
这是我感到困惑的地方:为了利用这一优势,我应该将每个批次填充到批次中最长长度的序列,而不是训练集中的最长序列吗?Tensorflow如何处理任何较短序列中的其余零/填充令牌?另外,这里的主要优势是真的可以提高速度吗,还是可以额外保证我们在训练过程中掩盖了垫子令牌?任何帮助/上下文将不胜感激。
我应该将每个批次填充到批次中最长的序列,而不是训练集中的最长序列吗?
批次中的序列必须对齐,即必须具有相同的长度。因此,对您问题的一般回答是“是”。但是不同批次的长度不必相同,因此您可以将输入序列分层为大小大致相同的组,并相应地填充它们。该技术称为存储分区,您可以在本教程中了解它。
Tensorflow如何处理任何较短序列中的其余零/填充令牌?
非常直观。tf.nn.dynamic_rnn
返回两个张量:output
和states
。假设实际序列长度为t
,填充序列长度为T
。
然后,output
后面将包含零,i > t
并且states
将包含t
-th单元状态,而忽略尾随单元的状态。
这是一个例子:
import numpy as np
import tensorflow as tf
n_steps = 2
n_inputs = 3
n_neurons = 5
X = tf.placeholder(dtype=tf.float32, shape=[None, n_steps, n_inputs])
seq_length = tf.placeholder(tf.int32, [None])
basic_cell = tf.nn.rnn_cell.BasicRNNCell(num_units=n_neurons)
outputs, states = tf.nn.dynamic_rnn(basic_cell, X,
sequence_length=seq_length, dtype=tf.float32)
X_batch = np.array([
# t = 0 t = 1
[[0, 1, 2], [9, 8, 7]], # instance 0
[[3, 4, 5], [0, 0, 0]], # instance 1
[[6, 7, 8], [6, 5, 4]], # instance 2
])
seq_length_batch = np.array([2, 1, 2])
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
outputs_val, states_val = sess.run([outputs, states], feed_dict={
X: X_batch,
seq_length: seq_length_batch
})
print(outputs_val)
print()
print(states_val)
Run Code Online (Sandbox Code Playgroud)
请注意,实例1被填充,outputs_val[1,1]
零向量也被填充states_val[1] == outputs_val[1,0]
:
[[[ 0.76686853 0.8707901 -0.79509073 0.7430128 0.63775384]
[ 1. 0.7427926 -0.9452815 -0.93113345 -0.94975543]]
[[ 0.9998851 0.98436266 -0.9620067 0.61259484 0.43135557]
[ 0. 0. 0. 0. 0. ]]
[[ 0.99999994 0.9982034 -0.9934515 0.43735617 0.1671598 ]
[ 0.99999785 -0.5612586 -0.57177305 -0.9255771 -0.83750355]]]
[[ 1. 0.7427926 -0.9452815 -0.93113345 -0.94975543]
[ 0.9998851 0.98436266 -0.9620067 0.61259484 0.43135557]
[ 0.99999785 -0.5612586 -0.57177305 -0.9255771 -0.83750355]]
Run Code Online (Sandbox Code Playgroud)
另外,这里的主要优势是真的可以提高速度吗,还是可以额外保证我们在训练过程中掩盖了垫子令牌?
当然,批处理比一个接一个的序列更有效。但是指定长度的主要优点是,您可以从RNN中获得合理的状态,即,填充项不会影响结果张量。如果不设置长度,但是手动选择正确的状态,您将获得完全相同的结果(和相同的速度)。
归档时间: |
|
查看次数: |
1380 次 |
最近记录: |