我有一个train_data和train_labels的训练数据集,它是tensorflow图中的train_data_node和train_labels_node。 如你所知,我可以使用tensorflow的损失函数为波纹管:如何在TensorFlow中定义加权损失函数?
logits = model(train_data_node)
loss = tf.reduce_mean(tf.nn.sparse_softmax_cross_entropy_with_logits(
logits,train_labels_node))
然而,这种损失函数同样处理所有的训练数据。 但是在我们的情况下,我们想要有区别地处理数据。例如,我们有一个对应于训练数据的csv文件,用于指示列车数据是原始数据还是增加数据。 然后我们要定义一个自定义的损失函数,这使得原始数据的丢失发挥更重要的作用,并增强数据发挥不太重要的作用,如损失:
loss_no_aug = tf.reduce_mean(tf.nn.sparse_softmax_cross_entropy_with_logits(noAugLogits, noAugLabels))
loss_aug = tf.reduce_mean(tf.nn.sparse_softmax_cross_entropy_with_logits(augLogits, augLabels))
loss = loss_no_aug * PENALTY_COEFFICIENT + loss_aug
我已经定义了一个损失函数为波纹管,但它没有工作:
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))
我认为我们应该用张写操作损失函数,但是,我不熟悉它们。所以任何人都可以给我一些关于如何定义损失函数的建议。
谢谢你的答复或建议。
我发现了一些tensorflow函数来处理张量,如tf.cond(),tf.boolen_mask和tf.gather()。但我不知道如何使用它们。在我们的情况下,关键问题是如何根据由0或1组成的对应于增强和非增强的augs张量来对数据和标签张量进行切片。那么有人可以给我一个建议吗?非常感谢你。 – Kongsea