Конвертировать код в новую версию keras (функциональный API) или как объединить 2 модели - PullRequest
0 голосов
/ 22 января 2019

Мегре больше не работает.Я попробовал новый функциональный API (объединить, добавить, умножить), но он не работает для моделей.Как это реализовать?

lower_model = [self.build_network(self.model_config['critic_lower'], input_shape=(self.history_length, self.n_stock, 1)) 
                               for _ in range(1  + self.n_smooth + self.n_down)]
                merged = Merge(lower_model, mode='concat')
                # upper layer
                upper_model = self.build_network(self.model_config['critic_upper'],  model=merged)
                # action layer
                action = self.build_network(self.model_config['critic_action'], input_shape=(self.n_stock,), is_conv=False)
                # output layer
                merged = Merge([upper_model, action], mode='mul')
                model = Sequential()
                model.add(merged)
                model.add(Dense(1))
                return model

Ответы [ 2 ]

0 голосов
/ 22 января 2019

Это грязный обходной путь, показывающий, как получать входные и выходные тензоры из моделей и использовать с ними сцепленные слои.Также вы узнаете, как использовать Dense и другие слои с тензорами и создавать функциональные модели API.

В идеале вам следует переписать все, что находится внутри build_network, для чистого и оптимизированного кода.(Возможно, это даже не работает в зависимости от содержания этой функции, но это идея)

lower_model = [self.build_network(
                  self.model_config['critic_lower'], 
                  input_shape=(self.history_length, self.n_stock, 1)) 
               for _ in range(1  + self.n_smooth + self.n_down)]

#for building models you need input and output tensors
lower_inputs = [model.input for model in lower_model]
lower_outputs = [model.output for model in lower_model]
    #these lines assume each model in the list has only one input and output

#using a concatenate layer on a list of tensors
merged_tensor = Concatenate()(lower_outputs) #or Concatenate(axis=...)(lower_outputs)


#this is a workaround for compatibility. 
#ideally you should work just with tensors, not create unnecessary intermediate models
merged_model = Model(lower_inputs, merged_tensor) #make model from input tensors to outputs

# upper layer
upper_model = self.build_network(self.model_config['critic_upper'],  model=merged_model)

# action layer
action = self.build_network(self.model_config['critic_action'], input_shape=(self.n_stock,), is_conv=False)

# output layer - get the output tensors from the models
upper_out = upper_model.output
action_out = action.output

#apply the Multiply layer on the list of tensors
merged_tensor = Multiply()([upper_out, action_out])

#apply the Dense layer on the merged tensor
out = Dense(1)(merged_tensor)

#get input tensors to create a model
upper_iputs = upper_model.inputs #should be a list   
action_inputs = action.inputs #if not a list, append to the previous list

inputs = upper_inputs + action_inputs
model = Model(inputs, out)

return model
0 голосов
/ 22 января 2019

Я не могу дать вам точный ответ, потому что ваш вопрос недостаточно подробен, но я могу привести вам пример, где слои объединяются.Распространенная проблема - импортировать Concatenate и использовать его как в предыдущих версиях.

nlp_input = Input(shape=(seq_length,), name='nlp_input')
meta_input = Input(shape=(10,), name='meta_input')
emb = Embedding(output_dim=embedding_size, input_dim=100, input_length=seq_length)(nlp_input)
nlp_out = Bidirectional(LSTM(128, dropout=0.3, recurrent_dropout=0.3, kernel_regularizer=regularizers.l2(0.01)))(emb)
x = concatenate([nlp_out, meta_input])
x = Dense(classifier_neurons, activation='relu')(x)
x = Dense(1, activation='sigmoid')(x)
model = Model(inputs=[nlp_input , meta_input], outputs=[x])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...