【问题标题】:Custom Loss Function Error: ValueError: No gradients provided for any variable自定义损失函数错误:ValueError:没有为任何变量提供梯度
【发布时间】:2021-12-31 21:10:52
【问题描述】:

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

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

这是我的损失函数。它用于加密货币预测。 y_true 是价格变化值,y_pred 值四舍五入为 0/1(sigmoid)。它用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

这就是损失函数返回的张量。

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'].

任何想法如何解决这个问题?

【问题讨论】:

  • 可能是因为您将所有内容都转换为 NumPy 数组:y_pred.numpy()。 AFAIK,自动微分适用于特殊类型的值而不是普通浮点数,但是一旦你强制一切都是浮点数,autodiff 要么中断,要么求助于不精确的近似值,如(f(x + dx) - f(x)) / dx
  • @ForceBru 有没有其他方法可以检索 y_true[index] 而无需将其转换为 numpy?或者使用 keras 后端功能实现相同目标的另一种方法?
  • indexing 不起作用吗?根据this answer,索引在损失函数中应该可以正常工作
  • @ForceBru -- 你是对的。我已经更新了损失函数。现在它不使用 numpy() 函数但仍然产生相同的错误。

标签: python tensorflow keras deep-learning


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-05-08
    • 2022-12-04
    • 1970-01-01
    • 2020-04-05
    • 2021-01-08
    • 1970-01-01
    • 2019-05-09
    相关资源
    最近更新 更多