如何在 fit_generator keras 中设置可变输入长度的 steps_per_epoch

how to set steps_per_epoch in varibale input length in fit_generator keras

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

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

有什么方法可以 return 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

你可以做的是首先创建一个函数,通过在数据集上迭代并计算这个值来预先计算 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)

对验证数据做类似的事情。