Я успешно реализовал учебник по 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]]
Потери должны быть рассчитаны следующим образом:
который я хочу минимизировать.
Мой код для 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). По крайней мере, это то, что, как мне кажется, указывает на ошибку.