我需要将其他信息合并到Keras损失函数中,该函数取决于当前批次。由于Keras只丢失两个参数,我考虑通过在生成器对象上调用next()函数来添加此信息。但是,生成器只被调用一次(可能在model.compile()中添加了loss函数)。 以下是示例代码:
data_batches = yield_data_batches()
meta_batches = yield_meta_batches()
....
model.compile(loss=loss_function, ...)
model.fit_generator(generator=data_batches, ....)
def loss_function(x, y):
meta_x, meta_y = next(meta_batches)
x *= meta_x # component-wise matrix multiplication
y *= meta_y # component-wise matrix multiplication
return mse(x, y)
有没有办法让loss函数在每次在data_batch上计算时获得一个新的meta_batch?或者是否有其他方法将此元信息合并到损失函数中?
澄清: meta_x和meta_y是二元矩阵,它们应该从预测中抵消某些元素,因为它们不应该计入损失。 例如:
y_true = (a,b,c,0)
y_pred = (d,e,f,g)
y_meta = (1,1,1,0)
现在,y_pred * y_meta应该取消g,以便它不计入损失。
答案 0 :(得分:0)
这不起作用,因为将编译损失函数并将其添加到计算图中。您的损失功能可能仅取决于y_pred
和y_true
。
您可以将此信息合并到y_true
中,或者使用样本权重对结果损失进行加权。
您的方法相当于两者的组合: 假设正权重a和b(你称之为meta_x和meta_y): | AX-由| = a | x-b / a * y |,所以你只需将y_pred加权为b / a并加上样本权重a。