Colab中用AlexNet+HDF5数据集做猫狗分类遇Empty logs错误求助
解决Keras训练时
ValueError: Unexpected result of train_function (Empty logs)问题 以下是针对你使用AlexNet+HDF5DatasetGenerator进行猫狗图像分类时遇到的报错的具体排查和解决步骤:
1. 验证HDF5数据集的有效性
首先确认你的HDF5文件是否包含有效数据:
import h5py # 检查训练集 with h5py.File('/content/train.hdf5', 'r') as f: print("训练集HDF5结构:", list(f.keys())) print("训练集图像形状:", f['images'].shape) print("训练集标签形状:", f['labels'].shape) # 检查验证集 with h5py.File('/content/val.hdf5', 'r') as f: print("验证集HDF5结构:", list(f.keys())) print("验证集图像形状:", f['images'].shape) print("验证集标签形状:", f['labels'].shape)
- 确保
images和labels字段存在,且形状匹配(图像数量与标签数量一致),且数量大于0。 - 如果文件为空或字段缺失,重新生成正确的HDF5数据集。
2. 测试HDF5DatasetGenerator的输出
手动调用生成器,确认它能返回有效的批次数据:
train_gen = trainGen.generator() try: batch_x, batch_y = next(train_gen) print("训练批次图像形状:", batch_x.shape) print("训练批次标签形状:", batch_y.shape) except StopIteration: print("生成器没有返回任何数据")
- 如果抛出
StopIteration或返回空数据,说明生成器的generator()方法实现存在问题,比如索引错误、数据读取逻辑错误。 - 检查
HDF5DatasetGenerator类的代码,确保它正确循环读取HDF5中的数据,且没有在预处理前过滤掉所有数据。
3. 排查预处理链的问题
单独测试每个预处理步骤,确认它们不会导致数据丢失或形状异常:
# 从HDF5中读取一张测试图像 with h5py.File('/content/train.hdf5', 'r') as f: test_img = f['images'][0] # 依次测试预处理 processed = pp.preprocess(test_img) print("PatchPreprocessor处理后形状:", processed.shape) processed = mp.preprocess(processed) print("MeanPreprocessor处理后形状:", processed.shape) processed = iap.preprocess(processed) print("ImageToArrayPreprocessor处理后形状:", processed.shape)
- 确保每一步处理后的数据形状符合预期(最终应为
(227, 227, 3))。 - 如果某一步返回空或形状错误,检查对应预处理类的
preprocess方法实现。
4. 修正训练参数计算
确认steps_per_epoch和validation_steps的计算是否合理:
print("训练集总图像数:", trainGen.numImages) print("计算的steps_per_epoch:", trainGen.numImages // 128) print("验证集总图像数:", valGen.numImages) print("计算的validation_steps:", valGen.numImages // 128)
- 如果
steps_per_epoch为0,说明训练集图像数量小于batch_size(128),此时需要减小batch_size,或者确认HDF5中的数据数量是否正确。 - 可以尝试将batch_size改为32或更小,重新测试。
5. 排除回调函数干扰
先注释掉TrainingMonitor回调,看训练是否能正常运行:
# 注释掉回调 # path = os.path.sep.join([OUTPUT_PATH, "{}.png".format(os.getpid())]) # callbacks = [TrainingMonitor(path)] # 重新训练 model.fit_generator( trainGen.generator(), steps_per_epoch = trainGen.numImages // 128, validation_data = valGen.generator(), validation_steps = valGen.numImages // 128, epochs =1, max_queue_size = 10, verbose = 1 )
- 如果注释后训练正常,说明
TrainingMonitor回调存在问题,比如OUTPUT_PATH不存在、没有写入权限,或者回调内部逻辑错误导致训练中断。
6. 版本兼容性检查
在Colab中尝试升级TensorFlow和Keras到最新稳定版,避免版本bug:
!pip install --upgrade tensorflow keras
内容的提问来源于stack exchange,提问作者Ibrahim Oussama benhabi
相关产品推荐
相关产品推荐

