LSTM 的输入形状,ValueError:“sequential_9”层的输入 0 与该层不兼容:预期形状=(None, 1, 13),找到的形状=(None, 13)

问题描述 投票:0回答:0

我正在尝试解决分类问题,但我不知道为什么会出现此错误:

ValueError: Input 0 of layer "sequential_9" is incompatible with the layer: expected shape=(None, 1, 13), found shape=(None, 13)

这是我的代码:

import pandas as pd
#import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.ensemble import VotingClassifier
from imblearn.over_sampling import RandomOverSampler
from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score, roc_auc_score, confusion_matrix, classification_report
import time as t
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Conv1D, MaxPooling1D, Flatten, Dense, LSTM, Dropout, Input
from tensorflow.keras.wrappers.scikit_learn import KerasClassifier


data = pd.read_csv('Dataset.csv')
print(data.dtypes)

X = data.drop('class', axis=1)
y = data['class']

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

start_time = t.time()
print("Starting oversampling process :")
# Implement oversampling to balance classes
oversample = RandomOverSampler(sampling_strategy='minority', random_state=42)
X_train, y_train = oversample.fit_resample(X_train, y_train)
print("FINAL: oversampling process. Time to done process : ",(t.time()-start_time))

def create_model():
    model = Sequential()
    model.add(Conv1D(32, kernel_size=3, activation='relu', input_shape=(X_train.shape[1], 1)))
    model.add(Conv1D(64, kernel_size=3, activation='relu'))
    model.add(MaxPooling1D(pool_size=2))
    model.add(Flatten())
    model.add(Dense(128, activation='relu'))
    model.add(Dense(1, activation='sigmoid'))
    model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
    return model

cnn_model = KerasClassifier(build_fn=create_model, epochs=20, batch_size=32, verbose=0)
cnn_model._estimator_type = "classifier"

# Define the LSTM model
def create_LSTM_model():
    model = Sequential()
    model.add(LSTM(128, input_shape=(1,13), return_sequences=True))
    model.add(Dense(32, activation='relu'))
    model.add(Dropout(0.2))
    model.add(LSTM(64))
    model.add(Dropout(0.2))
    model.add(Dense(32, activation='relu'))
    model.add(Dense(2, activation='sigmoid'))
    model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
    return model

lstm_model = KerasClassifier(build_fn=create_LSTM_model, epochs=20, batch_size=32, verbose=0)
lstm_model._estimator_type = "classifier"



# define the ensemble model
voting_clf = VotingClassifier(estimators=[("CNN", cnn_model), ("LSTM", lstm_model)], voting='soft')
voting_clf.fit(X_train, y_train)


print("Evaluate the ensemble model on the test data : ")
ensemble_pred = voting_clf.predict(X_test)
ensemble_accuracy = accuracy_score(y_test, ensemble_pred)
ensemble_precision = precision_score(y_test, ensemble_pred)
ensemble_recall = recall_score(y_test, ensemble_pred)
ensemble_f1_score = f1_score(y_test, ensemble_pred)
ensemble_auc_roc = roc_auc_score(y_test, ensemble_pred)
ensemble_cm = confusion_matrix(y_test, ensemble_pred)
CR = classification_report(y_test, ensemble_pred)

总的来说,我有以下 14 个特征:

f1                        int64
f2                        int64
f3                        int64
f4                      float64
f5                        int64
f6                        int64
f7                      float64
f8                      float64
f9                        int64
f10                       int64
f11                       int64
f12                       int64
f13                       int64
class                     int64
dtype: object

X_train.shape
(11725212, 13)

当我使用

input_shape=(X_train.shape[1], 1)
时它有效,但我认为这是错误的。 所以,我尝试了
input_shape=(1,13)
input_shape=(13,)
但仍然出现错误。

有人可以帮忙吗?谢谢

python tensorflow keras deep-learning lstm
© www.soinside.com 2019 - 2024. All rights reserved.