У меня есть две последовательные модели, которые хорошо справляются с классификацией звука. Один использует 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)