tf.sequence_mask如何处理长尾词序列的掩码问题?

2026-04-11 09:221阅读0评论SEO基础
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计1108个文字,预计阅读时间需要5分钟。

tf.sequence_mask如何处理长尾词序列的掩码问题?

TensorFlow 打印向量值直接打印tf变量内容,只能输出维度,无法直接查看结果方法一:pythonimport tensorflow as tfx=tf.constant(1)with tf.Session() as sess: print(sess.run(x))方法二:

一TensorFlow打印向量值

当直接打印tf变量里的内容,只能输出维度,无法直接查看结果时——

方法一:

tf.sequence_mask如何处理长尾词序列的掩码问题?

import tensorflow as tf x = tf.constant(1) with tf.Session() as sess: print(sess.run(x))

方法二:

import tensorflow as tf x = tf.constant(1) sess = tf.InteractiveSession() print(x.eval() ) 二tf.sequence_mask() 函数

  • lengths整数张量,其所有值 <= maxlen。
  • maxlen标量整数张量,返回张量的最后一维的大小。默认值为lengths中的最大值。
  • dtype结果张量的输出类型。
  • name操作的名称。
情况1:length 传入的是个标量

import tensorflow as tf length = 3 seq_mask = tf.sequence_mask(length) seq_mask Out[6]: <tf.Tensor 'SequenceMask/Less:0' shape=(?,) dtype=bool> tf.InteractiveSession() print(seq_mask.eval()) [ True True True] seq_mask = tf.sequence_mask(lengths=length) print(seq_mask.eval()) [ True True True] max_mask = tf.sequence_mask(lengths=length, maxlen=5) max_mask Out[12]: <tf.Tensor 'SequenceMask_2/Less:0' shape=(5,) dtype=bool> max_mask.eval() Out[13]: array([ True, True, True, False, False])

可以看到长度被扩展了。

情况2:传入一维列表,根据一维列表的个数shape

embed_dim = [2, 3, 4] embed_mask = tf.sequence_mask(lengths=embed_dim) embed_mask Out[16]: <tf.Tensor 'SequenceMask_3/Less:0' shape=(3, ?) dtype=bool> embed_mask.eval() Out[17]: array([[ True, True, False, False], [ True, True, True, False], [ True, True, True, True]]) max_embed_mask = tf.sequence_mask(lengths=embed_dim, maxlen=6) max_embed_mask Out[19]: <tf.Tensor 'SequenceMask_4/Less:0' shape=(3, 6) dtype=bool> max_embed_mask.eval() Out[20]: array([[ True, True, False, False, False, False], [ True, True, True, False, False, False], [ True, True, True, True, False, False]]) 

可以看到修改后的 array的维度是根据length_list的 shape来变化的,即为 3

如果列表元素过长——

batch_data = [4, 3, 5, 6] batch_seq = tf.sequence_mask(lengths=batch_data) batch_seq Out[72]: <tf.Tensor 'SequenceMask_17/Less:0' shape=(4, ?) dtype=bool> batch_seq.eval() Out[73]: array([[ True, True, True, True, False, False], [ True, True, True, False, False, False], [ True, True, True, True, True, False], [ True, True, True, True, True, True]]) max_batch_mask = tf.sequence_mask(lengths=batch_data, maxlen=7) max_batch_mask Out[75]: <tf.Tensor 'SequenceMask_18/Less:0' shape=(4, 7) dtype=bool> max_batch_mask.eval() Out[76]: array([[ True, True, True, True, False, False, False], [ True, True, True, False, False, False, False], [ True, True, True, True, True, False, False], [ True, True, True, True, True, True, False]])

可以看到修改后的 array的维度是根据batch_data 的 shape来变化的,即为 4

结论:一维列表根据列表的维度的最后一个维度进行扩充

情况3:length传入的是多维列表

length_list = [ [2, 3, 4], [3, 4, 5]] list_mask = tf.sequence_mask(lengths=length_list) list_mask Out[64]: <tf.Tensor 'SequenceMask_15/Less:0' shape=(2, 3, ?) dtype=bool> list_mask.eval() Out[65]: array([[[ True, True, False, False, False], [ True, True, True, False, False], [ True, True, True, True, False]], [[ True, True, True, False, False], [ True, True, True, True, False], [ True, True, True, True, True]]]) max_list_mask = tf.sequence_mask(lengths=length_list, maxlen=7) max_list_mask Out[68]: <tf.Tensor 'SequenceMask_16/Less:0' shape=(2, 3, 7) dtype=bool> max_list_mask.eval() Out[69]: array([[[ True, True, False, False, False, False, False], [ True, True, True, False, False, False, False], [ True, True, True, True, False, False, False]], [[ True, True, True, False, False, False, False], [ True, True, True, True, False, False, False], [ True, True, True, True, True, False, False]]])

