我想定义一个损失函数,它根据不同的条件计算损失。代码如下:
def calLoss2(logits, labels, augs, noaugs):
augs = tf.cast(augs, tf.bool)
noaugs = tf.cast(noaugs, tf.bool)
noAugLogits = tf.boolean_mask(logits, noaugs)
noAugLabels = tf.boolean_mask(labels, noaugs)
augLogits = tf.boolean_mask(logits, augs)
augLabels = tf.boolean_mask(labels, augs)
noaugLoss = 0.0
if augLabels.get_shape()[0] < BATCH_SIZE:
noaugLoss = tf.reduce_mean(tf.nn.sparse_softmax_cross_entropy_with_logits(
noAugLogits, noAugLabels)) * PENALTY_COEFFICIENT
augLoss = tf.reduce_mean(
tf.nn.sparse_softmax_cross_entropy_with_logits(augLogits, augLabels))
return noaugLoss + augLoss
正如你所看到的,我想根据变量&#39; augs&#39;的第一个维度计算损失,我认为我可以使用 augLabels.get_shape()[0]来获得它的形状。 ]&lt; BATCH_SIZE 即可。但get_shape()[0]给出了一个&#39;?&#39;而不是它的第一个维度。但是,当我使用get_shape()来获取tf.boolean_mask()无法获得的张量形状时,它通常会给出正确的形状。
那么有人可以给我一些建议,如何获得由函数tf.boolean_mask()获得的张量的形状?