基于HDF Store构建Keras fit_generator数据生成器遇阻求助
解决Keras fit_generator结合HDF Store数据生成器的问题
兄弟,我之前也在Keras里用HDF Store做生成器踩过不少坑,看你给出的代码片段,大概率是生成器的核心逻辑没写全或者细节没处理好,我给你捋捋解决方案:
补全并修正后的完整生成器代码
def myGenerator(myStore, generateFrom, generateTo, batch_size=32): # 假设你的HDF Store里,特征存在键'X'下,标签存在键'y'下,根据实际情况修改 total_samples = generateTo - generateFrom + 1 # Keras的fit_generator需要生成器无限循环输出batch,所以外层套while True while True: # 按batch大小遍历指定的数据范围 for start_idx in range(generateFrom, generateTo + 1, batch_size): # 处理最后一个batch的边界,避免索引越界 end_idx = min(start_idx + batch_size, generateTo + 1) # 从HDF Store读取当前batch的特征和标签 # 如果存的是Pandas DataFrame,记得转成numpy数组(Keras只认numpy数组) X_batch = myStore['X'][start_idx:end_idx] y_batch = myStore['y'][start_idx:end_idx] X = X_batch.values if hasattr(X_batch, 'values') else X_batch y = y_batch.values if hasattr(y_batch, 'values') else y_batch # 输出当前batch,这是生成器的核心:必须用yield返回数据 yield (X, y)
几个关键注意点(都是我踩过的坑)
- 必须保留外层的
while True:Keras的fit_generator会持续从生成器拉取数据,直到跑完你指定的steps_per_epoch(计算公式:steps_per_epoch = 总样本数 // batch_size),无限循环能保证生成器不会提前终止 - 处理最后一个batch的边界:用
min(end_idx, generateTo + 1)可以避免当总样本数不是batch_size整数倍时,最后一次读取出现索引越界的问题 - 数据格式转换:如果你的HDF里存的是Pandas的DataFrame/Series,一定要用
.values转成numpy数组——Keras的模型输入不接受Pandas对象,这是很多人忽略的点 - 提前测试生成器:在喂给模型之前,先单独跑
gen = myGenerator(...),然后next(gen)看看输出的X和y的维度、数据类型是否符合你的模型输入要求
额外排查建议
- 检查
generateFrom和generateTo的范围是否正确,比如有没有超过HDF数据集的总长度 - 如果是多输入模型,要把yield改成对应格式,比如
yield ([X1, X2], y)或者yield ({'input1': X1, 'input2': X2}, {'output': y}) - 确保HDF Store是用正确的模式打开的:如果只是读取数据,用
mode='r'打开会更安全,避免意外写入导致的错误
内容的提问来源于stack exchange,提问作者szeta
相关产品推荐
相关产品推荐

