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

TensorFlow 2.0模型始终预测同一标签问题排查求助

问题描述

作为机器学习和TensorFlow新手,参考教程实现自定义训练循环,在CIFAR10数据集训练3轮后,训练准确率60%、验证准确率54%。但加载模型测试时,无论输入差异明显的船、飞机、马等图片,输出的softmax分布几乎完全一致,始终将第4类(猫)作为预测结果,更换优化器也无改善。

问题根源

  • 训练与测试输入分布不匹配:CIFAR10原始数据是uint8格式(取值0-255),但测试脚本中通过tf.io.decode_image得到的是float32格式(取值0-1),模型训练和推理的输入数据范围不一致,导致输出异常。
  • 训练日志时机错误:自定义训练循环中,在更新训练指标前就记录准确率,导致日志中的准确率并非当前批次的真实结果(非核心问题,但影响训练监控)。
  • 测试图片处理冗余:直接修改并保存原始图片无必要,且未对齐训练阶段的预处理逻辑。

修正方案

1. 模型训练代码修改(核心:统一数据归一化)

在加载数据集后,将所有数据归一化到0-1范围,确保训练和推理输入分布一致:

# 数据集加载及预处理
(x_train, y_train), (x_test, y_test) = keras.datasets.cifar10.load_data()
# 统一归一化到0-1
x_train = x_train.astype("float32") / 255.0
x_val = x_train[-10000:]
x_train = x_train[:-10000]
x_test = x_test.astype("float32") / 255.0

同时调整训练循环中的日志时机,确保指标更新后再记录:

# 先更新训练指标,再记录准确率
train_acc_metric.update_state(y_batch_train, logits)
wandb.log({"train_acc": train_acc_metric.result()})

2. 测试脚本修改(对齐预处理逻辑)

移除不必要的图片保存操作,确保输入数据和训练阶段一样归一化到0-1:

from PIL import Image
import tensorflow as tf
import keras
import numpy as np

def prepare_image(directory):
    # 直接读取并resize,无需保存修改后的图片
    img = Image.open(directory).resize((32, 32), Image.LANCZOS)
    # 转换为数组并归一化,和训练逻辑一致
    img_array = np.array(img).astype("float32") / 255.0
    # 添加batch维度
    input_tensor = tf.expand_dims(img_array, axis=0)
    return input_tensor

model = keras.models.load_model("cifar10_new.keras")

prediction = model.predict(prepare_image("random_images/car.png"))
prediction = tf.nn.softmax(prediction)
print(prediction)

额外优化建议

  • 增加训练轮数:3轮训练不足以让模型充分收敛,建议提升至20-30轮,可搭配学习率调度器(如keras.callbacks.ReduceLROnPlateau)优化训练过程。
  • 添加池化层:当前模型连续4个Conv2D无池化操作,特征图尺寸收缩过快,可在每两组Conv2D后添加layers.MaxPooling2D(),降低计算量同时增强特征提取能力。
  • 加入Dropout层:在全连接层前添加layers.Dropout(0.5),缓解模型过拟合。

内容的提问来源于stack exchange,提问作者girthquake

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 00:12:06