在Keras嵌套模型的训练过程中显示哪些损失?

在Keras嵌套模型的训练过程中显示哪些损失?,keras,Keras,我有一个由3个其他Keras模型(嵌套模型)组成的Keras模型。我的问题是关于Keras培训日志中显示的损失值的含义 以下是我的全球模型摘要: __________________________________________________________________________________________________ Layer (type) Output Shape Param # Connected to

我有一个由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_1
model_4
)和1个解码器(
decoder

我还有3个损耗:2个损耗直接应用于
model_4
输出中的2个,一个损耗应用于解码器的输出

当我训练整个模型时,我只看到
model\u 4
一个损失,这被称为
model\u 4\u损失

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个输出):

关于这一点,我有几个问题:

  • 在培训完整型号时,我是否应该看到3个损失,而不是2个(2个用于
    型号4
    ,1个用于
    解码器
  • model_4_loss
    代表什么?来自
    model_4
    的两个损失的平均值?总和?两个损失中只有一个
  • 如何使培训日志清楚地显示
    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))
多谢各位

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))