Tensorflow:实现新的损失函数返回一个" ValueError:没有为任何变量提供渐变"

时间:2017-05-17 11:16:03

标签: python tensorflow gradient valueerror loss-function

我需要为我的深层网络实现一个新的丢失功能,如下所示:

import tensorflow as tf
from tensorflow.python import confusion_matrix
from tensorflow.python.ops import math_ops
from tensorflow.python.ops import array_ops

def gms_loss(targets=None, logits=None, name=None):
    #Shape checking
    try:
        targets.get_shape().merge_with(logits.get_shape())
    except ValueError:
        raise ValueError("logits and targets must have the same shape (%s vs %s)"
                         % (logits.get_shape(), targets.get_shape()))
    #Compute the confusion matrix
    predictions=tf.nn.softmax(logits)
    cm=confusion_matrix(tf.argmax(targets,1),tf.argmax(predictions,1),3)

    def compute_sensitivities(name):
        """Compute the sensitivity per class via the confusion matrix."""
        per_row_sum = math_ops.to_float(math_ops.reduce_sum(cm, 1))
        cm_diag = math_ops.to_float(array_ops.diag_part(cm))
        denominator = per_row_sum

        # If the value of the denominator is 0, set it to 1 to avoid
        # zero division.
        denominator = array_ops.where(
            math_ops.greater(denominator, 0), denominator,
            array_ops.ones_like(denominator))

        accuracies = math_ops.div(cm_diag, denominator)
        return accuracies

    gms = math_ops.reduce_prod(compute_sensitivities('sensitivities'))
    return gms

以下是图表代码中的调用:

test=gms_loss(targets=y,logits=pred)
optimizer = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(test)

最后,已知的错误:

"ValueError: No gradients provided for any variable, check your graph for ops that do not support gradients, between variables..."

我无法找到问题,如果我使用softmax_cross_entropy,它可以工作(但无法正确优化,这就是为什么我需要新的损失函数)

提前谢谢

1 个答案:

答案 0 :(得分:2)

我认为问题是tf.argmax()功能不可区分。因此,优化程序将无法根据您的预测和目标计算损失函数的梯度。我不知道用argmax函数处理这个问题的方法,所以我建议避免使用不可微函数。