Тренировка одной и той же модели с двумя разными выходами с помощью Keras - PullRequest
1 голос
/ 23 апреля 2020

У меня есть простая сеть GRU, закодированная с Keras в python, как показано ниже:

gru1  = GRU(16, activation='tanh', return_sequences=True)(input)
dense  = TimeDistributed(Dense(16, activation='tanh'))(gru1)
output = TimeDistributed(Dense(1, activation="sigmoid"))(dense)

Я использовал сигмовидную активацию для вывода, так как моей целью является классификация. Но мне нужно использовать ту же модель для регрессии. Мне нужно изменить выходной активации как линейный. Тем не менее, остальная сеть остается прежней. Поэтому в этом случае я буду использовать две разные сети для двух разных целей. Входы одинаковые. Но выходы - это классы для сигмоида и значения для линейной активации.

Мой вопрос: есть ли способ использовать только одну сеть, но получить два разных выхода в конце? Спасибо.

1 Ответ

1 голос
/ 23 апреля 2020

Да, вы можете использовать функциональный API для разработки модели с несколькими выходами. Вы можете сохранить общие слои и 2 разных выхода, один с сигмоидом, другой с линейной активацией.

Примечание: не используйте input в качестве переменной, это имя функции в python.

* 1005. *
Model: "model_1"
__________________________________________________________________________________________________
Layer (type)                    Output Shape         Param #     Connected to                     
==================================================================================================
input_3 (InputLayer)            [(None, 100, 1)]     0                                            
__________________________________________________________________________________________________
gru_2 (GRU)                     (None, 100, 16)      912         input_3[0][0]                    
__________________________________________________________________________________________________
time_distributed_3 (TimeDistrib (None, 100, 16)      272         gru_2[0][0]                      
__________________________________________________________________________________________________
time_distributed_4 (TimeDistrib (None, 100, 1)       17          time_distributed_3[0][0]         
__________________________________________________________________________________________________
time_distributed_5 (TimeDistrib (None, 100, 1)       17          time_distributed_3[0][0]         
==================================================================================================
Total params: 1,218
Trainable params: 1,218
Non-trainable params: 0

Компиляция с двумя функциями потерь:

losses = {
    "out1": "binary_crossentropy",
    "out2": "mse",
}

# initialize the optimizer and compile the model

model.compile(optimizer='adam', loss=losses, metrics=["accuracy", "mae"])
...