Keras LSTM с переменной длиной предложений - список массивов Numpy, передаваемых в модель, размер которой не ожидается - PullRequest
1 голос
/ 27 апреля 2019

Я успешно реализовал учебник по LSTM для создания музыки. Тем не менее, я изо всех сил пытаюсь создать один для языка (мой основной интерес). У меня есть индекс слов, и вот два примера предложений из моих данных.

выборка предикторов:

[[1],
 [1, 6],
 [1, 6, 241],
 [1, 6, 241, 252],
 [1, 6, 241, 252, 11],
 [1, 6, 241, 252, 11, 59],
 [1, 6, 241, 252, 11, 59, 2],
 [1, 6, 241, 252, 11, 59, 2, 62],
 [1, 6, 241, 252, 11, 59, 2, 62, 663],
 [1, 6, 241, 252, 11, 59, 2, 62, 663, 41],
 [1],
 [1, 3],
 [1, 3, 216],
 [1, 3, 216, 227],
 [1, 3, 216, 227, 26],
 [1, 3, 216, 227, 26, 30],
 [1, 3, 216, 227, 26, 30, 5]]

образец этикетки:

[[6],
[241],
[252],
[11],
[59],
[2],
[62],
[663],
[41],
[1],
[3],
[216],
[227],
[26],
[30],
[5],
[1]]

Потери должны быть рассчитаны следующим образом: enter image description here который я хочу минимизировать.

Мой код для LSTM

from keras.models import Model
from keras import layers
from keras import Input

vocabulary_size = len(word_index)
dimensions = 200


text_input = Input(shape=(None,))
embedded = layers.Embedding(vocabulary_size, dimensions)(text_input)
encoded = layers.LSTM(vocabulary_size)(embedded)
output = layers.Dense(vocabulary_size, activation='softmax')(encoded)
model = Model(text_input, output)
model.compile(optimizer='adam',
              loss='categorical_crossentropy',
              metrics=['acc'])
model.summary()
model.fit(x, y, epochs=10, batch_size=1)

Чтобы учесть переменную длину предложения, я установил

  • batch_size = 1 из-за переменной длины предложения
  • shape из Input до (None, )

Однако я получаю следующую ошибку:

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-64-95228d843a72> in <module>()
     25               metrics=['acc'])
     26 model.summary()
---> 27 model.fit(x, y, epochs=1, batch_size=1)

C:\ProgramData\Anaconda3\lib\site-packages\keras\engine\training.py in fit(self, x, y, batch_size, epochs, verbose, callbacks, validation_split, validation_data, shuffle, class_weight, sample_weight, initial_epoch, steps_per_epoch, validation_steps, **kwargs)
    950             sample_weight=sample_weight,
    951             class_weight=class_weight,
--> 952             batch_size=batch_size)
    953         # Prepare validation data.
    954         do_validation = False

C:\ProgramData\Anaconda3\lib\site-packages\keras\engine\training.py in _standardize_user_data(self, x, y, sample_weight, class_weight, check_array_lengths, batch_size)
    749             feed_input_shapes,
    750             check_batch_axis=False,  # Don't enforce the batch size.
--> 751             exception_prefix='input')
    752 
    753         if y is not None:

C:\ProgramData\Anaconda3\lib\site-packages\keras\engine\training_utils.py in standardize_input_data(data, names, shapes, check_batch_axis, exception_prefix)
    100                 'Expected to see ' + str(len(names)) + ' array(s), '
    101                 'but instead got the following list of ' +
--> 102                 str(len(data)) + ' arrays: ' + str(data)[:200] + '...')
    103         elif len(names) > 1:
    104             raise ValueError(

ValueError: Error when checking model input: the list of Numpy arrays that you are passing to your model is not the size the model expected. Expected to see 1 array(s), but instead got the following list of 17 arrays: [array([[1]]), array([[1],
       [6]]), array([[  1],
       [  6],
       [241]]), array([[  1],
       [  6],
       [241],
       [252]]), array([[  1],
       [  6],
       [241],
       [252],
 ...

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

x = [np.array(i) for i in x]
y = [np.array(i) for i in y]

Почему я получаю эту ошибку, даже если я намеренно структурировал модель для обработки массивов различной длины?

Ошибка возникает из-за формата моих предикторов (x). По крайней мере, это то, что, как мне кажется, указывает на ошибку.

1 Ответ

0 голосов
/ 27 апреля 2019

Возможно, я запомнил, но я считаю, что вы должны сделать что-то вроде

y = y.reshape(-1)

, чтобы получить плоский список ярлыков, которые Керас, похоже, желает здесь.Кроме того, тренировка с batch_size 1 повредит вашей производительностиЯ рекомендую предварительно заполнить ваши данные фиксированным числом 0 с, установить mask=True в LSTM и использовать стандартные размеры партии

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...