当提供标量时,Tensorflow损失函数没有梯度误差

时间:2017-10-23 19:28:55

标签: python tensorflow neural-network

这个问题是关于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损失函数?

0 个答案:

没有答案