TypeError: добавленный слой должен быть экземпляром класса Layer. Найдено: тензор (input_2: 0, shape = (?, 22), dtype = float32)

Я пытаюсь добавить слой автоэнкодера в нейронную сеть LSTM. Входные данные - это фрейм данных pandas с числовыми функциями.

Для выполнения этой задачи я использую Keras и Python. Мой текущий код на Python приведен ниже.

Я не могу скомпилировать модель, потому что мне кажется, что я смешиваю Keras и Tensorflow:

TypeError: The added layer must be an instance of class Layer. Found: Tensor("input_2:0", shape=(?, 22), dtype=float32)

Я новичок в обоих пакетах, и был бы признателен, если бы кто-нибудь сказал мне, как исправить эту ошибку.

nb_features = X_train.shape[2]
hidden_neurons = nb_classes*3
timestamps = X_train.shape[1]
NUM_CLASSES = 3
BATCH_SIZE = 32

input_size = len(col_names)
hidden_size = int(input_size/2)
code_size = int(input_size/4)

model = Sequential()

model.add(LSTM(
                units=hidden_neurons,
                return_sequences=True, 
                input_shape=(timestamps, nb_features),
                dropout=0.15,
                recurrent_dropout=0.20
              )
         )

input_vec = Input(shape=(input_size,))

# Encoder
hidden_1 = Dense(hidden_size, activation='relu')(input_vec)
code = Dense(code_size, activation='relu')(hidden_1)

# Decoder
hidden_2 = Dense(hidden_size, activation='relu')(code)
output_vec = Dense(input_size, activation='relu')(hidden_2)

model.add(input_vec)
model.add(hidden_1)
model.add(code)
model.add(hidden_2)
model.add(output_vec)

model.add(Dense(units=100,
                kernel_initializer='normal'))

model.add(LeakyReLU(alpha=0.5))

model.add(Dropout(0.20))

model.add(Dense(units=200, 
                kernel_initializer='normal',
                activation='relu'))

model.add(Flatten())

model.add(Dense(units=200, 
                kernel_initializer='uniform',
                activation='relu'))

model.add(Dropout(0.10))

model.add(Dense(units=NUM_CLASSES,
                activation='softmax'))

model.compile(loss="categorical_crossentropy",
              metrics = ["accuracy"],
              optimizer='adam')

person Fluxy    schedule 24.02.2020    source источник


Ответы (1)


Проблема в том, что вы смешиваете последовательный API Keras с его функциональным API. Чтобы устранить проблему, необходимо заменить:

input_vec = Input(shape=(input_size,))

# Encoder
hidden_1 = Dense(hidden_size, activation='relu')(input_vec)
code = Dense(code_size, activation='relu')(hidden_1)

# Decoder
hidden_2 = Dense(hidden_size, activation='relu')(code)
output_vec = Dense(input_size, activation='relu')(hidden_2)

С участием:

# Encoder
model.add(Dense(hidden_size, activation='relu'))
model.add(Dense(code_size, activation='relu'))

# Decoder
model.add(Dense(hidden_size, activation='relu'))
model.add(Dense(input_size, activation='relu'))

Или конвертировать все в функциональный API

person Thomas Schillaci    schedule 24.02.2020