Объединение моделей Keras: может ли Keras автоматически игнорировать имена или помечать их заново? - PullRequest
0 голосов
/ 15 марта 2019

Я пытаюсь объединить две последовательные модели в Керасе. Код следующий, взятый из этого ответа :

sequential_1 = [keras.layers.Dense(200, input_shape = (784,),activation=tf.nn.relu),
                keras.layers.Dense(50, activation=tf.nn.relu)] 

model_1 = keras.Sequential(sequential_1)

sequential_2 = [keras.layers.Dense(784, input_shape = (784,), activation=tf.nn.relu),
                keras.layers.Dense(300, activation=tf.nn.relu)] 

model_2 = keras.Sequential(sequential_1)

collective = Concatenate()([model_1.output, model_2.output])

logits = keras.layers.Dense(10, tf.nn.softmax)(collective) 

combined = Model(inputs = [model_1.input, model_2.input], outputs = [logits])

Однако я получаю эту ошибку:

 The name "dense_4_input" is used 2 times in the model. All layer names should be unique.

Вероятно, это связано с тем, что keras автоматически называет слои, если я не предоставляю имя. Однако по разным причинам мне не нужно постоянно называть все свои слои, прежде чем я смогу объединить две модели.

Есть ли способ объединить эти модели без этой ошибки, которая не требует указания имен слоев вручную? Есть ли способ, чтобы keras автоматически переименовывал все имена слоев для меня?

Обновление: мне все еще кажется, что я получаю эту ошибку, даже если я вручную перемаркирую все слои с разными именами. Что я делаю не так?

Ответы [ 2 ]

0 голосов
/ 15 марта 2019

Я рекомендую вам не смешивать Sequential и Functional API.

Если вы собираетесь использовать какую-либо модель со сколами или сцеплением, тогда выберите Functional API.

Ваша модельможет быть реализован, как показано ниже.

i_1 = Input(shape = (784,), name='input_1')
s_1 = Dense(200, activation=tf.nn.relu, name='model_1_dense_1')(i_1)
s_1 = Dense(50, activation=tf.nn.relu, name='model_1_dense_2')(s_1)

i_2 = Input(shape = (784,), name='input_2')
s_2 = Dense(784, activation=tf.nn.relu, name='model_2_dense_1')(i_1)
s_2 = Dense(300, activation=tf.nn.relu, name='model_2_dense_2')(s_2)

c = concatenate([s_1, s_2], name='concatenate_layer')

l = Dense(10, activation=tf.nn.softmax, name='logit')(c)

model = Model(inputs = [i_1, i_2], outputs = [l])

Необязательно называть слои, Keras будет называть слои по умолчанию.Но чтобы лучше понять вещи, хорошо бы назвать слои.Будет полезно, если вы визуализируете модель

0 голосов
/ 15 марта 2019

Вы должны полностью использовать Функциональный API вместо того, чтобы смешивать последовательный и функциональный API, и тогда у вас не будет этой проблемы.Функциональное API также значительно облегчает управление и сборку моделей.

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