结论:根据列表的维度进行赋值,而非列表里面的数值,本案例为 2,3

如果交换一下列表里面的数据位置——

length_list2 = [ [3, 4, 5], [2, 3, 4]] list_mask2 = tf.sequence_mask(lengths=length_list2) list_mask2 Out[30]: <tf.Tensor 'SequenceMask_7/Less:0' shape=(2, 3, ?) dtype=bool> list_mask2.eval() Out[31]: array([[[ True, True, True, False, False], [ True, True, True, True, False], [ True, True, True, True, True]], [[ True, True, False, False, False], [ True, True, True, False, False], [ True, True, True, True, False]]]) max_list_mask2 = tf.sequence_mask(lengths=length_list2, maxlen=7) max_list_mask2 Out[43]: <tf.Tensor 'SequenceMask_11/Less:0' shape=(2, 3, 7) dtype=bool> max_list_mask2.eval() Out[44]: array([[[ True, True, True, False, False, False, False], [ True, True, True, True, False, False, False], [ True, True, True, True, True, False, False]], [[ True, True, False, False, False, False, False], [ True, True, True, False, False, False, False], [ True, True, True, True, False, False, False]]])

维度没有发生变化,还是 2, 3

含有一个列表的列表——

length_list3 = [ [2, 3, 4] ] list_mask3 = tf.sequence_mask(lengths=length_list3) list_mask3 Out[34]: <tf.Tensor 'SequenceMask_8/Less:0' shape=(1, 3, ?) dtype=bool> list_mask3.eval() Out[35]: array([[[ True, True, False, False], [ True, True, True, False], [ True, True, True, True]]]) max_list_mask3 = tf.sequence_mask(lengths=length_list3, maxlen=6) max_list_mask3 Out[46]: <tf.Tensor 'SequenceMask_12/Less:0' shape=(1, 3, 6) dtype=bool> max_list_mask3.eval() Out[47]: array([[[ True, True, False, False, False, False], [ True, True, True, False, False, False], [ True, True, True, True, False, False]]])

根据结果,维度是 1,3

参考资料:

wenku.baidu.com/view/d98d1c1640323968011ca300a6c30c225901f0f2.html

www.kaotop.com/it/29711.html

本文共计1108个文字,预计阅读时间需要5分钟。

tf.sequence_mask如何处理长尾词序列的掩码问题?

TensorFlow 打印向量值直接打印tf变量内容,只能输出维度,无法直接查看结果方法一:pythonimport tensorflow as tfx=tf.constant(1)with tf.Session() as sess: print(sess.run(x))方法二:

一TensorFlow打印向量值

当直接打印tf变量里的内容,只能输出维度,无法直接查看结果时——

方法一:

tf.sequence_mask如何处理长尾词序列的掩码问题?

import tensorflow as tf x = tf.constant(1) with tf.Session() as sess: print(sess.run(x))

方法二:

import tensorflow as tf x = tf.constant(1) sess = tf.InteractiveSession() print(x.eval() ) 二tf.sequence_mask() 函数

  • lengths整数张量,其所有值 <= maxlen。
  • maxlen标量整数张量,返回张量的最后一维的大小。默认值为lengths中的最大值。
  • dtype结果张量的输出类型。
  • name操作的名称。
情况1:length 传入的是个标量

import tensorflow as tf length = 3 seq_mask = tf.sequence_mask(length) seq_mask Out[6]: <tf.Tensor 'SequenceMask/Less:0' shape=(?,) dtype=bool> tf.InteractiveSession() print(seq_mask.eval()) [ True True True] seq_mask = tf.sequence_mask(lengths=length) print(seq_mask.eval()) [ True True True] max_mask = tf.sequence_mask(lengths=length, maxlen=5) max_mask Out[12]: <tf.Tensor 'SequenceMask_2/Less:0' shape=(5,) dtype=bool> max_mask.eval() Out[13]: array([ True, True, True, False, False])

可以看到长度被扩展了。

情况2:传入一维列表,根据一维列表的个数shape

embed_dim = [2, 3, 4] embed_mask = tf.sequence_mask(lengths=embed_dim) embed_mask Out[16]: <tf.Tensor 'SequenceMask_3/Less:0' shape=(3, ?) dtype=bool> embed_mask.eval() Out[17]: array([[ True, True, False, False], [ True, True, True, False], [ True, True, True, True]]) max_embed_mask = tf.sequence_mask(lengths=embed_dim, maxlen=6) max_embed_mask Out[19]: <tf.Tensor 'SequenceMask_4/Less:0' shape=(3, 6) dtype=bool> max_embed_mask.eval() Out[20]: array([[ True, True, False, False, False, False], [ True, True, True, False, False, False], [ True, True, True, True, False, False]]) 

