我有以下代码来计算神经网络的损耗。
loss = tf.nn.sparse_softmax_cross_entropy_with_logits(labels=y,logits = y_hat_logits)
y_hat_logits的尺寸为10x100(每个批处理元素100个输出),但是它是100,因为我已经填充了数据,因此实际上可能是每个批处理元素中只有第一个。实际logit的10、20或30很有用,因此在计算损失时,我想做一个掩码,以便将与填充数据相对应的logits设置为0,然后再将其传递给我的损失函数。我知道如何使用我在网上找到的以下代码来查找每个批处理元素中“有用”的登录记录:
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个和95个零,因此我可以使用此掩码对y_hat_logits进行元素明智的乘法,以获取y_hat_logits的掩码版本,其中与填充数据相对应的所有logits均设置为0。
例如,如果length(sequence)返回张量[5,3,1,0,7],我想创建一个掩码,其中第一行是[1,1,1,1,1,0, ...,0],第二行是[1,1,1,0,...,0],第三行是[1,0,...,0],第四行是[0, ...,0],最后一行是[1,1,1,1,1,1,1,0,...,0]。现在困扰我的是如何使用tf命令执行此操作,因为如果使用np数组很容易。我想我必须做类似嵌套的map_fn之类的事情,但是我不确定如何准确地做到这一点。
在设置图形时,我想将y_hat_masked_logits传递给我的损失函数,这将是我的10x100蒙版与10x100 logits的元素明智乘积。我希望我把问题弄清楚了。
谢谢!
实际上,我一直在尝试的另一种实现是使用map_fn和tf.slice,但是我没有取得任何进展。这会更简单吗?要从张量的第一行中获取大小为5或其他大小的切片,然后从0填充直到100?
答案 0 :(得分:0)
您已经尝试在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]]