【问题标题】:Implementing a custom loss function in Keras with a term like l1 regularisation在 Keras 中使用 l1 正则化等术语实现自定义损失函数
【发布时间】:2019-12-26 21:51:58
【问题描述】:

我正在创建自己的损失函数(我想在 Keras 的急切执行中使用它)。 我想在其中添加一个类似于 l1 损失函数的术语。

这就是我现在使用的损失函数

def loss(model, x, y, x_dev, y_dev, variables):
  y_ = model(x)
  y_dev_ = model(x_dev)

  y_temp = 1.5

  return loss_mae(y_true=y, y_pred=y_)+y_temp*
                K.mean(tf.convert_to_tensor(variables))

import keras.backend as K
def loss_mae(y_true, y_pred):
    return K.mean(K.abs(y_pred-y_true))

我的想法是在我的损失函数中添加一个常数 (y_temp),然后我想将它与可训练变量相乘(以实现类似于 l1 正则化项的效果)。

我尝试传递给loss() 函数model.trainable_variables 但这不起作用,我得到了一个

TypeError: can't multiply sequence by non-int of type 'numpy.float32'

有人有什么建议吗?

【问题讨论】:

    标签: python tensorflow keras neural-network loss-function


    【解决方案1】:

    您收到此错误的原因是因为在 Python 中您的表达式 y_temp*variables 意思是“取variablesy_temp 次并将它们合并为一个sequence”。

    换句话说,2 * [1, 2, 3] 不是[4, 5, 6],而是[1, 2, 3, 1, 2, 3]。显然,在这种情况下使用除整数之外的任何东西都没有什么意义。

    如果我理解正确,您正在尝试执行元素乘法。为此,您应该使用列表理解,例如 [x * 1.5 for x in [1, 2, 3]]

    顺便说一句,您还可以查看以下类似问题的答案: Python can't multiply sequence by non-int of type 'float'How do I multiply each element in a list by a number?

    【讨论】:

    • 谢谢...我刚刚注意到并正要纠正它...愚蠢的错误。但是我仍然有同样的问题......我可能会通过在 Tensorflow 中使用低级 API 来解决它。还是谢谢...
    • 不完全。我进一步修改了我的问题,以添加更多关于我尝试过的信息。在这里解释可能太复杂了......但我会尝试。午饭前会更新。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-08-20
    • 2018-05-25
    • 2021-05-23
    • 2021-10-25
    • 2020-02-03
    • 2020-12-19
    • 2017-12-18
    相关资源
    最近更新 更多