TensorFlow三分类图像模型准确率停滞在0.33的问题求助
解决3类图像分类准确率停滞在0.33的问题
看起来你的模型一直在随机猜测(3类的随机准确率正好≈0.33),核心问题出在预测层的设置和损失函数与标签格式的匹配上,下面是具体的修正步骤:
1. 修正预测层的单元数
你当前的预测层是Dense(1, activation=tf.nn.softmax),这是完全错误的:
- 对于3类分类任务,Dense层的单元数必须等于类别数(也就是3),这样softmax才能输出对应3个类别的概率分布。
- 如果只设置1个单元,softmax的输出永远是1,模型根本无法区分不同类别,自然只能随机猜。
修改为:
prediction_layer = tf.keras.layers.Dense(3, activation='softmax')
2. 匹配损失函数与标签格式
image_dataset_from_directory默认返回的是整数标签(比如0、1、2分别代表三个类别),而CategoricalCrossentropy需要标签是独热编码格式(比如[1,0,0]、[0,1,0]、[0,0,1])。这里有两种更合理的解决方式:
方式一:改用SparseCategoricalCrossentropy(推荐,无需修改标签)
这种损失函数专门为整数标签的多分类任务设计,直接替换即可:
model.compile( optimizer=tf.keras.optimizers.SGD(lr=base_learning_rate), loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=False), metrics=['accuracy'] )
方式二:将标签转为独热编码(可选)
如果坚持要用CategoricalCrossentropy,需要在数据集处理时把整数标签转成独热编码:
def convert_to_one_hot(image, label): label = tf.one_hot(label, depth=3) return image, label train_dataset = train_ds.map(convert_to_one_hot).cache().prefetch(buffer_size=tf.data.experimental.AUTOTUNE) validation_dataset = val_ds.map(convert_to_one_hot).cache().prefetch(buffer_size=tf.data.experimental.AUTOTUNE)
3. 可选:优化器调整(辅助提升收敛速度)
SGD在小学习率下收敛可能比较慢,你可以试试用Adam优化器,在迁移学习场景中它通常表现更灵活:
model.compile( optimizer=tf.keras.optimizers.Adam(learning_rate=base_learning_rate), loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=False), metrics=['accuracy'] )
修正后的核心代码片段
# 修正预测层 prediction_layer = tf.keras.layers.Dense(3, activation='softmax') inputs = tf.keras.Input(shape=(img_width, img_height, 3)) x = inputs x = preprocess_input(x) x = base_model(x, training=False) x = global_average_layer(x) x = tf.keras.layers.Dropout(0.2)(x) outputs = prediction_layer(x) model = tf.keras.Model(inputs, outputs) # 修正损失函数与优化器 base_learning_rate = 0.0001 model.compile( optimizer=tf.keras.optimizers.Adam(learning_rate=base_learning_rate), loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=False), metrics=['accuracy'] ) initial_epochs = 50 loss0, accuracy0 = model.evaluate(validation_dataset) history = model.fit(train_dataset, epochs=initial_epochs, validation_data=validation_dataset)
为什么会出现0.33的准确率?
因为你的预测层只有1个单元,softmax输出永远是1,模型无法学习到类别之间的特征差异,只能随机猜测3个类别,所以准确率稳定在1/3≈0.33的水平。修正上述问题后,模型就能正常学习不同类别的特征了。
内容的提问来源于stack exchange,提问作者Herrho
相关产品推荐
相关产品推荐

