【问题标题】:Seasonality in Keras loss functionKeras 损失函数的季节性
【发布时间】:2019-11-30 11:14:46
【问题描述】:

我似乎无法弄清楚如何在 Keras 中正确地“切片”数组/张量。我正在编写自己的损失函数,并且想加入季节性效应。这里的简单想法是将值与一个时期前的值进行比较。在 numpy 中,我会写这样的东西(每天):

np.mean(np.abs(y_true[24:] - y_true[-24:]))

但是,如果我想在这样的 Keras 环境中做同样的事情:

K.mean(K.abs(y_true[24:] - y_true[-24:]), axis=-1)

我总是得到形状不匹配

InvalidArgumentError:不兼容的形状

我现在的问题是:

如何在 Keras 损失函数中编写相同的内容,其中 y_truey_pred 不再是 np.arrays,而是张量?

【问题讨论】:

    标签: keras slice tensor loss-function


    【解决方案1】:

    在张量中切片的工作方式与在 numpy 中相同;需要注意的是,张量在训练/进行推理时具有批量维度,在定义模型时通常是未定义的。

    我会帮助您更多地了解您的模型的细节;例如,该问题没有举例说明模型输出尺寸,但举例来说,如果一个模型的输出大小为 2,则一个函数将 mse 损失应用于一个输出并将 mae 应用于另一个输出可能是写成:

    def custom_loss(y_true, y_pred):
      err0 = keras.losses.mean_squared_error(y_true[:, 0], y_pred[:, 0])
      err1 = keras.losses.mean_absolute_error(y_true[:, 1], y_pred[:, 1])
      return err0 + err1
    
    

    使用示例:

    inp = keras.layers.Input(shape=(4,))
    out = keras.layers.Dense(2)(inp)
    model = keras.models.Model(inp, out)
    model.compile('adam', custom_loss)
    
    model = make_model()
    model.summary()
    

    【讨论】:

    • 感谢您的回复并回答您的问题:我的模型具有一维输出。关于您的回答:可能是我,我可能忽略了一些事情,但我看不到周期性出现的位置。或者这是在 Keras 环境中无法完成的事情?
    • 上面的例子展示了如何使用大小为 2 的一维对输出进行切片。它试图证明切片张量等同于切片 np 数组。您没有在问题中描述输出的形状。但是,您确实给人的印象是形状大于 24,并且您正在尝试访问第一个和最后 24 个元素。这可以在 Keras 和 numpy 中写成一个范围。关键是需要考虑批次维度。
    猜你喜欢
    • 2018-10-10
    • 2018-10-21
    • 2019-12-09
    • 2019-04-11
    • 1970-01-01
    • 2018-04-03
    • 2019-01-20
    • 1970-01-01
    • 2023-03-05
    相关资源
    最近更新 更多