如何定义张量流中的加权损失函数?

2024-09-29 23:33:25 发布

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

我有一个训练数据集train_data和train_labels,它是tensorflow图中的train_data_节点和train_labels_节点。 如你所知,我可以用张量流的损失函数作为波纹管:

logits = model(train_data_node)
loss = tf.reduce_mean(tf.nn.sparse_softmax_cross_entropy_with_logits(
    logits,train_labels_node))

然而,该损失函数对所有训练数据的处理是平等的。 但在我们的情况下,我们需要区别对待数据。 例如,我们有一个与训练数据相对应的csv文件,以指示训练数据是原始的或扩充的。 然后我们要定义一个自定义的丢失函数,它使原始数据的丢失起到更重要的作用,而扩展数据的丢失则不那么重要,例如:

^{pr2}$

我将损失函数定义为如下所示,但它不起作用:

def calLoss(logits, labels, augs):
  noAugLogits = []
  noAugLabels = []
  augLogits = []
  augLabels = []
  tf.get_collection()
  for i in range(augs.shape[0]):
    if augs[i] == 1:
      noAugLogits.append(logits[i])
      noAugLabels.append(labels[i])
    else:
      augLogits.append(logits[i])
      augLabels.append(labels[i])
  noAugLogits = tf.convert_to_tensor(noAugLogits)
  noAugLabels = tf.convert_to_tensor(noAugLabels)
  augLogits = tf.convert_to_tensor(augLogits)
  augLabels = tf.convert_to_tensor(augLabels)
  return tf.reduce_mean(tf.nn.sparse_softmax_cross_entropy_with_logits(
      noAugLogits, noAugLabels)) * PENALTY_COEFFICIENT + \
      tf.reduce_mean(tf.nn.sparse_softmax_cross_entropy_with_logits(augLogits, augLabels))

我认为我们应该用张量运算来写损失函数,但是我不太熟悉。有谁能给我一些关于如何定义损失函数的建议吗。在

谢谢你的回答或建议。在


Tags: to数据函数convertlabelstftraintensor
1条回答
网友
1楼 · 发布于 2024-09-29 23:33:25

我终于用这个函数自己解决了这个问题tf.boolen_面具()张量流。定义的自定义加权损失函数如下:

def calLoss(logits, labels, augs):
  augSum = tf.reduce_sum(augs)
  pred = tf.less(augSum, BATCH_SIZE)

  def noaug(logits, labels, augs):
    augs = tf.cast(augs, tf.bool)
    noaugs = tf.logical_not(augs)
    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 = tf.reduce_mean(
        tf.nn.sparse_softmax_cross_entropy_with_logits(noAugLogits, noAugLabels))
    augLoss = tf.reduce_mean(
        tf.nn.sparse_softmax_cross_entropy_with_logits(augLogits, augLabels))
    return noaugLoss * PENALTY_COEFFICIENT + augLoss

  def aug(logits, labels):
    return tf.reduce_mean(
        tf.nn.sparse_softmax_cross_entropy_with_logits(logits, labels))

  return tf.cond(pred, lambda: noaug(logits, labels, augs), lambda: aug(logits, labels))

如您所见,我使用了一个numpy数组变量augs,在相应的位置使用1和0来指示一批样本中的一个样本是扩增的还是非扩增的。然后我将变量转换为bool张量,并将其用作tf.boolen_面具()分别提取增广样本和非增广样本,计算损失。在

相关问题 更多 >

    热门问题