简体   繁体   中英

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

I am trying to add autoencoder layer to LSTM neural network. The input data is the pandas DataFrame with numerical features.

To do this task, I am using Keras and Python My current code in Python is given below.

I cannot compile the model because I seem to mix Keras and Tensorflow:

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

I am quite new to both packages, and I'd appreciate if somebody could tell me how to fix this error.

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')

The issue is that you are mixing Keras' sequential API with its functional API. To fix your issue, you must replace:

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)

With:

# 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'))

Or convert everything to the functional API

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM