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
我正在使用具有非二进制 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