【问题标题】:Why does my keras LSTM model get stuck in an infinite loop?为什么我的 keras LSTM 模型会陷入无限循环?
【发布时间】:2019-10-06 06:00:04
【问题描述】:

我正在尝试构建一个小型 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'])

但无论我训练多少,模型似乎永远不会生成&lt;eos&gt; 甚至\n。我想这可能是因为我的 LSTM 大小是 128 而我的 seq_length 是 200,但这不是很有意义吗?我有什么遗漏吗?

【问题讨论】:

  • 您是否正在将您的单词转换为数字标记?您实际上是如何输入数据以适合您的模型的?我现在看到的只是定义当前和下一个序列,但这些是实际的标记本身。
  • 我一击将标记编码为向量

标签: python tensorflow keras neural-network lstm


【解决方案1】:

有时,当没有limit for code generationthe &lt;EOS&gt; or &lt;SOS&gt; 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

然后,在生成文本时,只需添加一个&lt;SOS&gt; 标记即可。 你可以使用https://github.com/sherjilozair/char-rnn-tensorflow,一个字符级别的rnn作为参考。

【讨论】:

    猜你喜欢
    • 2023-03-22
    • 2016-04-08
    • 2010-11-01
    • 2020-07-13
    • 2019-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-09
    相关资源
    最近更新 更多