在训练卡拉斯嵌套模型期间显示了哪些损失



i具有由其他3种keras模型(嵌套模型(组成的keras模型。我的问题是关于Keras训练日志中显示的损失值的含义。

这是我的全局模型的摘要:

__________________________________________________________________________________________________
Layer (type)                    Output Shape         Param #     Connected to                     
==================================================================================================
input_16 (InputLayer)           (None, 256, 256, 3)  0                                            
__________________________________________________________________________________________________
model_1 (Model)                 (None, 16, 16, 128)  690368      input_16[0][0]                   
__________________________________________________________________________________________________
model_4 (Model)                 [(None, 17, 4), (None, 17, 4), (None, 16, 16, 128)] 5103826     input_16[0][0]                   
__________________________________________________________________________________________________
concatenate_8 (Concatenate)     (None, 16, 16, 256)  0           model_1[1][0]                    
                                                                 model_4[1][2]                    
__________________________________________________________________________________________________
decoder (Model)                 (None, 256, 256, 3)  582843      concatenate_8[0][0]              
==================================================================================================

这些嵌套模型是2个编码器(model_1model_4(和1个解码器(decoder(。

i也有3个损失:直接将2个损失用于model_4输出的2个损失,以及一种应用于解码器的输出的损失。

当我训练完整的模型时,我只看到model_4一个损失,称为model_4_loss

Epoch 34/60
13548/19512 [===================>..........] - ETA: 34:57 - loss: 0.6764 - decoder_loss: 0.0944 - model_4_loss: 0.2797

但是,当我仅尝试训练model_4时,我在训练日志中明显看到了这2个损失(在这里,concatenate_xxx损失对应于model_4前2个输出(:

Epoch 35/60
 5430/19512 [=======>......................] - ETA: 1:20:14 - loss: 0.8475 - concatenate_5_loss: 0.2998 - concatenate_7_loss: 0.2767

我有几个问题:

  • 训练完整的模型时,我不应该看到3个损失而不是2损失(model_4的2个损失,一个用于decoder
  • model_4_loss代表什么?model_4损失2损失的平均值?总和?两者中只有一个?
  • 如何使训练日志显示model_4的两个损失,而不是某些汇总值?

提供更多上下文,这是我如何构建整个模型的摘要:

encoder1 = build_encoder1()   # returns an object of type `Model` with a single (None, 16, 16, 128) output
encoder2 = build_encoder2()   # returns an object of type `Model` with a list of 3 tensors as output
decoder = build_decoder()     # returns a `Model` with a single (None, 256, 256, 3) output
inp = Input(shape=input_shape)      # input_shape is (None, 256, 256, 3)
z_1 = encoder1(inp)                 # (None, 16, 16, 128)
out1, out2, z_2 = encoder2(inp)     # [(None, 17, 4), (None, 17, 4), (None, 16, 16, 128)]
concat = concatenate[z_1, z_2]      # (None, 16, 16, 256)
out3 = decoder(concat)              # (None, 256, 256, 3)
outputs = [out3, out1, out2]
losses = [loss1(), loss2(), loss2()]     # loss1 is a custom loss function managing the (None, 256, 256, 3) output and loss2 is another managing the (None, 17, 4) outputs
model = Model(inputs=inp, outputs=outputs)
model.compile(loss=losses, optimizer=RMSprop(lr=start_lr))

非常感谢!

您可以命名模型,即将name="YourName1"添加为Model构造函数中的参数。然后,您可以通过这样的dict将dict通过:

,而不是向model.compile方法提供损失列表。
losses = {
    "YourName1": loss1(),
    "YourName2": loss2(),
    "YourName3": loss2()
}
model = Model(inputs=inp, outputs=outputs)
model.compile(loss=losses, optimizer=RMSprop(lr=start_lr))

nb:如果YourName2YourName3模型都可以使用。

,您可以两次损失loss2()

最新更新