如何从指定长度的张量中创建1和0的张量

2024-03-28 11:55:47 发布

您现在位置:Python中文网/ 问答频道 /正文

我有下面的代码来计算神经网络的损失。你知道吗

loss = tf.nn.sparse_softmax_cross_entropy_with_logits(labels=y,logits = y_hat_logits)

y\u hat\u logits的维度是10x100(每个批元素100个输出),但是,它是100,因为我填充了数据,所以实际上,在每个批元素中,只有实际logits的前10、20或30个有用,因此,当我计算损失时,我想制作一个掩码,以便在将其传递给损失函数之前,将与填充数据对应的logit设置为0。我知道如何使用我在网上找到的以下代码在每个批处理元素中找到多少“有用”的logit:

def length(sequence):
   used = tf.sign(tf.reduce_max(tf.abs(sequence), axis= 2))
   length = tf.reduce_sum(used, axis=1)
   length = tf.cast(length, tf.int32)
   return length

这将返回形状为10x1的张量,其中的值对应于填充数据之前有用的logit数。例如,如果张量中的第一个值是5,则表示只应考虑批元素中的前5个logit。现在我想取这个张量,如果第一个值是5,我想创建一个新的10x100掩码,其中第一行有5个1和95个0,这样我就可以用这个掩码对y\u hat\u logits进行元素相乘,得到一个y\u hat\u logits的屏蔽版本,其中与填充数据对应的所有logits都设置为0。你知道吗

例如,如果length(sequence)返回一个张量[5,3,1,0,7],我想创建一个掩码,其中第一行是[1,1,1,1,0,…,0],第二行是[1,1,1,0,…,0],第三行是[1,0,…,0],第四行是[0,…,0],最后一行是[1,1,1,1,1,0,…,0]。现在困扰我的是如何使用tf命令,因为使用np数组很容易。我想我必须做一些类似嵌套映射的事情,但我不知道该怎么做。你知道吗

在设置我的图形时,我想将y\u hat\u masked\u logits传递给我的loss函数,它将是我的10x100 mask与我的10x100 logits的元素乘积。我希望我把问题说清楚了。你知道吗

谢谢!你知道吗


实际上,我一直在尝试的另一个实现是使用map\u fn和tf.切片但我没有进步。这是一个更简单的方法吗?从张量的第一行取一个5号的切片,然后用0填充到100?你知道吗


Tags: 数据函数代码元素reducetfhatlength
1条回答
网友
1楼 · 发布于 2024-03-28 11:55:47

在Tensorflow中,已经有一个函数用于实现您想要实现的功能。下面的例子可以帮助您:

lengths = np.array([5,3,1,0,7])
maxlen = tf.reduce_max(lengths)
# 7
mask = tf.sequence_mask(lengths, maxlen=maxlen, dtype=tf.int32)
# [[1 1 1 1 1 0 0]
#  [1 1 1 0 0 0 0]
#  [1 0 0 0 0 0 0]
#  [0 0 0 0 0 0 0]
#  [1 1 1 1 1 1 1]]

相关问题 更多 >