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

TensorFlow:在全局范围内定义变量,tensorflow,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_softm

我正在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\u权重
存储为全局范围内的
tf.常量(…)
?还是在计算交叉熵时需要将其作为参数传递

我想知道的原因是,
class\u权重
对于每个批次都是不同的。因此,我担心,如果它只是在全局范围内定义的,那么在构建张量流图时,它只取
class\u权重中的初始值,然后从不更新它们。然而,如果我在计算
weighted\u softmax
时使用
feed\u dict
传递
class\u权重
,那么我明确告诉Tensor Flow使用
class\u权重
中最近更新的值


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

我认为拥有
class\u权重
tf.常数是可以的。类权重应该针对整个数据集,而不是每个小批量


还有另一种方法,你可能要考虑的是采样,所以每个批次的每个类都有相等的数量?

如果我要用不平衡类的小批量进行,那么我仍然应该通过全局类统计来衡量吗?我认为在那个小批量中按类统计数据加权是有意义的。。。?计算的梯度仅适用于该小批量,因此它们不应该关心全局类统计信息……您的观点很好。一件事是,由于小批量是从更广泛的类别分布中取样的。如果按小批量称重,则在整个迭代过程中,该重量将以任何方式收敛到更广泛分布的重量。所以我认为,考虑到只计算一次类的权重更有效。我希望我能找到这方面的引证,但到目前为止还不能。。。