nce_loss()
要求int
的静态num_true
值。这适用于我们在每个训练示例中具有相同数量的标签并且我们事先知道的问题。
当标签具有可变形状[None]
,并且使用.padded_batch()
+ .group_by_window()
按行大小进行批处理和/或分段时,必须提供可变大小num_true
为了适应所有训练样例。目前我不支持这一点(如果我错了,请纠正我。)
换句话说,假设我们拥有每个图像(狗,猫,鸭等)具有任意数量标签的图像数据集,或者每个句子具有多个多个类的文本数据集(class_1,class_2,.. 。,class_n)。类不是互斥的,并且可以在示例之间改变大小。
但是,由于可能的标签数量可能很大,10k-100k是否有办法进行采样丢失以提高性能(与sigmoid_cross_entropy
相比)?
有没有正确的方法来执行此操作或任何其他解决方法?
nce_loss = tf.nn.nce_loss(
weights=nce_weights,
biases=nce_biases,
labels=labels,
inputs=inputs,
num_sampled=num_sampled,
# Something like this:
# `num_true=(tf.shape(labels)[-1])` instead of `num_true=const_int`
# , would be preferable here
num_classes=self.num_classes)
答案 0 :(得分:0)
我看到两个问题: 1)与NCE一起使用不同数量的真实值; 2)不互斥的类。
对于第一个问题,如@michal所说,希望将来会包含此功能。我尝试了几乎相同的方法:使用带有shape=(None, None)
,即true_values
尺寸None
的标签。 sampled_values
参数有相同的问题:true_values
数字必须是固定的整数。建议的解决方法是使用一个表示0
的类(<PAD>
是最好的类)并完成true_values
的数量。就我而言,0
是代表<PAD>
的特殊标记。部分代码在这里:
assert len(labels) <= (window_size * 2)
zeros = ((window_size * 2) - len(labels)) * [0]
labels = labels + zeros
labels.sort()
我对标签进行了排序是因为考虑了另一项建议:
注意:默认情况下,此选项使用对数均匀(Zipfian)分布 采样,因此您的标签必须按照降序排列 频率以获得良好的结果。
在我的情况下,特殊标记和频率较高的单词具有较低的索引,否则,频率较低的单词具有较高的索引。我同时包含了与输入关联的所有标签类,并以零结束,直到true_values
号为止。当然,您必须在最后忽略0
类。