Ошибка значения: Ввод 0 слоя «последовательный» несовместим со слоем: ожидаемая форма=(Нет, 33714, 12), найденная форма=(Нет, 12)

#python #tensorflow #keras #deep-learning #lstm

Вопрос:

Я пытаюсь запустить простой RNN с некоторыми данными, извлеченными из csv-файла. Я уже предварительно обработал свои данные и разделил их на набор поездов и набор проверок, но я получаю ошибку выше. Это моя сетевая структура и то, что я пытался сделать до сих пор. Мои формы (33714,12) для x_train, (33714,) для y_train, (3745,12) для x_val и (3745,) для y_val.

 model = Sequential() # LSTM LAYER IS ADDED TO MODEL WITH 128 CELLS IN IT model.add(LSTM(128, input_shape=x_train.shape, activation='tanh', return_sequences=True)) model.add(Dropout(0.2)) # 20% DROPOUT ADDED FOR REGULARIZATION model.add(BatchNormalization())  model.add(LSTM(128, input_shape=x_train.shape, activation='tanh', return_sequences=True)) # ADD ANOTHER LAYER model.add(Dropout(0.1)) model.add(BatchNormalization())  model.add(LSTM(128, input_shape=x_train.shape, activation='tanh', return_sequences=True)) model.add(Dropout(0.2)) model.add(BatchNormalization())  model.add(Dense(32, activation='relu')) # ADD A DENSE LAYER model.add(Dropout(0.2))  model.add(Dense(2, activation='softmax')) # FINAL CLASSIFICATION LAYER WITH 2 CLASSES AND SOFTMAX # ---------------------------------------------------------------------------------------------------  # OPTIMIZER SETTINGS opt = tf.keras.optimizers.Adam(learning_rate=LEARNING_RATE, decay=DECAY)  # MODEL COMPILE model.compile(loss='sparse_categorical_crossentropy', optimizer=opt, metrics=['accuracy'])  # CALLBACKS tensorboard = TensorBoard(log_dir=f"logs/{NAME}") filepath = "RNN_Final-{epoch:02d}-{val_acc:.3f}" checkpoint = ModelCheckpoint("models/{}.model".format(filepath, monitor='val_acc', verbose=1,  save_best_only=True, mode='max')) # save only the best ones  # RUN THE MODEL history = model.fit(x_train, y_train, epochs=EPOCHS, batch_size=BATCH_SIZE,  validation_data=(x_val, y_val), callbacks=[tensorboard, checkpoint])  

Ответ №1:

Хотя это даст вам большую ценность, возможно, лучше всего было бы сгладить тот, который имеет больший размер.

Тензорный поток.керас.слои.Сглаживание() в основном приведет к тому, что ваши выходные данные будут иметь умноженные значения, т. е. входные данные: (Нет, 5, 5) -gt; Сглаживание() -gt;gt; (Нет, 25)

Для вашего примера это даст вам:

(Нет, 33714,12) -gt; (Нет, 404568).

Я не совсем уверен, сработает ли это при изменении размеров фигур, но именно так я преодолел проблему с несовместимыми фигурами: ожидается: (Нет, x), получено: (Нет, y, x).