TensorFlow:在全局范围内定义变量

时间:2016-04-04 13:21:00

标签: tensorflow

我正在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中最近更新的值。

任何帮助将不胜感激。谢谢!

1 个答案:

答案 0 :(得分:1)

我认为让class_weights tf.constant很好。应该对整个数据集进行类加权,而不是按照小批量进行。

您可能还需要考虑另一种方法是抽样,这样每个批次的每个类都有相同的数量吗?