Вопрос или проблема
Я хотел бы объединить две последовательные модели в режиме суммы в одну модель, используя Keras следующим образом:
left = Sequential()
left.add(LSTM(64, activation='sigmoid', stateful=True, batch_input_shape=(10, look_back, dim)))
right = Sequential()
right.add(LSTM(64, activation='sigmoid', stateful=True, batch_input_shape=(10, look_back, dim)))
model = Sequential()
model.add(Add()([left, right]))
Но выражение model.add(Add()[left,right])
вызывает ошибку:
Слой add был вызван с входом, который не является символическим тензором. Получен
тип: <class 'keras.engine.sequential.Sequential'>. Полный вход:
[<keras.engine.sequential.Sequential object at 0x7fac9c0f36a0>,
<keras.engine.sequential.Sequential object at 0x7fac9c0f3748>].
Все входы в слой должны быть тензорами.
Ошибка говорит, в чем проблема: метод ожидает тензоры, но вы передаете объект последовательной модели.
Используйте функциональную модель (from keras.models import Model
), а не Sequential.
Затем объедините модели следующим образом:
merged_models = Model(inputs=[first_model_input, second_model_input], outputs=[first_model_output, second_model_output])
или как-то иначе в зависимости от ваших входных данных.
Я создал аналогичную модель с функциональным API:
leftInput = keras.layers.Input((10, 10))
left = keras.layers.LSTM(64, activation='sigmoid')(leftInput)
rightInput = keras.layers.Input((10, 10))
right = keras.layers.LSTM(64, activation='sigmoid')(rightInput)
output = keras.layers.Add()([left, right])
model = keras.Model(inputs=[leftInput, rightInput], outputs=output)
Я не знаю специфики вашей модели, но это также должно подойти для вашей проблемы.
Ответ или решение
Чтобы объединить два последовательных LSTM-моделя в Keras с использованием режима суммы, необходимо учитывать, что Sequential модели не могут быть напрямую объединены с помощью операции Add(), так как этот метод ожидает входные данные в виде символических тензоров. Эта проблема возникает из-за того, что объект Sequential не является тензором, вводимым в слой.
Для решения данной проблемы рекомендую использовать функциональный API Keras, который предоставляет большую гибкость в построении конфигураций модели. Ниже приведена подробная инструкция по созданию объединённой модели с использованием функционального API.
Шаг 1: Импорт необходимых модулей
import keras
from keras.layers import Input, LSTM, Add
from keras.models import Model
Шаг 2: Определение входных данных
Поскольку вы используете LSTM с заданной формой ввода, необходимо определить размеры входных данных. В рассматриваемом примере мы будем использовать форму входа (10, look_back, dim).
look_back = 10 # Задайте ваше значение
dim = 10 # Задайте вашу размерность
left_input = Input(shape=(look_back, dim))
right_input = Input(shape=(look_back, dim))
Шаг 3: Создание LSTM-слоёв
Теперь необходимо создать LSTM-слои для обеих частей модели.
left_output = LSTM(64, activation='sigmoid', stateful=True)(left_input)
right_output = LSTM(64, activation='sigmoid', stateful=True)(right_input)
Шаг 4: Объединение выходов
Для объединения выходов двух LSTM-слоёв используем слой Add().
merged_output = Add()([left_output, right_output])
Шаг 5: Создание модели
Теперь мы создадим модель, указав входные данные и объект, который хотим получить на выходе:
model = Model(inputs=[left_input, right_input], outputs=merged_output)
Шаг 6: Компиляция модели
После создания модели следует скомпилировать её, прежде чем начинать обучение:
model.compile(optimizer='adam', loss='mean_squared_error')
Полный код
Вот итоговый код:
import keras
from keras.layers import Input, LSTM, Add
from keras.models import Model
look_back = 10 # Задайте ваше значение
dim = 10 # Задайте вашу размерность
# Определяем входные слои
left_input = Input(shape=(look_back, dim))
right_input = Input(shape=(look_back, dim))
# Создаём LSTM слои
left_output = LSTM(64, activation='sigmoid', stateful=True)(left_input)
right_output = LSTM(64, activation='sigmoid', stateful=True)(right_input)
# Объединяем выходы
merged_output = Add()([left_output, right_output])
# Создаём финальную модель
model = Model(inputs=[left_input, right_input], outputs=merged_output)
# Компилируем модель
model.compile(optimizer='adam', loss='mean_squared_error')
# Теперь ваша модель готова к обучению
Заключение
Теперь вы успешно создали модель, объединяющую два LSTM-слоя в режиме суммы, используя функциональный API Keras. Это подход решает вашу изначальную проблему с использованием Sequential модели и обеспечивает большую гибкость при добавлении различных архитектур в модель.