使用CNN(EfficientNetB7)训练图像分类模型时准确率为0,求排查错误
错误原因及修正方案
输出层与类别数不匹配
数据集有3类,但最后一层Dense仅设置1个单元,搭配softmax激活后,输出永远为1,完全无法区分类别。需修改为:model=tf.keras.layers.Dense(3, activation="softmax")(model)标签编码与损失函数不匹配
当前使用categorical_crossentropy损失函数,要求标签为one-hot编码格式,但代码中未对加载的trainY和testY做编码处理,需添加:trainY = to_categorical(trainY, num_classes=3) testY = to_categorical(testY, num_classes=3)若不想使用one-hot编码,也可将损失函数改为
sparse_categorical_crossentropy,此时标签可保留原始整数形式(0、1、2)。输入通道维度缺失
模型定义的输入形状为(224,224,1),但你注释掉了trainX = np.expand_dims(trainX, axis=3),若原始trainX是灰度图(形状为(样本数,224,224)),则输入维度不匹配,会导致模型无法正确提取特征。需取消注释该行,确保输入形状为(样本数,224,224,1)。模型初始化的优化建议
设置weights=None会让模型完全随机初始化,收敛难度大。若数据集与ImageNet分布类似,可尝试使用预训练权重:efficient = EfficientNetB7(weights="imagenet", include_top=False, input_shape=(224,224,3))注意此时需将输入图像转为3通道RGB格式;若必须用灰度图,可保持随机初始化,但需适当增加训练轮数或调整学习率。
内容的提问来源于stack exchange,提问作者Colab4066
相关产品推荐
相关产品推荐