可以看到修改后的 array的维度是根据length_list的 shape来变化的,即为 3

如果列表元素过长——

batch_data = [4, 3, 5, 6] batch_seq = tf.sequence_mask(lengths=batch_data) batch_seq Out[72]: <tf.Tensor 'SequenceMask_17/Less:0' shape=(4, ?) dtype=bool> batch_seq.eval() Out[73]: array([[ True, True, True, True, False, False], [ True, True, True, False, False, False], [ True, True, True, True, True, False], [ True, True, True, True, True, True]]) max_batch_mask = tf.sequence_mask(lengths=batch_data, maxlen=7) max_batch_mask Out[75]: <tf.Tensor 'SequenceMask_18/Less:0' shape=(4, 7) dtype=bool> max_batch_mask.eval() Out[76]: array([[ True, True, True, True, False, False, False], [ True, True, True, False, False, False, False], [ True, True, True, True, True, False, False], [ True, True, True, True, True, True, False]])

可以看到修改后的 array的维度是根据batch_data 的 shape来变化的,即为 4

结论:一维列表根据列表的维度的最后一个维度进行扩充

情况3:length传入的是多维列表

length_list = [ [2, 3, 4], [3, 4, 5]] list_mask = tf.sequence_mask(lengths=length_list) list_mask Out[64]: <tf.Tensor 'SequenceMask_15/Less:0' shape=(2, 3, ?) dtype=bool> list_mask.eval() Out[65]: array([[[ True, True, False, False, False], [ True, True, True, False, False], [ True, True, True, True, False]], [[ True, True, True, False, False], [ True, True, True, True, False], [ True, True, True, True, True]]]) max_list_mask = tf.sequence_mask(lengths=length_list, maxlen=7) max_list_mask Out[68]: <tf.Tensor 'SequenceMask_16/Less:0' shape=(2, 3, 7) dtype=bool> max_list_mask.eval() Out[69]: array([[[ True, True, False, False, False, False, False], [ True, True, True, False, False, False, False], [ True, True, True, True, False, False, False]], [[ True, True, True, False, False, False, False], [ True, True, True, True, False, False, False], [ True, True, True, True, True, False, False]]])

结论:根据列表的维度进行赋值,而非列表里面的数值,本案例为 2,3

如果交换一下列表里面的数据位置——

length_list2 = [ [3, 4, 5], [2, 3, 4]] list_mask2 = tf.sequence_mask(lengths=length_list2) list_mask2 Out[30]: <tf.Tensor 'SequenceMask_7/Less:0' shape=(2, 3, ?) dtype=bool> list_mask2.eval() Out[31]: array([[[ True, True, True, False, False], [ True, True, True, True, False], [ True, True, True, True, True]], [[ True, True, False, False, False], [ True, True, True, False, False], [ True, True, True, True, False]]]) max_list_mask2 = tf.sequence_mask(lengths=length_list2, maxlen=7) max_list_mask2 Out[43]: <tf.Tensor 'SequenceMask_11/Less:0' shape=(2, 3, 7) dtype=bool> max_list_mask2.eval() Out[44]: array([[[ True, True, True, False, False, False, False], [ True, True, True, True, False, False, False], [ True, True, True, True, True, False, False]], [[ True, True, False, False, False, False, False], [ True, True, True, False, False, False, False], [ True, True, True, True, False, False, False]]])

维度没有发生变化,还是 2, 3

含有一个列表的列表——

length_list3 = [ [2, 3, 4] ] list_mask3 = tf.sequence_mask(lengths=length_list3) list_mask3 Out[34]: <tf.Tensor 'SequenceMask_8/Less:0' shape=(1, 3, ?) dtype=bool> list_mask3.eval() Out[35]: array([[[ True, True, False, False], [ True, True, True, False], [ True, True, True, True]]]) max_list_mask3 = tf.sequence_mask(lengths=length_list3, maxlen=6) max_list_mask3 Out[46]: <tf.Tensor 'SequenceMask_12/Less:0' shape=(1, 3, 6) dtype=bool> max_list_mask3.eval() Out[47]: array([[[ True, True, False, False, False, False], [ True, True, True, False, False, False], [ True, True, True, True, False, False]]])

根据结果,维度是 1,3

参考资料:

wenku.baidu.com/view/d98d1c1640323968011ca300a6c30c225901f0f2.html

www.kaotop.com/it/29711.html