Keras. Как объединить промежуточные слои двух разных моделей в третью модель - PullRequest
0 голосов
/ 20 апреля 2020

У меня есть две последовательные модели, которые хорошо справляются с классификацией звука. Один использует mfccs, а другой - волновые формы. Сейчас я пытаюсь объединить их в третью функциональную модель API, используя один из более поздних плотных слоев из каждой из моделей mf cc и wave form. Пример получения промежуточных слоев в FAQ по Keras не работает для меня (https://keras.io/getting-started/faq/#how -can-i-получить-вывод-промежуточного слоя ).

Вот мой код:

mfcc_model = load_model(S01_model_local_loc)
waveform_model = load_model(T01_model_local_loc)

mfcc_input = Input(shape=(79,30,1))
mfcc_model_as_layer = Model(inputs=mfcc_model.input,
                                 outputs=mfcc_model.get_layer(name = 'dense_9').output)

waveform_input = Input(shape=(40000,1))
waveform_model_as_layer = Model(inputs=waveform_model.input,
                                 outputs=waveform_model.get_layer(name = 'dense_2').output)

concatenated_1024 = concatenate([mfcc_model_as_layer, waveform_model_as_layer])

model_pred = layers.Dense(2, activation='sigmoid')(concatenated_1024)
uber_model = Model(inputs=[mfcc_input,waveform_input], outputs=model_pred)

Это выдает ошибку:

AttributeError: Layer sequential_5 имеет несколько входящих узлов, отсюда и понятие «входной слой» "плохо определен. Вместо этого используйте get_input_at(node_index).

Изменение входных данных для первых двух операторов модели на inputs=mfcc_model.get_input_at(1) и inputs=waveform_model.get_input_at(1) устраняет это сообщение об ошибке, но затем я получаю это сообщение об ошибке:

ValueError: График отключен: невозможно получить значение для тензорного тензора ("dropout_21_input: 0", shape = (?, 79, 30, 1), dtype = float32) на уровне "dropout_21_input". Следующие предыдущие слои были доступны без проблем: []

Если я удаляю операторы .get_layer и просто получаю окончательный вывод модели, график хорошо соединяется.

Что мне нужно сделать, чтобы просто получить вывод нужных мне плотных слоев?


Обновление: я нашел действительно хакерский способ получить то, что я хочу. Я вытаскивал слои моделей mf cc и wave, пока выходные слои не были такими, как я хотел. Тогда код ниже, кажется, работает. Я хотел бы знать правильный способ сделать это!

mfcc_input = Input(shape=(79,30,1))
waveform_input = Input(shape=(40000,1))

mfcc_model_as_layer = mfcc_model(mfcc_input)
waveform_model_as_layer = waveform_model(waveform_input)

concatenated_1024 = concatenate([mfcc_model_as_layer, waveform_model_as_layer])

model_pred = layers.Dense(2, activation='sigmoid')(concatenated_1024)
test_model = Model(inputs=[mfcc_input,waveform_input], outputs=model_pred)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...