【问题标题】:How to use fit_generator with sequential data that is split into batches?如何将 fit_generator 与分批的顺序数据一起使用?
【发布时间】:2023-03-15 15:49:02
【问题描述】:

我正在尝试为我的 Keras lstm 模型编写一个生成器。将其与 fit_generator 方法一起使用。 我的第一个问题是我的发电机应该返回什么?一批?一个序列? Keras 文档中的示例为每个数据条目返回 x,y,但是如果我的数据是连续的怎么办?我想分批?

这是为给定输入创建批处理的python方法

def get_batch(data, batch_num, batch_size, seq_length):
    i_start = batch_num*batch_size;
    batch_sequences = []
    batch_labels = []
    batch_chunk = data.iloc[i_start:(i_start+batch_size)+seq_length].values
    for i in range(0, batch_size):
        sequence = batch_chunk[(i_start+i):(i_start+i)+seq_length];
        label = data.iloc[(i_start+i)+seq_length].values;
        batch_labels.append(label)
        batch_sequences.append(sequence)
    return np.array(batch_sequences), np.array(batch_labels);

对于这样的输入,此方法的输出:

get_batch(data, batch_num=0, batch_size=2, seq_length=3):

应该是:

x = [
      [[1],[2],[3]],
      [[2],[3],[4]]
    ]

这是我想象的模型:

model = Sequential()
model.add(LSTM(256, return_sequences=True, input_shape=(seq_length, num_features)))
model.add(Dropout(0.2))
model.add(LSTM(256))
model.add(Dense(num_classes, activation='softmax'))
model.compile(loss='categorical_crossentropy', optimizer='adam')

我的问题是如何将我的方法转换为生成器?

【问题讨论】:

    标签: python keras deep-learning lstm recurrent-neural-network


    【解决方案1】:

    这是一个使用Sequence 的解决方案,它的作用类似于 Keras 中的生成器:

    class MySequence(Sequence):
      def __init__(self, num_batches):
        self.num_batches = num_batches
    
      def __len__(self):
        return self.num_batches # the length is the number of batches
    
      def __getitem__(self, batch_id):
        return get_batch(data, batch_id, self.batch_size, seq_length)
    

    我认为这更干净,不会修改您的原始功能。现在您将MySequence 的实例传递给model.fit_generator

    【讨论】:

    • 谢谢,这正是我所需要的,这种方法还允许我在fit_generator 中使用选项use_multiprocessing 异步获取批次。
    • 您能否详细说明使用带有__getitem__ 的类而不是使用生成器的优点?仅仅是它的线程安全吗?
    • 是的,差不多:Sequence 是一种更安全的多处理方式。这种结构保证网络在每个 epoch 的每个样本上只训练一次,而生成器则不是这样。来自doc
    • 谢谢@nuric!
    猜你喜欢
    • 2019-04-20
    • 2018-08-30
    • 2018-03-29
    • 1970-01-01
    • 1970-01-01
    • 2019-09-17
    • 1970-01-01
    • 2016-12-22
    • 2019-05-27
    相关资源
    最近更新 更多