Lstm нейронная сеть python пример
Где входная последовательность зафиксирована на 25 (a-to-y, чтобы предсказать z), и паттерны начинаются с нуля.
Наконец, возникает вопрос об обучении сети LSTM с использованием входных последовательностей переменной длины для прогнозирования следующего символа.
LSTM с вводом переменной длины на выход с одним символом
В предыдущем разделе мы обнаружили, что LSTM с «сохранением состояния» в Keras на самом деле был всего лишь ярлыком для воспроизведения первых n-последовательностей, но на самом деле не помог нам выучить общую модель алфавита.
В этом разделе мы исследуем разновидность LSTM «без гражданства», которая изучает случайные подпоследовательности алфавита, и пытаемся построить модель, которой можно дать произвольные буквы или подпоследовательности букв, и предсказать следующую букву в алфавите.
Во-первых, мы меняем структуру проблемы. Для упрощения мы определим максимальную длину входной последовательности и установим ее на небольшое значение, например 5, чтобы ускорить обучение. Это определяет максимальную длину подпоследовательностей алфавита, которые будут нарисованы для обучения. В расширениях это может быть установлено как полный алфавит (26) или дольше, если мы разрешаем возврат к началу последовательности.
Нам также нужно определить количество случайных последовательностей для создания, в данном случае 1000. Это тоже может быть больше или меньше. Я ожидаю, что на самом деле требуется меньше моделей.
# prepare the dataset of input to output pairs encoded as integers num_inputs = 1000 max_len = 5 dataX = [] dataY = [] for i in range(num_inputs): start = numpy.random.randint(len(alphabet)-2) end = numpy.random.randint(start, min(start+max_len,len(alphabet)-1)) sequence_in = alphabet[start:end+1] sequence_out = alphabet[end + 1] dataX.append([char_to_int[char] for char in sequence_in]) dataY.append(char_to_int[sequence_out]) print(sequence_in, '->', sequence_out)
Запуск этого кода в более широком контексте создаст шаблоны ввода, которые выглядят следующим образом:
PQRST -> U W -> X O -> P OPQ -> R IJKLM -> N QRSTU -> V ABCD -> E X -> Y GHIJ -> K
Длина входных последовательностей варьируется от 1 доmax_lenи, следовательно, требуют заполнения нулями. Здесь мы используем отступ слева (префикс) со встроенными Keraspad_sequences ()функция.
X = pad_sequences(dataX, maxlen=max_len, dtype='float32')
Обученная модель оценивается по случайно выбранным шаблонам ввода Это также могут быть новые случайно сгенерированные последовательности символов. Я также считаю, что это также может быть линейная последовательность, засеянная буквой «А», с выходами, возвращаемыми в виде односимвольных входов.
Полный список кодов приведен ниже для полноты.
# LSTM with Variable Length Input Sequences to One Character Output import numpy from keras.models import Sequential from keras.layers import Dense from keras.layers import LSTM from keras.utils import np_utils from keras.preprocessing.sequence import pad_sequences from theano.tensor.shared_randomstreams import RandomStreams # fix random seed for reproducibility numpy.random.seed(7) # define the raw dataset alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" # create mapping of characters to integers (0-25) and the reverse char_to_int = dict((c, i) for i, c in enumerate(alphabet)) int_to_char = dict((i, c) for i, c in enumerate(alphabet)) # prepare the dataset of input to output pairs encoded as integers num_inputs = 1000 max_len = 5 dataX = [] dataY = [] for i in range(num_inputs): start = numpy.random.randint(len(alphabet)-2) end = numpy.random.randint(start, min(start+max_len,len(alphabet)-1)) sequence_in = alphabet[start:end+1] sequence_out = alphabet[end + 1] dataX.append([char_to_int[char] for char in sequence_in]) dataY.append(char_to_int[sequence_out]) print(sequence_in, '->', sequence_out) # convert list of lists to array and pad sequences if needed X = pad_sequences(dataX, maxlen=max_len, dtype='float32') # reshape X to be [samples, time steps, features] X = numpy.reshape(X, (X.shape[0], max_len, 1)) # normalize X = X / float(len(alphabet)) # one hot encode the output variable y = np_utils.to_categorical(dataY) # create and fit the model batch_size = 1 model = Sequential() model.add(LSTM(32, input_shape=(X.shape[1], 1))) model.add(Dense(y.shape[1], activation='softmax')) model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy']) model.fit(X, y, epochs=500, batch_size=batch_size, verbose=2) # summarize performance of the model scores = model.evaluate(X, y, verbose=0) print("Model Accuracy: %.2f%%" % (scores[1]*100)) # demonstrate some model predictions for i in range(20): pattern_index = numpy.random.randint(len(dataX)) pattern = dataX[pattern_index] x = pad_sequences([pattern], maxlen=max_len, dtype='float32') x = numpy.reshape(x, (1, max_len, 1)) x = x / float(len(alphabet)) prediction = model.predict(x, verbose=0) index = numpy.argmax(prediction) result = int_to_char[index] seq_in = [int_to_char[value] for value in pattern] print(seq_in, "->", result)
Запуск этого кода приводит к следующему выводу:
Model Accuracy: 98.90% ['Q', 'R'] -> S ['W', 'X'] -> Y ['W', 'X'] -> Y ['C', 'D'] -> E ['E'] -> F ['S', 'T', 'U'] -> V ['G', 'H', 'I', 'J', 'K'] -> L ['O', 'P', 'Q', 'R', 'S'] -> T ['C', 'D'] -> E ['O'] -> P ['N', 'O', 'P'] -> Q ['D', 'E', 'F', 'G', 'H'] -> I ['X'] -> Y ['K'] -> L ['M'] -> N ['R'] -> T ['K'] -> L ['E', 'F', 'G'] -> H ['Q'] -> R ['Q', 'R', 'S'] -> T
Мы можем видеть, что, хотя модель не выучила алфавит идеально из случайно сгенерированных подпоследовательностей, она справилась очень хорошо. Модель не была настроена и может потребовать больше обучения или большей сети, или обоих (упражнение для читателя).
Это хорошее естественное продолжениевсе примеры последовательного ввода в каждом пакетеМодель алфавита, изученная выше, заключается в том, что она может обрабатывать специальные запросы, но на этот раз произвольной длины последовательности (до максимальной длины).
Резюме
В этом посте вы обнаружили рекуррентные нейронные сети LSTM в Керасе и то, как они управляют состоянием.
- Как разработать простую сеть LSTM для предсказания от одного символа к одному.
- Как настроить наивный LSTM для изучения последовательности по временным шагам в образце.
- Как настроить LSTM для изучения последовательности между образцами путем ручного управления состоянием.
У вас есть вопросы по управлению состоянием LSTM или по поводу этого поста?
Задайте свои вопросы в комментарии, и я сделаю все возможное, чтобы ответить.