Python 如何将fit_generator与分批的顺序数据一起使用?

Python 如何将fit_generator与分批的顺序数据一起使用?,python,keras,deep-learning,lstm,recurrent-neural-network,Python,Keras,Deep Learning,Lstm,Recurrent Neural Network,我正在尝试为我的Keras lstm模型编写一个生成器。将其与fit_生成器方法一起使用。 我的第一个问题是我的发电机应该返回什么?一批?一个序列? Keras文档中的示例为每个数据输入返回x,y,但如果我的数据是连续的呢?我想把它分成几批 下面是为给定输入创建批处理的python方法 def get_batch(data, batch_num, batch_size, seq_length): i_start = batch_num*batch_size; batch_sequ

我正在尝试为我的Keras lstm模型编写一个生成器。将其与fit_生成器方法一起使用。 我的第一个问题是我的发电机应该返回什么?一批?一个序列? 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')

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

这里有一个解决方案,它使用的方法与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\u generator

谢谢,这正是我需要的,这种方法还允许我使用
fit\u generator
中的选项
use\u multiprocessing
异步获取批。您能否详细介绍一下使用带有
\uuuuu getitem\uuuuu
的类而不是使用生成器的优点?只是它的线程安全吗?是的,非常安全:序列是进行多处理的更安全的方法。这种结构保证了网络在每个历元的每个样本上只训练一次,这与生成器不同。来自。谢谢@nuric!