搜索
Hi~登录注册
查看: 1026|回复: 0

关于tf.reverse_sequence()简述

[复制链接]

0

主题

0

帖子

10

积分

新手上路

Rank: 1

积分
10
发表于 2020-1-27 13:22:33 | 显示全部楼层 |阅读模式
tf.reverse_sequence()简述
在看bidirectional_dynamic_rnn()的源码的时间,看到了代码中有调用 reverse_sequence()这一方法,于是又回去看了下这个函数的用法,发现还是有点意思的。根据名字就可以能看得出,这个方法主要是用来翻转序列的,就像双线LSTM中在反向传播那里需要从下文往上文处理一样,需要对序列做一个镜像的翻转处理。
先来看一下这个方法的定义:
  1. reverse_sequence(  input,  seq_lengths,  seq_axis=None,  batch_axis=None,  name=None,  seq_dim=None,  batch_dim=None)
复制代码
其中input是输入的需要翻转的目标张量,seq_lengths是一个张量;
其元素是input中每一处需要翻转时翻转的长度,在双向LSTM中这个值统一被设为输入语句的长度,代表着整句话都需要被翻转,而实际上张量中的元素值可以是差别的,下面的例子中就可以看出;
seq_axis和seq_dim的关系,在源码中做了如下操作:
  1. seq_axis = deprecation.deprecated_argument_lookup("seq_axis", seq_axis,                          "seq_dim", seq_dim)
复制代码
返回中return gen_array_ops.reverse_sequence(..., seq_dim=seq_axis,...),同理,对于batch_axis和batch_dim也是雷同的处理。意义上来说,按照官方给出的解释,“此操作首先沿着维度batch_axis对input进行分割,并且对于每个切片 i,将前 seq_lengths 元素沿维度 seq_axis 反转”。实际上通俗来理解,就是对于张量input中的第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. a = tf.constant([[1,2,3], [4,5,6], [7,8,9]])l = tf.constant([1,2,3],tf.int64) # 每一次翻转长度分别为1,2,3.由于a是(3,3)维的,所以l中数值最大只能是3x = tf.reverse_sequence(a,seq_lengths=l,seq_axis = 0,batch_axis= 1) # 以列为单元进行翻转,翻转的是每一行的元素y = tf.reverse_sequence(a,seq_lengths=l,seq_axis = 1,batch_axis= 0) # 以行为单元进行翻转,翻转的是每一列的元素with tf.Session() as sess:  print(sess.run(x))  print(sess.run(y))
复制代码
结果如下:
  1. # 每一列上的元素种类没有发生变化,但是从每一行来看,行的顺序分别翻转了前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()简述就是小编分享给大家的全部内容了,盼望能给大家一个参考,也盼望大家多多支持脚本之家。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

游客
回复
您需要登录后才可以回帖 登录 | 点我注册

快速回复 返回顶部 返回列表