关于tf.reverse_sequence()简述

  

<强> tf.reverse_sequence()简述

  

在看bidirectional_dynamic_rnn()的源码的时候,看到了代码中有调用reverse_sequence()这一方法,于是又回去看了下这个函数的用法,发现还是有点意思的。根据名字就可以能看得出,这个方法主要是用来翻转序列的,就像双线LSTM中在反向传播那里需要从下文往上文处理一样,需要对序列做一个镜像的翻转处理。

  

<强>先来看一下这个方法的定义:

        reverse_sequence (   输入,   seq_lengths,   seq_axis=没有   batch_axis=没有   name=没有,   seq_dim=没有   batch_dim=None)         

其中输入是输入的需要翻转的目标张量,seq_lengths是一个张量;

  

其元素是输入中每一处需要翻转时翻转的长度,在双向LSTM中这个值统一被设为输入语句的长度,代表着整句话都需要被翻转,而实际上张量中的元素值可以是不同的,下面的例子中就可以看出;

  

<强> seq_axis和seq_dim的关系,在源码中做了如下操作:

        seq_axis seq_axis=deprecation.deprecated_argument_lookup (“seq_axis”,   “seq_dim seq_dim)            

返回中返回gen_array_ops.reverse_sequence (…seq_dim=seq_axis…),同理,对于batch_axis和batch_dim也是相同的处理。意义上来说,按照官方给出的解释,“此操作首先沿着维度batch_axis对输入进行分割,并且对于每个切片我,将前seq_lengths元素沿维度seq_axis反转”。实际上通俗来理解,就是对于张量中输入的第batch_axis维中的每一个子张量,在这个子张量的第seq_axis维上进行翻转、翻转的长度为seq_lengths张量中对应的数值。

  

举个例子,如果batch_axis=0, seq_axis=1,则代表我希望每一行为单位分开处理,对于每一行中的每一列进行翻转。相反的,如果batch_axis=1, seq_axis=0,则是以列为单位,对于每一列的张量,进行相应行的翻转。回头去看双向RNN的源码,就可以理解当time_major这一属性不同时,time_dim和batch_dim这一对组合的取值为什么恰好是相反的了。

  

<强>写一个简单的测试代码:

        一个=特遣部队。常数([[1,2,3],[4、5、6],[7 8 9]])   l=tf.constant ([1, 2, 3], tf.int64) #每一次翻转长度分别为1,2,3,由于一个是(3、3)维的,所以l中数值最大只能是3   x=特遣部队。reverse_sequence (seq_lengths=l, seq_axis=0, batch_axis=1) #以列为单位进行翻转、翻转的是每一行的元素   y=特遣部队。reverse_sequence (seq_lengths=l, seq_axis=1, batch_axis=0) #以行为单位进行翻转、翻转的是每一列的元素   与tf.Session税():   打印(sess.run (x))   打印(sess.run (y)               

结果如下:

        #每一列上的元素种类没有发生变化,但是从每一行来看,行的顺序分别翻转了前1,前2,前3个元素   [[1 5 9]   (4 2 6)   [7 8 3]]   #每一行上的元素种类没有发生变化,但是从每一列来看,列的顺序分别翻转了前1,前2,前3个元素   [(1 2 3)   (5 4 6)   [9 8 7]]            

以上这篇关于tf.reverse_sequence()简述就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。

关于tf.reverse_sequence()简述