为什么我的keras LSTM模型陷入无限循环?

时间:2019-05-19 19:17:58

标签: python tensorflow keras neural-network lstm

我正在尝试构建一个小型LSTM,该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 个答案:

答案 0 :(得分:4)

有时,当没有import os import _simplebfs_cffi from cffi import FFI ffi = FFI() class run_bfs(): def __init__(self): self.bfs = _simplebfs_cffi.ffi.new("struct run_bfs*", None) def __call__(self): (self.bfs)() run_bfs()() limit for code generation时,LSTM从不收敛。如果您可以发送输出或错误消息,则调试起来会容易得多。

您可以创建一个额外的类来获取单词和句子。

the <EOS> or <SOS> tokens are not numerical tokens

然后,在生成文本时,只需添加一个# 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 令牌即可。 您可以使用https://github.com/sherjilozair/char-rnn-tensorflow(字符级别为rnn)作为参考。