Как закодировать последовательность в последовательность RNN в керасе?

Я пытаюсь написать последовательность для последовательности RNN в керасе. Я запрограммировал эту программу, используя то, что понял из Интернета. Сначала я маркировал текст, затем преобразовывал текст в последовательность и дополнял, чтобы сформировать переменную объекта X. Целевая переменная Y была получена сначала смещением x влево, а затем дополнением. Наконец, я передал свою функцию и целевую переменную моей модели LSTM.

Это мой код, который я написал для этого в керасе.

from keras.preprocessing.text import Tokenizer,base_filter
from keras.preprocessing.sequence import pad_sequences
from keras.models import Sequential
from keras.layers import Dense, Activation,Dropout,Embedding
from keras.layers import LSTM


def shift(seq, n):
    n = n % len(seq)
    return seq[n:] + seq[:n]

txt="abcdefghijklmn"*100

tk = Tokenizer(nb_words=2000, filters=base_filter(), lower=True, split=" ")
tk.fit_on_texts(txt)
x = tk.texts_to_sequences(txt)
#shifing to left
y = shift(x,1)

#padding sequence
max_len = 100
max_features=len(tk.word_counts)
X = pad_sequences(x, maxlen=max_len)
Y = pad_sequences(y, maxlen=max_len)

#lstm model
model = Sequential()
model.add(Embedding(max_features, 128, input_length=max_len, dropout=0.2))
model.add(LSTM(128, dropout_W=0.2, dropout_U=0.2))
model.add(Dense(max_len))
model.add(Activation('softmax'))
model.compile(loss='binary_crossentropy', optimizer='rmsprop')

model.fit(X, Y, batch_size=200, nb_epoch=10)

Проблема в том, что он показывает ошибку

Epoch 1/10
IndexError: index 14 is out of bounds for size 14
Apply node that caused the error: AdvancedSubtensor1(if{inplace}.0, Reshape{1}.0)
Toposort index: 80

1 ответ

Решение

Проблема заключается в:

model.add(Embedding(max_features, 128, input_length=max_len, dropout=0.2))

В документации по встраиванию вы можете увидеть, что в качестве первого аргумента для него должен быть указан размер словаря + 1. Это потому, что всегда должно быть место для null слово, индекс которого 0, Из-за этого вам нужно изменить эту строку на:

model.add(Embedding(max_features + 1, 128, input_length=max_len, dropout=0.2))
Другие вопросы по тегам