Keras损失函数的季节性

Keras损失函数的季节性,keras,slice,tensor,loss-function,Keras,Slice,Tensor,Loss Function,我似乎不知道如何正确地“切片”Keras中的数组/张量。我在写我自己的损失函数,我想加入一个季节效应。这里的简单想法是将值与一个时期前的值进行比较。在numpy中,我会这样写(每天一段时间): 但是,如果我想在Keras环境中这样做: K.mean(K.abs(y_true[24:] - y_true[-24:]), axis=-1) 我总是觉得形状不匹配 InvalidArgumentError:不兼容的形状 我现在的问题是: 如果y_-true和y_-pred不再是np.array,而是张

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

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

K.mean(K.abs(y_true[24:] - y_true[-24:]), axis=-1)
我总是觉得形状不匹配

InvalidArgumentError:不兼容的形状

我现在的问题是:


如果
y_-true
y_-pred
不再是np.array,而是张量,我怎么能在Keras损失函数中写出同样的结果呢

切片在张量中的工作方式与在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()

切片在张量中的工作方式与在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写成一个范围。关键是你需要考虑批量维度。感谢你的回答并回答你的问题:我的模型有一个1维的输出。关于你的回答:可能是我,我可能忽略了一些事情,但我看不出周期性是从哪里来的。或者这是在Keras环境中无法完成的事情吗?上面的示例演示了如何使用大小为2的单个维度对输出进行切片。它试图证明切片张量等价于切片np数组。您没有在问题中描述输出的形状。但是,您确实会给人这样的印象,即形状大于24,并且您正在尝试访问第一个和最后24个元素。这可以用Keras和numpy写成一个范围。关键是您需要考虑批处理维度。