关于tf.reverse_sequence()简述

 更新时间:2020年01月20日 16:37:53   作者:Cerisier  
今天小编就为大家分享一篇关于tf.reverse_sequence()简述,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

tf.reverse_sequence()简述

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

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

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的关系,在源码中做了如下操作:

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 这一对组合的取值为什么恰好是相反的了。

写一个简单的测试代码:

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中数值最大只能是3
x = 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,前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()简述就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。

您可能感兴趣的文章:

相关文章

  • 解决Python Matplotlib绘图数据点位置错乱问题

    解决Python Matplotlib绘图数据点位置错乱问题

    这篇文章主要介绍了解决Python Matplotlib绘图数据点位置错乱问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-05-05
  • Python 中如何将十六进制转换为 Base64

    Python 中如何将十六进制转换为 Base64

    本篇文章将介绍在 Python 中将 hex 转换为 base64 的方法,本文结合实例代码给大家介绍的非常详细,需要的朋友可以参考下
    2023-06-06
  • python用循环新建多个列表的代码实例

    python用循环新建多个列表的代码实例

    当我们处理数据时,有时候需要创建多个列表以存储不同类型或不同条件下的数据,在Python中,我们可以利用循环来快速、高效地创建这些列表,本文将介绍如何使用循环在Python中创建多个列表,并提供代码实例,需要的朋友可以参考下
    2024-04-04
  • Python读取CSV文件并计算某一列的均值和方差

    Python读取CSV文件并计算某一列的均值和方差

    这篇文章主要介绍了利用Python读取CSV文件并计算某一列的均值和方差,这里利用了csv模块来对文件进行处理,文章通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-12-12
  • 详解Anconda环境下载python包的教程(图形界面+命令行+pycharm安装)

    详解Anconda环境下载python包的教程(图形界面+命令行+pycharm安装)

    这篇文章主要介绍了Anconda环境下载python包的教程(图形界面+命令行+pycharm安装),这篇文章很适合小白入手级别的,本文图文并茂给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-11-11
  • Matplotlib使用Cursor实现UI定位的示例代码

    Matplotlib使用Cursor实现UI定位的示例代码

    这篇文章主要介绍了Matplotlib使用Cursor实现UI定位的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-03-03
  • Python中线程的MQ消息队列实现以及消息队列的优点解析

    Python中线程的MQ消息队列实现以及消息队列的优点解析

    消息队列(MQ,Message Queue)在消息数据传输中的保存作用为数据通信提供了保障和实时处理上的便利,这里我们就来看一下Python中线程的MQ消息队列实现以及消息队列的优点解析
    2016-06-06
  • Python编程入门的一些基本知识

    Python编程入门的一些基本知识

    这篇文章主要介绍了Python编程入门的一些基本知识,包括注释需和Shell命令使用等基本内容,要的朋友可以参考下
    2015-05-05
  • 在Django框架中伪造捕捉到的URLconf值的方法

    在Django框架中伪造捕捉到的URLconf值的方法

    这篇文章主要介绍了在Django框架中伪造捕捉到的URLconf值的方法,Django是Python各色人气框架中最为著名的一个,需要的朋友可以参考下
    2015-07-07
  • Python通过wordcloud库实现将单词生成词云

    Python通过wordcloud库实现将单词生成词云

    Python的wordcloud库是一个用于生成词云的Python包,它可以将一段文本中出现频率高的单词按其出现频率大小以及颜色深浅排列成一个词云图形,从而更好地展示文本中的信息,你可以使用wordcloud库来生成各种类型的词云,本文就介绍了如何生成心型词云
    2023-06-06

最新评论