Передайте значение потери другим моделям в Керасе - PullRequest
2 голосов
/ 28 июня 2019

Предположим, у меня есть две модели последовательно друг с другом.Я использую lstm для обоих.Я хочу получить прогноз от одного из них и найти потерю между прогнозируемой величиной и основополагающей правдой и передать это число, чтобы обновить другую модель.Может кто-нибудь сказать мне, куда добавить внешние потери извне в модель Keras.

Например.Рассмотрим потерю между прогнозируемым и истинным значением, равным 0,2.Я хочу передать этот 0.2 другой модели lstm keras как внешнее значение, чтобы добавить его с потерями от его вывода.enter image description here

Какая команда python с keras может сделать это и где я должен добавить эту потерю к какому модулю.Я думал, что это должно быть добавлено в model.compile, но потеря есть для целевой функции.Как я могу учесть эту потерю для следующего слоя, который он понимает, чтобы учесть его (при обновлении параметров с использованием SGD или любого оптимизатора в процессе обучения)

1 Ответ

0 голосов
/ 28 июня 2019

Если я вас правильно понимаю, то, что вы просите, нелегко достичь (и, возможно, не то, что вам нужно).

Сделав шаг назад, тренировочный шаг в модели керас примерно равен:

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 (умно) скрывает большую часть реализации 3-го из этих шагов (что я сильно упрощенно), но, тем не менее, это происходит и лежит в основе обучения keras / tf.

Это означает, что если у вас есть убыток от model1, то он не может быть разумно передан в model2 без включения операций из model1 внутри 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
...