Keras: ValueError: Вход 0 несовместим с слоем lstm_1: ожидается ndim=3, найден ndim=2

Вопрос или проблема

Я использую функциональный API Keras для написания модели LSTM, но возникает ошибка, не могли бы вы помочь, ниже приведен код модели, выходная форма – 65. Я использую Keras 2.2.4 и TensorFlow 1.15

event_num = 65
droprate = 0.3
vector_size = 572

def DNN():
    train_input=Input(shape=(vector_size*2,),name="Inputlayer")
    train_in=LSTM(512)(train_input)
    # train_in=BatchNormalization()(train_in)
    train_in=Dropout(droprate)(train_in)
    train_in=LSTM(256)(train_in)
    # train_in=BatchNormalization()(train_in)
    train_in=Dropout(droprate)(train_in)
    train_in=Flatten()(train_in)
    train_in=Dense(event_num)(train_in)
    out=Activation('softmax')(train_in)
    model=Model(input=train_input,output=out)
    model.compile(optimizer="adam", loss="categorical_crossentropy", metrics=['accuracy'])
    return model

Code Error

Ваш пост является дубликатом: Вот здесь кто-то задавал тот же вопрос.

Посмотрите на ответы, вы также можете попробовать эту ссылку, которая дает подробное объяснение того, как изменить формы входных данных для слоев LSTM.

Ответ или решение

Ошибка, с которой вы столкнулись, ValueError: Input 0 is incompatible with layer lstm_1: expected ndim=3, found ndim=2, происходит из-за несоответствия ожидаемого входного формата для слоя LSTM в вашем Keras модели. Давайте подробно рассмотрим данную проблему и то, как её решить.

Понимание Ошибки

Слои LSTM (Long Short-Term Memory) требуют входные данные в формате 3D массивов с тремя измерениями: (batch_size, timesteps, features).

  • batch_size — количество последовательностей (примеров) в одной партии данных,
  • timesteps — количество временных шагов в каждой последовательности,
  • features — количество признаков (характеристик) на каждом временном шаге.

Когда вы передаете входные данные в виде 2D массива (например, (batch_size, vector_size*2)), LSTM не может обработать его, поскольку оно ожидает 3D вход.

Исправление Кода

Вам необходимо изменить форму входных данных, чтобы они соответствовали требованиям LSTM. Это можно сделать, добавив дополнительное измерение к вашему входному массиву. Вот что вам нужно сделать:

  1. Изменить форму входных данных перед подачей в модель:
    Измените форму данных на (batch_size, timesteps, features), где timesteps будет равен 1, если вы рассматриваете одно временное состояние, и features будет равно vector_size * 2.

  2. Изменение кода модели:

import numpy as np
from keras.layers import Input, LSTM, Dropout, Dense, Activation
from keras.models import Model

event_num = 65
droprate = 0.3
vector_size = 572

def DNN():
    # Изменение формы входа на 3D
    train_input = Input(shape=(1, vector_size * 2), name="InputLayer")

    # Первая LSTM
    train_in = LSTM(512, return_sequences=True)(train_input)  # Убедитесь, что return_sequences= True
    train_in = Dropout(droprate)(train_in)

    # Вторая LSTM
    train_in = LSTM(256, return_sequences=False)(train_in)  # Убедитесь, что return_sequences= False
    train_in = Dropout(droprate)(train_in)

    # Полносвязный слой
    train_in = Dense(event_num)(train_in)
    out = Activation('softmax')(train_in)

    model = Model(inputs=train_input, outputs=out)
    model.compile(optimizer="adam", loss="categorical_crossentropy", metrics=['accuracy'])
    return model

Подготовка Данных

Когда вы будете готовить данные для обучения, убедитесь, что данные имеют правильный формат. Если ваши исходные данные — это 2D массив, вы можете использовать reshape, чтобы добавить недостающее измерение. Например:

X_train = X_train.reshape((X_train.shape[0], 1, vector_size * 2))

Заключение

Следуя этим шагам, вы сможете устранить ошибку и корректно использовать LSTM в вашем проекте. Помните, что правильная форма данных для архитектур, основанных на временных рядах, как LSTM, критически важна для успешного обучения и прогнозирования.

Если у вас возникнут дополнительные вопросы или потребуется дальнейшая помощь, не стесняйтесь обращаться!

Оцените материал
Добавить комментарий

Капча загружается...