Какая потеря отображается во время обучения вложенных моделей Keras? - PullRequest
1 голос
/ 02 мая 2019

У меня есть модель Keras, состоящая из 3 других моделей 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 выходам, и одна потеря, которая применяется к выходу декодера.

Когда я тренирую полную модель, я вижу только 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 (2 для model_4 и один для decoder?
  • Что означает model_4_loss? Среднее значение 2 потерь от 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))

Большое спасибо!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...