ValueError:操作的梯度为“无”。在Keras中实现自定义损失功能时

时间:2019-07-29 07:05:18

标签: tensorflow keras loss-function

我正在尝试从this SO post实现以下自定义损失函数;但是,我必须进行一些小的更改以适合我的模型。

def _cohen_kappa(y_true, y_pred, num_classes=5, weights=None, metrics_collections=None, updates_collections=None, name=None):
    kappa, update_op = tf.contrib.metrics.cohen_kappa(y_true, y_pred, num_classes, weights, metrics_collections, updates_collections, name)
    kappa = K.cast(kappa, 'float32')
    K.get_session().run(tf.local_variables_initializer())
    with tf.control_dependencies([update_op]):
        kappa = tf.identity(kappa)
    return kappa


def cohen_kappa_loss(num_classes=5, weights=None, metrics_collections=None, updates_collections=None, name=None):
    def cohen_kappa(y_true, y_pred):
        y_true = K.cast(y_true, 'int32')
        y_pred = K.cast(y_pred + 0.5, 'int32')

        y_true = K.sum(y_true, axis=1)
        y_pred = K.sum(y_pred, axis=1)

        return -_cohen_kappa(y_true, y_pred, num_classes, weights, metrics_collections, updates_collections, name)
    return cohen_kappa

不幸的是,我收到以下错误,这是令人困惑的,因为我的损失函数不包含K.argmax, K.round, K.eval.,在错误消息中将其称为不可微分的操作。 我的自定义损失函数中是否还有另一个不可微分的操作,我没有注意到这给了我这个错误?

Traceback (most recent call last):
  File "small_test.py", line 106, in <module>
    main()
  File "small_test.py", line 101, in main
    max_queue_size=2
  File "C:\Users\Patrick\Anaconda3\envs\tensor\lib\site-packages\keras\legacy\interfaces.py", line 91, in wrapper
    return func(*args, **kwargs)
  File "C:\Users\Patrick\Anaconda3\envs\tensor\lib\site-packages\keras\engine\training.py", line 1418, in fit_generator
    initial_epoch=initial_epoch)
  File "C:\Users\Patrick\Anaconda3\envs\tensor\lib\site-packages\keras\engine\training_generator.py", line 40, in fit_generator
    model._make_train_function()
  File "C:\Users\Patrick\Anaconda3\envs\tensor\lib\site-packages\keras\engine\training.py", line 509, in _make_train_function
    loss=self.total_loss)
  File "C:\Users\Patrick\Anaconda3\envs\tensor\lib\site-packages\keras\legacy\interfaces.py", line 91, in wrapper
    return func(*args, **kwargs)
  File "C:\Users\Patrick\Anaconda3\envs\tensor\lib\site-packages\keras\optimizers.py", line 184, in get_updates
    grads = self.get_gradients(loss, params)
  File "C:\Users\Patrick\Anaconda3\envs\tensor\lib\site-packages\keras\optimizers.py", line 91, in get_gradients
    raise ValueError('An operation has `None` for gradient. '
ValueError: An operation has `None` for gradient. Please make sure that all of your ops have a gradient defined (i.e. are differentiable). Common ops without gradient: K.argmax, K.round, K.eval.

0 个答案:

没有答案