如何将 fit_generator 与分成批次的顺序数据一起使用?
How to use fit_generator with sequential data that is split into batches?
我正在尝试为我的 Keras lstm 模型编写一个生成器。与 fit_generator 方法一起使用。
我的第一个问题是我的生成器 return 应该是什么?一批?序列?
Keras 文档中的示例 returns 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')
我的问题是如何将我的方法转化为生成器?
这是一个使用 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
.
我正在尝试为我的 Keras lstm 模型编写一个生成器。与 fit_generator 方法一起使用。 我的第一个问题是我的生成器 return 应该是什么?一批?序列? Keras 文档中的示例 returns 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')
我的问题是如何将我的方法转化为生成器?
这是一个使用 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
.