Keras多分类模型匹配错误求助:38类图像识别模型报错
解决Keras多分类任务中标签形状不匹配的问题
嗨,我一眼就看出你遇到的问题啦——这是多分类任务里非常常见的新手小失误😉
问题根源
你的模型最后一层用了Dense(38, activation='softmax'),这是38类多分类的正确配置,输出形状是(None, 38)(对应每个样本的38类概率分布)。但你的数据生成器设置了class_mode='binary',这个参数是给二分类任务用的,它会生成形状为(batch_size, 1)的单值标签,和模型输出的形状完全不匹配,这就是报错的核心原因!
两种解决方法
根据你的需求,任选一种即可:
方法1:使用One-Hot编码标签(配合categorical_crossentropy)
把生成器的class_mode改成'categorical',这样生成的标签会是One-Hot编码的形状(batch_size, 38),和模型输出完美匹配:
# 修改生成器的class_mode参数 train_generator = train_datagen.flow_from_directory( 'data/train', target_size=(168, 192), batch_size=38, class_mode='categorical' # 这里修改 ) validation_generator = test_datagen.flow_from_directory( 'data/validation', target_size=(168, 192), batch_size=38, class_mode='categorical' # 这里修改 )
你的损失函数categorical_crossentropy不需要改动,因为它就是对应One-Hot标签的多分类损失计算方式。
方法2:使用整数标签(配合sparse_categorical_crossentropy)
如果不想用One-Hot编码(可以节省内存),可以把损失函数改成sparse_categorical_crossentropy,同时生成器的class_mode改成'sparse'(生成整数形式的标签,形状(batch_size,)):
# 修改损失函数 model.compile( loss='sparse_categorical_crossentropy', optimizer=adam(0.001), metrics=['accuracy'] ) # 修改生成器的class_mode参数 train_generator = train_datagen.flow_from_directory( 'data/train', target_size=(168, 192), batch_size=38, class_mode='sparse' # 这里修改 ) validation_generator = test_datagen.flow_from_directory( 'data/validation', target_size=(168, 192), batch_size=38, class_mode='sparse' # 这里修改 )
额外小优化
你的代码里重复定义了train_datagen和test_datagen各两次,可以删掉重复的部分,让代码更整洁:
# 只定义一次即可 train_datagen = ImageDataGenerator( rescale=1./255, shear_range=0.2, zoom_range=0.2, horizontal_flip=True) test_datagen = ImageDataGenerator(rescale=1./255)
内容的提问来源于stack exchange,提问作者Wiciaq123
相关产品推荐
相关产品推荐

