Почему моя модель keras LSTM застревает в бесконечном цикле? - PullRequest
14 голосов
/ 19 мая 2019

Я пытаюсь создать небольшой LSTM, который может научиться писать код (даже если это мусорный код), обучая его существующему коду Python. Я объединил несколько тысяч строк кода в один файл на несколько сотен файлов, каждый из которых оканчивается на <eos>, обозначая «конец последовательности».

В качестве примера мой тренировочный файл выглядит так:


setup(name='Keras',
...
      ],
      packages=find_packages())
<eos>
import pyux
...
with open('api.json', 'w') as f:
    json.dump(sign, f)
<eos>

Я создаю токены из слов с:

file = open(self.textfile, 'r')
filecontents = file.read()
file.close()
filecontents = filecontents.replace("\n\n", "\n")
filecontents = filecontents.replace('\n', ' \n ')
filecontents = filecontents.replace('    ', ' \t ')

text_in_words = [w for w in filecontents.split(' ') if w != '']

self._words = set(text_in_words)
    STEP = 1
    self._codelines = []
    self._next_words = []
    for i in range(0, len(text_in_words) - self.seq_length, STEP):
        self._codelines.append(text_in_words[i: i + self.seq_length])
        self._next_words.append(text_in_words[i + self.seq_length])

Моя keras модель:

model = Sequential()
model.add(Embedding(input_dim=len(self._words), output_dim=1024))

model.add(Bidirectional(
    LSTM(128), input_shape=(self.seq_length, len(self._words))))

model.add(Dropout(rate=0.5))
model.add(Dense(len(self._words)))
model.add(Activation('softmax'))

model.compile(loss='sparse_categorical_crossentropy',
              optimizer="adam", metrics=['accuracy'])

Но независимо от того, сколько я тренируюсь, модель никогда не генерирует <eos> или даже \n. Я думаю, это может быть из-за того, что мой размер LSTM равен 128, а мой seq_length равен 200, но это не имеет смысла? Я что-то упускаю?

1 Ответ

4 голосов
/ 23 мая 2019

Иногда, когда нет limit for code generation или the <EOS> or <SOS> tokens are not numerical tokens, LSTM никогда не сходится.Если бы вы могли отправлять свои выводы или сообщения об ошибках, было бы намного проще отлаживать.

Вы могли бы создать дополнительный класс для получения слов и предложений.

# tokens for start of sentence(SOS) and end of sentence(EOS)

SOS_token = 0
EOS_token = 1


class Lang:
    '''
    class for word object, storing sentences, words and word counts.
    '''
    def __init__(self, name):
        self.name = name
        self.word2index = {}
        self.word2count = {}
        self.index2word = {0: "SOS", 1: "EOS"}
        self.n_words = 2  # Count SOS and EOS

    def addSentence(self, sentence):
        for word in sentence.split(' '):
            self.addWord(word)

    def addWord(self, word):
        if word not in self.word2index:
            self.word2index[word] = self.n_words
            self.word2count[word] = 1
            self.index2word[self.n_words] = word
            self.n_words += 1
        else:
            self.word2count[word] += 1

Затем, при генерации текстапросто добавьте токен <SOS>.Вы можете использовать https://github.com/sherjilozair/char-rnn-tensorflow, уровень персонажа rnn для справки.

...