Custom Loss Function Error: ValueError: No gradients provided for any variable

Custom Loss Function Error: ValueError: No gradients provided for any variable

我正在使用具有非二进制 Y 值和 S 形激活层的二进制交叉熵模型。

我已经创建了我的第一个自定义损失函数,但是当我执行它时出现错误“ValueError:没有为任何变量提供梯度:[....]”

这是我的损失函数。它用于加密货币预测。 y_true 是价格变化值,y_pred 值四舍五入为 0/1(S 型曲线)。它用 price_change * 3 惩罚误报,用 price_change 惩罚漏报。我知道我的损失函数与常规损失函数不同,但我不知道如何使用这些函数实现此目标。

def loss(y_true, y_pred):
    penalizer = 3
    batch_size = 64
    #loss_values = []
    loss_values = np.zeros(batch_size)
    for index in range(batch_size):
        pred = y_pred[index][0]
        #if pred >= 0.5:
        #   pred = 1
        #else:
        #   pred = 0
        #pred = tf.round(pred)
        differentiable_round = tf.maximum(pred - 0.499, 0)
        differentiable_round = differentiable_round * 10000
        pred = tf.minimum(differentiable_round, 1)
        lookup = y_true[index][0]
        if K.equal(pred, 1):
            if K.greater(lookup, 0):
                loss_values[index] = 0.0
            else:
                loss_values[index] = lookup * penalizer * -1
        else:
            if K.equal(lookup, 0):
                loss_values[index] = 0.0
            elif K.greater(lookup, 0):
                loss_values[index] = lookup
            else:
                loss_values[index] = 0.0
    loss_values = K.constant(loss_values)
    return loss_values

这是损失函数returns.

的张量
tf.Tensor(
[ 0.          0.          0.          0.          2.76        0.
  2.16        3.75        0.          2.04        0.          0.03
  0.          0.          0.          2.8799999   1.41        0.
  0.          1.11        0.          2.79        1.2         0.
  0.69        1.92        0.          8.64        0.          6.2999997
  0.          0.          1.05        0.          4.08        0.84000003
  0.          0.          5.43        8.16        0.          0.
  0.6         3.87        0.          0.75        3.72        0.35999998
  1.74        8.07       13.92        1.74        4.41        0.
  1.23        0.          2.76        7.68        0.          0.63
  4.4700003   4.29        0.         10.59      ], shape=(64,), dtype=float32)

错误信息:

Traceback (most recent call last):
  File "/vserver/storages///packages//trader/classes/neuralnet/numbers/categorical.py", line 1356, in <module>
    neuralnet.train(refresh="--refresh" in sys.argv)
  File "/vserver/storages///packages//trader/classes/neuralnet/numbers/categorical.py", line 783, in train
    history = self.model.model.fit(
  File "/home/administrator/venv/lib/python3.8/site-packages/keras/engine/training.py", line 1184, in fit
    tmp_logs = self.train_function(iterator)
  File "/home/administrator/venv/lib/python3.8/site-packages/keras/engine/training.py", line 853, in train_function
    return step_function(self, iterator)
  File "/home/administrator/venv/lib/python3.8/site-packages/keras/engine/training.py", line 842, in step_function
    outputs = model.distribute_strategy.run(run_step, args=(data,))
  File "/home/administrator/venv/lib/python3.8/site-packages/tensorflow/python/distribute/distribute_lib.py", line 1286, in run
    return self._extended.call_for_each_replica(fn, args=args, kwargs=kwargs)
  File "/home/administrator/venv/lib/python3.8/site-packages/tensorflow/python/distribute/distribute_lib.py", line 2849, in call_for_each_replica
    return self._call_for_each_replica(fn, args, kwargs)
  File "/home/administrator/venv/lib/python3.8/site-packages/tensorflow/python/distribute/distribute_lib.py", line 3632, in _call_for_each_replica
    return fn(*args, **kwargs)
  File "/home/administrator/venv/lib/python3.8/site-packages/tensorflow/python/autograph/impl/api.py", line 597, in wrapper
    return func(*args, **kwargs)
  File "/home/administrator/venv/lib/python3.8/site-packages/keras/engine/training.py", line 835, in run_step
    outputs = model.train_step(data)
  File "/home/administrator/venv/lib/python3.8/site-packages/keras/engine/training.py", line 791, in train_step
    self.optimizer.minimize(loss, self.trainable_variables, tape=tape)
  File "/home/administrator/venv/lib/python3.8/site-packages/keras/optimizer_v2/optimizer_v2.py", line 522, in minimize
    return self.apply_gradients(grads_and_vars, name=name)
  File "/home/administrator/venv/lib/python3.8/site-packages/keras/optimizer_v2/optimizer_v2.py", line 622, in apply_gradients
    grads_and_vars = optimizer_utils.filter_empty_gradients(grads_and_vars)
  File "/home/administrator/venv/lib/python3.8/site-packages/keras/optimizer_v2/utils.py", line 72, in filter_empty_gradients
    raise ValueError("No gradients provided for any variable: %s." %
ValueError: No gradients provided for any variable: ['conv1d/kernel:0', 'conv1d_1/kernel:0', 'conv1d_2/kernel:0', 'conv1d_3/kernel:0', 'lstm/lstm_cell/kernel:0', 'lstm/lstm_cell/recurrent_kernel:0', 'lstm/lstm_cell/bias:0', 'lstm_1/lstm_cell_1/kernel:0', 'lstm_1/lstm_cell_1/recurrent_kernel:0', 'lstm_1/lstm_cell_1/bias:0', 'lstm_2/lstm_cell_2/kernel:0', 'lstm_2/lstm_cell_2/recurrent_kernel:0', 'lstm_2/lstm_cell_2/bias:0', 'lstm_3/lstm_cell_3/kernel:0', 'lstm_3/lstm_cell_3/recurrent_kernel:0', 'lstm_3/lstm_cell_3/bias:0', 'dense/kernel:0', 'dense/bias:0', 'dense_1/kernel:0', 'dense_1/bias:0', 'dense_2/kernel:0', 'dense_2/bias:0'].

有什么解决办法吗?

我找到了我想使用的损失函数的正确可微代码。

def loss(y_true, y_pred):
    y_true_onehot = tf.where(
        tf.greater(y_true, 0.0),
        1.0,
        0.0
    )
    loss_values = keras.losses.BinaryCrossentropy()(y_true_onehot, y_pred)
    mask = tf.where(
        tf.logical_or(
            tf.logical_and(tf.greater(y_true, 0.0), tf.greater_equal(y_pred, 0.5)),
            tf.logical_and(tf.less(y_true, 0.0), tf.less(y_pred, 0.5)),
        ),
        0.0,
        1.0
    )[:,0]
    loss_values = tf.multiply(loss_values, mask)
    return loss_values