基于VGG的肺部疾病X光分类模型fit_generator报InvalidArgumentError求助
胸部X光肺部疾病分类训练报错解决方案
问题概述
训练基于胸部X光片的肺部疾病图像分类模型时,遇到两个问题:
Model.fit_generator弃用警告- 训练时抛出
InvalidArgumentError,错误提示:Reduction axis -1 is empty in shape [32,0]
问题分析与解决方案
1. 解决fit_generator弃用问题
新版本Keras/TensorFlow中,fit_generator已被弃用,官方推荐直接使用model.fit,它完全支持数据生成器输入。修改训练代码如下:
history = model.fit( training_set, validation_data=test_set, epochs=5, steps_per_epoch=len(training_set), validation_steps=len(test_set) )
2. 解决Reduction axis -1 is empty in shape [32,0]错误
这个错误的核心原因是模型最后一层的输出维度与数据集的类别数不匹配,导致计算准确率时无法对维度为0的轴做ArgMax操作。具体排查和修复步骤:
步骤1:确认数据集类别数
在加载数据集后,打印训练集的类别数:
print("训练集类别数:", training_set.num_classes)
如果输出为0,说明你的数据集目录结构不符合flow_from_directory的要求:
flow_from_directory要求train和test目录下,每个类别必须对应一个独立的子文件夹,例如:train/ ├── normal/ │ ├── img1.jpg │ └── img2.jpg └── pneumonia/ ├── img3.jpg └── img4.jpg请检查你的数据集目录结构,确保每个类别都有对应的子文件夹,且子文件夹内存放对应类别的图像。
步骤2:匹配模型最后一层输出维度
如果数据集类别数为N(比如2类:正常/肺炎),模型的最后一层必须设置为Dense(N, activation='softmax'),因为你使用的是categorical_crossentropy损失函数,需要输出与类别数一致的概率分布。
例如,若类别数为2,模型最后一层应写为:
model.add(Dense(2, activation='softmax'))
额外检查:输入图像通道匹配
如果你的X光片是灰度图,需要在flow_from_directory中添加color_mode='grayscale'参数,同时确保模型的输入层形状为(224, 224, 1):
# 加载数据集时指定灰度模式 training_set = train_datagen.flow_from_directory( "/content/drive/MyDrive/train", target_size=(224, 224), batch_size=32, class_mode='categorical', color_mode='grayscale' # 新增 ) # 模型输入层对应调整 model.add(Input(shape=(224, 224, 1)))
验证修复
完成上述修改后,重新运行训练代码,即可解决报错问题。
内容的提问来源于stack exchange,提问作者Sweata Singha
相关产品推荐
相关产品推荐

