这个问题是关于tf.losses.huber_loss()函数以及它如何应用于标量而不是矢量。谢谢你的时间!
我的模型类似于像MNIST这样的分类问题。我将我的代码基于TensorFlow图层教程,并在我认为合适的地方进行了更改。我不认为我的问题需要确切的代码。
我有一些标签,它在{0,..,8}中取整数值,转换成这样的单一标签:
onehot_labels = tf.one_hot(indices=tf.cast(labels, tf.int32), depth=n_classes)
模型中的最后一层是
logits = tf.layers.dense(inputs=dense4, units=n_classes)
转换为这样的预测:
predictions = {"classes": tf.argmax(input=logits, axis=1), "probabilities": tf.nn.softmax(logits, name="softmax_tensor")}
从教程开始,我开始使用tf.losses.softmax_cross_entropy()丢失函数。但在我的模型中,我预测哪个离散的bin值会下降。因此,我开始寻找一种损失函数,该函数可以转换为关闭一个bin的预测比两个bin关闭的问题少。类似于absolute_difference或Huber函数。
代码
onehot_labels = tf.one_hot(indices=tf.cast(labels, tf.int32), depth=n_classes)
loss = tf.losses.softmax_cross_entropy(onehot_labels=onehot_labels, logits=logits)
与优化器结合使用:
optimizer = tf.train.GradientDescentOptimizer(learning_rate=ps.learning_rate)
没有任何错误。更改为Huber功能时:
loss = tf.losses.huber_loss(labels=onehot_labels, predictions=logits)
仍然没有错误。但在这一点上,我不确定到底发生了什么。基于reduction definition我期望Huber函数成对地应用于向量的元素,然后求和或平均。
我想仅对标签整数({0,...,9})和预测值应用Huber函数:
preds = tf.argmax(input=logits, axis=1)
所以这就是我的尝试:
loss = tf.losses.huber_loss(labels=indices, predictions=preds)
这会引发错误
ValueError: No gradients provided for any variable
我发现在我的情况下我认为没有发生的两个常见原因:
This tf.Variable对象和损失函数之间没有路径。但由于经常使用我的预测代码并且标签是以整数形式提供的,所以我认为这不适用于此。
该函数不可导出为渐变。但是当向量用作输入时,Huber函数确实有效,所以我不认为是这种情况。
我的问题是:什么代码让我在我的两个整数张量(标签和预测)上使用Huber损失函数?