Keras: вход 0 несовместим со слоем lstm_26: ожидаемый ndim = 3, найденный ndim = 2 - PullRequest
0 голосов
/ 05 октября 2018

У меня проблема с классификацией текста, и я использую слой LSTM для получения векторов контекста, используя Keras.

Я использовал tokenizer и дополнил последовательности, чтобы мой X_train имел форму(21226, 1500) где 1500 - максимальная длина последовательности.

Как напрямую передать эту последовательность в LSTM с 64 модулями?Я попытался сделать это напрямую, но, похоже, возникла проблема с размерами.

Вход 0 несовместим со слоем lstm_26: ожидаемый ndim = 3, найденный ndim = 2

Вот код в Керасе:

input = Input(shape=(1500,))
lstm1 = LSTM(units=64, dropout=0.2, recurrent_dropout=0.2)
out = lstm1(input)

Редактировать:

Вот обновленный код:

def getm():
    inp = Input(shape=(1500,1))
    lstm1 = LSTM(units=64, dropout=0.2, recurrent_dropout=0.2)
    out = lstm1(inp)
    model = Model(inputs=inp, outputs=out)
    model.compile(optimizer='rmsprop', loss=custom_loss, metrics=[custom_loss])
    return model

Теперь форма X_train (21226, 1500), после изменения с помощью np.expand_dims, это (21226, 1500, 1).

Я прочитал документы Keras и в форме X_train, первый атрибут должен быть размером пакета, который должен быть None, как KerasФункции прогнозирования и подбора позаботятся об этом.

EDIT2:

Вот полный код:

def getm():
    inp = Input(shape=(1500,1))
    lstm1 = LSTM(units=64, dropout=0.2, recurrent_dropout=0.2)
    out = lstm1(inp)
    model = Model(inputs=inp, outputs=out)
    model.compile(optimizer='rmsprop', loss=custom_loss, metrics=[custom_loss])
    return model

model = getm()

X_train.shape = (21226, 500)

Я изменяю это, используя

my_data = X_train.reshape(X_train.shape + (1,))

Теперь,

my_data.shape = (21226, 1500, 1)

Я пытаюсь предсказать вывод для одной точки данных:

 model.predict(my_data[0])

И эта ошибка выдается:

ValueError: Error when checking input: expected input_25 to have 3 dimensions, but got array with shape (1500, 1) 

EDIT3:

Это сводка модели

_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
input_25 (InputLayer)        (None, 1500, 1)           0         
_________________________________________________________________
lstm_16 (LSTM)               (None, 64)                16896     
=================================================================
Total params: 16,896
Trainable params: 16,896
Non-trainable params: 0
_________________________________________________________________

1 Ответ

0 голосов
/ 05 октября 2018
Слой

LSTM ожидает трехмерный входной массив формы (batch_size, num_timesteps or sequence_length, num_features) (поэтому вы получаете ошибку expected ndim=3, found ndim=2).Поэтому, если вы хотите подать свои токенизированные и индексированные по словам предложения непосредственно в слой LSTM, вам необходимо изменить его форму так, чтобы он также имел ось объектов (которая в этом случае будет содержать индекс слов в словаре):

# using np.reshape
my_data = my_data.reshape(my_data.shape + (1,))

# using np.expand_dims
my_data = np.expand_dims(my_data, axis=-1)
...