Ошибка: Keras объединяет LSTM-слои в режиме суммы

Вопрос или проблема

Я хотел бы объединить две последовательные модели в режиме суммы в одну модель, используя 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 модели и обеспечивает большую гибкость при добавлении различных архитектур в модель.

Оцените материал
Добавить комментарий

Капча загружается...