Обучение LSTM с помощью мини-пакета для приложения прогнозирования следующего слова - PullRequest
0 голосов
/ 07 октября 2019

Сначала позвольте мне показать вам упрощенную версию моих реальных выборочных данных, над которыми я работаю:

fullbatch = [
    ['0', '0', '45'],
    ['90', '135', '135'],
    ['0', '45', '90'],
    ['0', '45', '0'],
    ['0', '45', '45'],
    ['180', '180', '135'],
    ['180', '180', '180'],
    ['180', '180', '180'],
    ['180', '180', '180']
]

Все эти числа - это углы, где размер моих реальных выборок намного больше, чем этот (около порядка 10 ^ 7). Здесь я пытаюсь использовать языковую модель, в данном случае 3-граммовую модель, для предсказания следующего слова. Итак, после того, как я обучил нейронные сети, я ожидаю, что результаты будут такими:

predict('0', '0') -> output prob of '45' is 1.0
predict('90', '135') -> output prob of '135' is 1.0
predict('0', '45') -> output prob of '90' is  0.33
                   -> output prob of '0' is  0.33
                   -> output prob of '45' is  0.33
predict('180', '180') -> output prob of '135' is 0.25
                      -> output prob of '180' is 0.75

Вот код, который я пытался обучить 3-граммовой модели, используя LSTM с мини-пакетом, но это не удалось:

from random import randint
from numpy import array
from keras.utils import to_categorical
from keras.models import Sequential
from keras.layers import Dense, LSTM

ngram_order = 3
num_hidlayer = 50

# define vocabulary in one hot encoding.
vocabs = ['0', '45', '90', '135', '180', '225', '270', '315']
onehots = {}
for i, c in enumerate(vocabs):
    onehots[c] = list(to_categorical(i, len(vocabs)))

# define model.
m = Sequential()
m.add(LSTM(num_hidlayer, input_shape=(ngram_order - 1, len(vocabs))))
m.add(Dense(len(vocabs), activation='softmax'))
m.compile(
        loss='categorical_crossentropy', optimizer='adam',
        metrics=['accuracy'])
print(m.summary())

# format data as input and output pairs.
full_inputs = [
    ['0', '0'], ['90', '135'], ['0', '45'], ['0', '45'], ['0', '45'],
    ['180', '180'], ['180', '180'], ['180', '180'], ['180', '180']
]
for j in range(len(full_inputs)):
    for i in range(len(full_inputs[0])):
        full_inputs[j][i] = onehots[str(full_inputs[j][i])]
full_outputs = ['45', '135', '90', '0', '45', '135', '180', '180', '180']
for i in range(len(full_outputs)):
    full_outputs[i] = onehots[str(full_outputs[i])]

# train the model by randomly picking 2 samples at a time.
count = 0
while True:
    i = randint(0, len(full_inputs) - 1)
    j = randint(0, len(full_inputs) - 1)
    inputs = [full_inputs[i], full_inputs[j]]
    outputs = [full_outputs[i], full_outputs[j]]
    m.fit(array(inputs), array(outputs), epochs=3000, verbose=2)
    m.save('output' + str(count) + '.h5')
    count += 1

Из этого кода я не могу получить результат ожидаемых проб. Единственный способ, которым я могу это сделать, - это использовать полное обучение. У вас есть идеи для решения этой проблемы? На самом деле, кроме мини-тренинга, вы также можете предложить мне кое-что еще, но имейте в виду, что у меня есть условие для моих данных: 1) у меня есть генератор, который может генерировать последовательности углов, 2) генерируются эти углыс определенным шаблоном, который означает, что число комбинаций конечно, 3) количество комбинаций слишком велико для полного обучения партии.

...