Вопрос или проблема
Я пытаюсь создать нейронную сеть, которая состоит из различных подмоделей. Каждая подмодель имеет свои входные данные, которые некоторые из них могут быть общими между подмоделями.
Например, подмодель 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
.
Так… как я могу сделать так, чтобы выходы подмоделей стали входами для других моделей?
На изображении то, что я пытаюсь сделать, выглядит примерно так, но дело в том, что вместо нейрона каждая нейрон будет моделью.
Заранее спасибо!
Попробуйте удалить слой 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,50)
, обрабатывает его через несколько слоев LSTM и Dense и выдает выход размерности(1,)
. -
Конкатенация выходов: Если требуется объединить выходы нескольких суб-моделей, Вы правильно используете слой
concatenate
. -
Создание новой модели: После объединения выходов суб-моделей, Вы хотите передать их в новую модель. Здесь важно помнить, что на этом шаге не требуется снова добавлять входной слой
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 - это входные данные для других суб-моделей
ЗАКЛЮЧЕНИЕ
Соблюдая данные шаги, можно эффективно организовать архитектуру, в которой выходы одних моделей передаются на вход другим, сохраняя при этом структурную целостность и функциональность. Важно точно следовать требованиям к размерностям данных на каждом этапе, чтобы избежать ошибок. С такой гибкой архитектурой можно решать более сложные задачи и добиваться высокой эффективности Ваших нейросетей.