Python TypeError:添加的层必须是类层的实例。发现:张量(“输入2:0”,形状=(?,22),数据类型=浮点32)

Python TypeError:添加的层必须是类层的实例。发现:张量(“输入2:0”,形状=(?,22),数据类型=浮点32),python,tensorflow,keras,tensor,Python,Tensorflow,Keras,Tensor,我正在尝试将自动编码器层添加到LSTM神经网络。输入数据是具有数字特征的数据帧 为了完成这项任务,我正在使用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) 我对这两个软件包都很

我正在尝试将自动编码器层添加到LSTM神经网络。输入数据是具有数字特征的数据帧

为了完成这项任务,我正在使用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')

问题是您将Keras的顺序API与其功能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)
与:

或者将所有内容转换为函数式API

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