【问题标题】:how to set steps_per_epoch in varibale input length in fit_generator keras如何在fit_generator keras中以可变输入长度设置steps_per_epoch
【发布时间】:2019-08-10 20:30:57
【问题描述】:

我需要将输入数据提供给模型,使相同长度的句子在同一个批次中(LSTM 中的可变输入长度)。

我的问题是,当我们使用fit_generator 时,我们需要指定steps_per_epoch , validation_steps,但在我的情况下,我无法通过简单的num_train_steps = len(Xtrain) // BATCH_SIZE 来实现。现在我的问题是,我在哪里可以计算并将其传递给fit_generator?我在 sentence_generator 中有 steps_per_epoch,但我不知道如何将其传递给 fit_generator

有什么方法可以返回sentence_generator中每个批次的长度吗?

这是fit_generator(不知道如何实现num_train_steps并传递给fit_generator?)

lstm_ae_model.fit_generator(train_gen, val_gen, num_train_steps, num_val_steps, dir, NUM_EPOCHS=1)

所以我的自定义生成器是这样的,以防万一它可以提供帮助:

def sentence_generator(X, embeddings):
    while True:
        # loop once per epoch
        index_sentence = 0
        import itertools
        items = sorted(X.values(), key=len, reverse=True)
        for length, dics in itertools.groupby(items, len):
            # dics is all the nested dictionaries with this length
            a = 0
            for x in dics:
                a = a+1
            num_train_steps = a
            sent_wids = np.zeros([a, length])
            for temp_sentence in dics:
                keys_words = list(temp_sentence.keys())
                for index_word in range(len(keys_words)):
                    sent_wids[index_sentence, index_word] = lookup_word2id(keys_words[index_word])
                index_sentence = index_sentence + 1
                Xbatch = embeddings[sent_wids]
                yield Xbatch, Xbatch

【问题讨论】:

  • 如果你一直训练到一个停止条件,你实际上可以使用任意数量和非常多的 epoch,不会有太大的区别。
  • @DanielMöller 所以你的意思是这个数字不需要是实数?
  • 这只是你每个时期绘制的批次数量,仅此而已。如果您有 10 个批次,并且每个 epoch 绘制 10 个批次,则一个 epoch 将循环生成器。如果每个 epoch 绘制一个,则生成器将循环 10 个 epoch。如果您不想要一个确切的数字并且会等到验证损失停止增长,那么只需使用任何数字。

标签: tensorflow keras lstm autoencoder seq2seq


【解决方案1】:

您可以做的是首先创建一个函数,通过迭代数据集并计算该值来预先计算steps_per_epoch 的值,然后将其传递给fit_generator。比如:

def compute_steps(X):
    import itertools
    items = sorted(X.values(), key=len, reverse=True)
    count = 0
    for length, dics in itertools.groupby(items, len):
        count += 1

    return count

spe = compute_steps(...)
gen = sentence_generator(...)
model.fit_generator(gen, steps_per_epoch=spe)

对验证数据做同样的事情。

【讨论】:

  • 我这里有个疑问,比如说第一批数据是用length=4生成的,怎么保证下一次会去计算下一个长度的数据,我感觉每次都会从头开始。
  • @sariii 你的生成器会这样做,每次调用它都会给出下一批。
猜你喜欢
  • 1970-01-01
  • 2018-03-30
  • 2019-10-26
  • 2016-11-06
  • 1970-01-01
  • 1970-01-01
  • 2020-01-02
  • 1970-01-01
  • 2018-03-01
相关资源
最近更新 更多