Python Tensorflow损失函数当提供标量时无梯度误差
这个问题是关于tf.loss.huber_loss()函数的,以及如何将它应用于标量而不是向量。谢谢你抽出时间 我的模型类似于MNIST这样的分类问题。我的代码基于TensorFlow层教程,并在我认为合适的地方进行了更改。我不认为我的问题需要确切的代码 我的标签采用{0,…,8}中的整数值,并将其转换为onehot标签,如下所示:Python Tensorflow损失函数当提供标量时无梯度误差,python,tensorflow,neural-network,Python,Tensorflow,Neural Network,这个问题是关于tf.loss.huber_loss()函数的,以及如何将它应用于标量而不是向量。谢谢你抽出时间 我的模型类似于MNIST这样的分类问题。我的代码基于TensorFlow层教程,并在我认为合适的地方进行了更改。我不认为我的问题需要确切的代码 我的标签采用{0,…,8}中的整数值,并将其转换为onehot标签,如下所示: onehot_labels = tf.one_hot(indices=tf.cast(labels, tf.int32), depth=n_classes) p
onehot_labels = tf.one_hot(indices=tf.cast(labels, tf.int32), depth=n_classes)
predictions = {"classes": tf.argmax(input=logits, axis=1), "probabilities": tf.nn.softmax(logits, name="softmax_tensor")}
模型中的最后一层是
logits = tf.layers.dense(inputs=dense4, units=n_classes)
将其转换为如下预测:
onehot_labels = tf.one_hot(indices=tf.cast(labels, tf.int32), depth=n_classes)
predictions = {"classes": tf.argmax(input=logits, axis=1), "probabilities": tf.nn.softmax(logits, name="softmax_tensor")}
在教程中,我从tf.loss.softmax\u cross\u entropy()损失函数开始。但在我的模型中,我预测的是离散化后的bin a值将在哪个位置下降。所以我开始寻找一个损失函数,它可以解释一个料仓关闭的预测比两个料仓关闭的预测问题要小。类似于绝对差值或休伯函数
代码
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)
仍然没有错误。但在这一点上,我不确定到底发生了什么。基于这一点,我希望对向量的元素成对应用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
我发现了两个我认为在我的情况下不会发生的常见原因:
- 变量对象和损失函数之间没有路径。但是由于我的预测代码经常被使用,并且标签是作为整数提供的,我认为这不适用于这里
- 该函数不能导出为梯度。但当向量被用作输入时,Huber函数确实起作用,所以我认为情况并非如此