Используйте оба убытка в подсети комбинированных сетей - PullRequest
0 голосов
/ 14 ноября 2018

Я пытаюсь объединить две сети. Я хочу рассчитать потери каждой сети в отдельности. Например, на изображении ниже; потеря LSTM1 должна составлять (Loss1 + Loss2) , а потеря системы должна составлять (Loss2)

stacked networks

Я реализовал сеть, как показано ниже, с идеей выше, но не знаю, как ее скомпилировать и запустить.

def build_lstm1():
    x = Input(shape=(self.timesteps, self.input_dim,), name = 'input')
    h = LSTM(1024, return_sequences=True))(x)
    scores = TimeDistributed(Dense(self.input_dim, activation='sigmoid', name='dense'))(h)
    LSTM1 = Model(x, scores)
    return LSTM1


def build_lstm2():
    x = Input(shape=(self.timesteps, self.input_dim,), name = 'input')
    h = LSTM(1024, return_sequences=True))(x)
    labels = TimeDistributed(Dense(self.input_dim, activation='sigmoid', name='dense'))(h)
    LSTM2 = Model(x, labels)
    return LSTM2




lstm1 = build_lstm1()
lstm2 = build_lstm2()


combined = Model(inputs = lstm1.input ,
                 outputs = [lstm1.output,
                            lstm2(lstm1.output).output)])

1 Ответ

0 голосов
/ 14 ноября 2018

Это неправильный способ использования функционального API модели Keras. Также невозможно потерять LSTM1 как Loss1 + Loss2. Это будет только Loss1. Аналогично для LSTM2 это будет только Loss2. Однако для объединенной сети вы можете использовать любую линейную комбинацию Loss1 и Loss2 в качестве общей потери, т.е.

Loss_overall = a.Loss1 + b.Loss2. где a, b - неотрицательные действительные числа

Настоящая сущность Model Functional API заключается в том, что он позволяет создавать архитектуру глубокого обучения с несколькими выходами и несколькими входами в одной модели.

def build_lstm_combined():
    x = Input(shape=(self.timesteps, self.input_dim,), name = 'input')
    h_1 = LSTM(1024, return_sequences=True))(x)
    scores = TimeDistributed(Dense(self.input_dim, activation='sigmoid', name='dense'))(h_1)
    h_2 = LSTM(1024, return_sequences=True))(h_1)
    labels = TimeDistributed(Dense(self.input_dim, activation='sigmoid', name='dense'))(h_2)
    LSTM_combined = Model(x,[scores,labels])
    return LSTM_combined

У этой комбинированной модели есть потери, которые являются комбинацией Loss1 и Loss2. При составлении модели вы можете указать вес каждой потери, чтобы получить общую потерю. Если ваш желаемый урон равен 0.5Loss1 + Loss2, вы можете сделать это:

model_1 = build_lstm_combined()
model_1.compile(optimizer=Adam(0.001), loss = ['categorical_crossentropy','categorical_crossentropy'],loss_weights= [0.5,1])
...