我有2种不同的实现:
- 带有logits的“常规” softmax:
tf.nn.softmax_cross_entropy_with_logits
在class_weight是占位符的地方,我填写了Everey批处理迭代。
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函数,但需要计算批次的权重。该文档对此有点困惑。有2种方法可以使用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)