我正在构建一个神经网络,该网络可用于基于3个S型输出节点的概率进行决策。 我们将这三个选项称为A , B和C 因为决策基于比仅选择3个输出节点中的最高节点更为复杂的逻辑,所以我想实现一个反映决策逻辑的自定义损失函数。 但是,我在实现该功能时遇到问题。
我可能需要更改它,但这是我想使用的函数的初始版本,但使用了numpy数组而不是张量。 首先计算y_pred_new ,然后返回与y_true的平方差。
y_true的值编码为A=0 , B=0和C=2 。 这个想法是,如果A的输出概率比B的输出概率大10%,并且比C的输出概率大任意数量,则y_pred_new设置为0 (即A的预测)。 的预测B的结果,如果B输出概率大于A了10%和大于C通过任何量,并且如果没有,则y_pred_new默认为C ,编码为1 。
def custom_accuracy(y_true, y_pred):
# y_true is a (1,) numpy array
# y_pred is a (3,) numpy array
pred_sum = y_pred.sum()
a_pred = y_pred[0] / pred_sum
b_pred = y_pred[2] / pred_sum
c_pred = y_pred[1] / pred_sum
if a_pred - b_pred > 0.1 and a_pred > c_pred:
y_pred_new = 0
elif b_pred - a_pred > 0.1 and b_pred > c_pred:
y_pred_new = 2
else:
y_pred_new = 1
return (y_true - y_pred_new)**2
custom_accuracy(np.array([0]), np.array([1,0,0])) # prints as [0]
据我了解,处理损失函数内的张量有很多困难。 例如y_pred.numpy()不起作用。 尝试在具有张量的损失函数中实施此错误时,我遇到了另一个错误。
def custom_loss(y_true, y_pred):
K = keras.backend
pred_sum = K.sum(y_pred)
a_pred = y_pred[0] / pred_sum
b_pred = y_pred[2] / pred_sum
c_pred = y_pred[1] / pred_sum
if K.all(K.stack(K.greater(a_pred - b_pred, 0.1), K.greater(a_pred, c_pred))):
y_pred_new = K.variable([0])
elif K.greater(b_pred - a_pred, 0.1) and K.greater(b_pred, c_pred):
y_pred_new = K.variable([2])
else:
y_pred_new = K.variable([1])
return K.pow(y_true - y_pred_new, 2)
例如,使用上面的代码,我得到了错误:
OperatorNotAllowedInGraphError: using a `tf.Tensor` as a Python `bool` is not allowed in Graph execution. Use Eager execution or decorate this function with @tf.function.
是否可以在损失函数中做我想做的事情?