Сделать выходы субмоделей входами других моделей LSTM

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

Я пытаюсь создать нейронную сеть, которая состоит из различных подмоделей. Каждая подмодель имеет свои входные данные, которые некоторые из них могут быть общими между подмоделями.

Например, подмодель 1 может выглядеть следующим образом:

S1 = Input(shape=(1,50),name="Stats")
S2 = LSTM(300,return_sequences = True)(S1)
S3 = Dropout(0.5)(S2)
S4 = LSTM(200,return_sequences = False)(S3)
S5 = Dropout(0.5)(S4)
S6 = Dense(100,kernel_initializer="uniform",activation='relu')(S5)
S7 = Dense(1,kernel_initializer="uniform",activation='relu')(S6)

Затем я хочу, чтобы выход этой подмодели использовался в качестве входа скрытого слоя. Дело в том, что скрытый слой, который я пытаюсь создать, также использует LSTM, и я читал на некоторых форумах, что это можно сделать с помощью keras concatenate.

Таким образом, это будет выглядеть так:

merge = concatenate([S7,A7,B7,...],name="conca")

В конце концов, я попытался передать этот объект merge новому модели, который будет рассматриваться как “скрытый слой”.

Это будет выглядеть так:

hidden_1_1 = Input(shape=(1,6),name="Hidden_Layer_1")(merge)
hidden_1_2 = LSTM(300,return_sequences = True)(hidden_1_1)
hidden_1_3 = Dropout(0.5)(hidden_1_2)
hidden_1_4 = LSTM(200,return_sequences = False)(hidden_1_3)
hidden_1_5 = Dropout(0.5)(hidden_1_4)
hidden_1_6 = Dense(100,kernel_initializer="uniform",activation='relu')(hidden_1_5)
hidden_1_7 = Dense(1,kernel_initializer="uniform",activation='relu')(hidden_1_6)

И я получаю эту ошибку: TypeError: 'Tensor' object is not callable.

Так… как я могу сделать так, чтобы выходы подмоделей стали входами для других моделей?

На изображении то, что я пытаюсь сделать, выглядит примерно так, но дело в том, что вместо нейрона каждая нейрон будет моделью.

enter image description here

Заранее спасибо!

Попробуйте удалить слой Input

hidden_1_2 = LSTM(300,return_sequences = True)(merge)
hidden_1_3 = Dropout(0.5)(hidden_1_2)
hidden_1_4 = LSTM(200,return_sequences = False)(hidden_1_3)
hidden_1_5 = Dropout(0.5)(hidden_1_4)
hidden_1_6 = Dense(100,kernel_initializer="uniform",activation='relu')(hidden_1_5)
hidden_1_7 = Dense(1,kernel_initializer="uniform",activation='relu')(hidden_1_6)

Ответ или решение

Создание сложной нейронной сети, в которой выходы одних суб-моделей становятся входами других, является интересной задачей и требует внимательного подхода. Давайте разберемся с тем, как можно правильно реализовать такую архитектуру на примере использования LSTM в Keras.

ФОРМУЛИРОВКА ПРОБЛЕМЫ

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

ОБЩИЙ ПОДХОД

  1. Создание индивидуальных суб-моделей: У каждой суб-модели есть свои входы. Например, Ваша первая суб-модель принимает вход размерности (1,50), обрабатывает его через несколько слоев LSTM и Dense и выдает выход размерности (1,).

  2. Конкатенация выходов: Если требуется объединить выходы нескольких суб-моделей, Вы правильно используете слой concatenate.

  3. Создание новой модели: После объединения выходов суб-моделей, Вы хотите передать их в новую модель. Здесь важно помнить, что на этом шаге не требуется снова добавлять входной слой Input, поскольку объединенные выходы уже являются входными данными для дальнейших слоев.

РЕШЕНИЕ

Ошибка, которую Вы получаете (TypeError: 'Tensor' object is not callable), возникает из-за попытки использования тензора как функции. Это часто происходит, когда тензор, вместо передачи через слои, неправильно "оборачивается" через слой Input.

Ваша новая модель должна выглядеть следующим образом:

from keras.layers import concatenate, LSTM, Dropout, Dense
from keras.models import Model

# Исходные слои вашей первой суб-модели
S1 = Input(shape=(1,50),name="Stats")
S2 = LSTM(300,return_sequences=True)(S1)
S3 = Dropout(0.5)(S2)
S4 = LSTM(200,return_sequences=False)(S3)
S5 = Dropout(0.5)(S4)
S6 = Dense(100,kernel_initializer="uniform",activation='relu')(S5)
S7 = Dense(1,kernel_initializer="uniform",activation='relu')(S6)

# Допустим, у вас есть другие суб-модели, выходы которых - A7, B7, ...
# Тогда вы можете их объединить:
merge = concatenate([S7, A7, B7], name="conca")

# Никакого слоя Input здесь не добавляем
hidden_1_2 = LSTM(300, return_sequences=True)(merge)
hidden_1_3 = Dropout(0.5)(hidden_1_2)
hidden_1_4 = LSTM(200, return_sequences=False)(hidden_1_3)
hidden_1_5 = Dropout(0.5)(hidden_1_4)
hidden_1_6 = Dense(100, kernel_initializer="uniform", activation='relu')(hidden_1_5)
hidden_1_7 = Dense(1, kernel_initializer="uniform", activation='relu')(hidden_1_6)

# Создадим итоговую модель
model = Model(inputs=[S1, A1, B1], outputs=hidden_1_7)  # где A1, B1 - это входные данные для других суб-моделей

ЗАКЛЮЧЕНИЕ

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

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

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