当前位置 : 主页 > 编程语言 > 其它开发 >

tf.sequence_mask函数讲解案例

来源:互联网 收集:自由互联 发布时间:2022-07-07
一TensorFlow打印向量值 当直接打印tf变量里的内容,只能输出维度,无法直接查看结果时—— 方法一: import tensorflow as tfx = tf.constant(1)with tf.Session() as sess:print(sess.run(x)) 方法二: import
一 TensorFlow 打印向量值

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

方法一:

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

 

参考资料:

https://wenku.baidu.com/view/d98d1c1640323968011ca300a6c30c225901f0f2.html

http://www.kaotop.com/it/29711.html 

网友评论