You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 21:27:39