Ошибка значения: ввод 0 несовместим со слоем repeat_vector_58: ожидаемый ndim = 2, найден ndim = 3

#python #keras #deep-learning #lstm #autoencoder

#python #keras #глубокое обучение #lstm #автоэнкодер

Вопрос:

Я пытаюсь создать LSTM обнаружения вторжений и автоматические кодировщики. Однако я не могу понять, почему для repeat_vector_58 требуется ndim = 3. Я не в состоянии разобраться в этом. Ниже приведен мой код:

x_train.shape: (8000, 1, 82)

x_test.shape: (2000, 1, 82)

 x_train = np.reshape(trainX, (trainX.shape[0], 1, trainX.shape[1]))
x_test = np.reshape(testT, (testT.shape[0], 1, testT.shape[1]))

start = time.time()
model = Sequential()
model.add(LSTM(128, activation='relu',recurrent_dropout=0.5,return_sequences=True,input_dim=82))
model.add(RepeatVector(82))
model.add(Dropout(0.3))
model.add(LSTM(64, activation='relu',recurrent_dropout=0.5,return_sequences=False))
model.add(Dropout(0.3))
model.add(TimeDistributed(Dense(1,activation='softmax')))

ValueError: Input 0 is incompatible with layer repeat_vector_58: expected ndim=2, found ndim=3
  

Ответ №1:

Слой LSTM ожидает трехмерный ввод, потому что это рекуррентный слой. Ожидаемый ввод (batch_size, timesteps, input_dim) . Спецификация input_dim=82 ожидает 2-тусклый ввод, но ожидаемый ввод 3-тусклый.
Итак, решение вашей ошибки заключается в изменении input_dim=82 на input_shape=(82,1) .

 model = Sequential()
model.add(LSTM(128,activation='relu',recurrent_dropout=0.5,return_sequences=True,input_shape=(82,1)))