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