【发布时间】: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