我有 2 种不同的实现:
- 使用带有 logits 的“常规”softmax:
tf.nn.softmax_cross_entropy_with_logits
class_weight 是我在每批迭代中填写的占位符。
self.class_weight = tf.placeholder(tf.float32, shape=self.batch_size,self._num_classes], name='class_weight')
self._final_output = tf.matmul(self._states,self._weights["linear_layer"]) + self._biases["linear_layer"]
self.scaled_logits = tf.multiply(self._final_output, self.class_weight)
self.softmax = tf.nn.softmax_cross_entropy_with_logits(logits=self.scaled_logits,labels= self._labels)
- 与tf.nn.softmax_cross_entropy_with_logits
我在哪里使用实现的 tensorflow 函数,但我需要计算批次的权重。文档对此有点困惑。有两种方法可以使用 tf.gather 或像这样:
self.scaled_class_weights=tf.reduce_sum(tf.multiply(self._labels,self.class_weight),1)
self.softmax = tf.losses.softmax_cross_entropy(logits=self._final_output,
onehot_labels=self._labels,weights=self.scaled_class_weights)
这里有一个很好的讨论
最后,由于我一直不想嫁给任何实现,所以我添加了一点 tf.case 并在训练时间传递了我想使用的策略。
self.sensitive_learning_strategy = tf.placeholder(tf.int32 , name='sensitive_learning_strategy')
self.softmax =tf.case([
(tf.equal(self.sensitive_learning_strategy, 0), lambda: self.softmax_0),
(tf.equal(self.sensitive_learning_strategy, 1), lambda: self.softmax_1),
(tf.equal(self.sensitive_learning_strategy, 2), lambda: self.softmax_2)