我正在TensorFlow中构建一个图像分类器,我的训练数据中存在类不平衡。因此,在计算损失时,我需要通过训练数据中该类的反向频率来加权每个类的损失。
所以,这是我的代码:
# Get the softmax from the final layer of the network
softmax = tf.nn.softmax(final_layer)
# Weight the softmax by the inverse frequency of the weights
weighted_softmax = tf.mul(softmax, class_weights)
# Compute the cross entropy
cross_entropy = -tf.reduce_sum(y_ * tf.log(softmax))
# Define the optimisation
train_step = tf.train.AdamOptimizer(1e-5).minimize(cross_entropy)
# Run the training
session.run(tf.initialize_all_variables())
for i in range(10000):
# Get the next batch
batch = datasets.train.next_batch(64)
# Run a training step
train_step.run(feed_dict = {x: batch[0], y_: batch[1]})
我的问题是:我可以将class_weights
存储为全局范围内的tf.constant(...)
吗?或者在计算cross_entropy
时需要将其作为参数传递?
我想知道的是class_weights
每个批次都不同。因此,我担心如果它只是在全局范围内定义,那么当构造Tensor Flow图时,它只需要class_weights
中的初始值,然后永远不会更新它们。如果我在计算class_weights
时使用feed_dict
传递weighted_softmax
,那么我明确告诉Tensor Flow使用class_weights
中最近更新的值。
任何帮助将不胜感激。谢谢!
答案 0 :(得分:1)
我认为让class_weights
tf.constant很好。应该对整个数据集进行类加权,而不是按照小批量进行。
您可能还需要考虑另一种方法是抽样,这样每个批次的每个类都有相同的数量吗?