【问题标题】:Pass the loss value to other models in Keras将损失值传递给 Keras 中的其他模型
【发布时间】:2019-11-10 02:39:17
【问题描述】:

假设我有两个彼此串联的模型。我对两者都使用 lstm。我想从其中一个进行预测,并找到预测值和基本事实之间的损失,然后传递这个数字来更新另一个模型。谁能告诉我在哪里将外部损失添加到 Keras 模型中。

例如。考虑预测值和真实值之间的损失为 0.2。我想将此 0.2 作为外部值传递给另一个 lstm keras 模型,以将其与输出的损失相加。

什么带有 keras 的 python 命令可以做到这一点,我应该在哪里将这个损失添加到什么模块。我认为应该将它添加到 model.compile 但目标函数的损失。我如何将这种损失考虑到它理解的下一层(在使用 SGD 或训练中的任何优化器更新参数时)

【问题讨论】:

  • 您的目标是让模型 1 预测模型 2 的误差吗?最简单的方法:训练模型 2,生成一组预测,测量错误并将其用作模型 1 的训练数据。如果您的目标是让模型 1 对您的任务的预测做出贡献,那么这个问题就没有很好地表述。例如,如果您希望两个模型在预测上协作,您可以让模型 1 和模型 2 生成预测,然后在计算损失之前进行平均。
  • 是的,我需要将模型 1 的损失传递给模型 2。这意味着模型 1 应该有助于模型 2 的预测。假设有一些损失对应于第一部分,我该如何使用这个损失更新下一部分。我需要按顺序做出决定,因此我应该能够传递损失以确保不同的模型可以调整它们的参数。

标签: python tensorflow keras deep-learning lstm


【解决方案1】:

如果我对您的理解正确,那么您所要求的并不容易实现(也许不是您所需要的)。

退一步,keras模型中的一个训练步骤大致是:

predictions = model(train_x)
loss = some_loss_function(true_labels, predictions)
do_backprop_etc_to_update_model_in_order_to_minimize_loss(loss_operations)

keras & tf(巧妙地)隐藏了这些步骤中第三个步骤的大部分实现(我已经过分简化了),但它仍然发生并且是 keras/tf 训练的核心。

这意味着如果你有一个来自model1 的损失,那么如果不包括来自model1 inside model2 的操作(实际上就像model3 可以做所有事情 - 包括两个输出。我想这就是你真正想要的吗?)

如果您选择单个模型而不是您描述的架构,那么您可以有 2 个不同的输出,每个输出都有自己的损失函数。此外,您的第二个损失函数可以任意复杂(因此可以包括第一个损失函数的计算)。

这样的架构或许就是一个例子:

inputs = Input(shape=(17,))
dense1 = Dense(32, activation='relu')(inputs)
dense2 = Dense(18, activation='relu')(dense1)
dense3 = Dense(7, activation='relu')(dense2)
out1 = Softmax()(dense3)
out2 = Dense(1, activation='sigmoid')(dense2)

model = Model(inputs=inputs, outputs=[out1,out2])
__________________________________________________________________________________________________
Layer (type)                    Output Shape         Param #     Connected to                     
==================================================================================================
input_2 (InputLayer)            [(None, 17)]         0                                            
__________________________________________________________________________________________________
dense_3 (Dense)                 (None, 32)           576         input_2[0][0]                    
__________________________________________________________________________________________________
dense_4 (Dense)                 (None, 18)           594         dense_3[0][0]                    
__________________________________________________________________________________________________
dense_5 (Dense)                 (None, 7)            133         dense_4[0][0]                    
__________________________________________________________________________________________________
softmax_1 (Softmax)             (None, 7)            0           dense_5[0][0]                    
__________________________________________________________________________________________________
dense_6 (Dense)                 (None, 1)            19          dense_4[0][0]                    
==================================================================================================
Total params: 1,322
Trainable params: 1,322
Non-trainable params: 0

【讨论】:

  • 谢谢,我需要的是模型 2 将模型 1 的损失考虑在内,并使用此损失及其自身的损失来更新参数。假设我的问题是顺序决策,我需要每个模型根据最后阶段对应的损失调整参数,否则会随着时间的推移累积错误。
  • 我描述的架构就是这样做的。然后你的损失变成loss1loss2 的组合(通常是一个总和,但你也可以加权每个) - 更新参数以最小化这种组合损失,我认为这是你需要的
  • 我认为我的上一条评论与您所做的编辑有交叉。我不知道你所说的“错误会随着时间的推移而积累”是什么意思
  • @user59419 如果您希望模型执行顺序决策,请独立训练它们。即训练模型 2 将用于训练模型 1 的地面实况标签作为输入。
  • 我同意@PedroMarques。它要么是独立的决策(在这种情况下是独立的培训)。或者,您希望调用 model1 中的层的参数取决于组合损失。我认为这是其中之一 - 我看不到第三种方式,即一半一半另一半。
猜你喜欢
  • 2019-10-06
  • 2020-11-08
  • 1970-01-01
  • 2021-05-02
  • 1970-01-01
  • 1970-01-01
  • 2020-09-02
  • 2013-02-15
  • 2019-04-28
相关资源
最近更新 更多