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

TensorFlow模型输出随机预测结果,训练准确率低下求助

自定义硬币旋转数据集训练模型准确率极低的排查与修复

问题背景

我是机器学习和TensorFlow新手,用10张垂直方向的便士硬币图做数据增强:生成0-360度步长4度的90种旋转图,共900张无平移图像训练模型。测试用旋转前的原始图,预测结果却随机;训练准确率仅约1%,验证准确率为0。尝试调整网络层、图像分辨率无效,不知从何入手。

以下是核心问题分析和修复方案:


核心问题拆解

1. 数据集构建致命错误

用tf.data.Dataset.from_tensors会把整个900张图+标签打包成单个样本,模型每次训练只处理1个batch,梯度更新逻辑完全错误——这是准确率极低的直接原因。

2. 模型结构与任务不匹配

你的任务是识别90种细粒度旋转角度,却用了全连接网络(Flatten+Dense)。全连接网络会丢失图像空间信息,无法捕捉旋转带来的细微特征变化,根本不适合图像分类任务。

3. 学习率设置过低

1e-5的学习率会让Adam优化器参数更新极慢,训练10轮相当于正常设置下的几分之一进度,很难看到效果。

4. 标签与类别数可能不匹配

代码中用len(arrClasses)作为输出层神经元数,但你生成的标签是int(angle/4),范围是0-89(共90类),若arrClasses长度不是90,会导致分类目标混乱。


修复步骤

1. 修正数据集构建

把from_tensors换成from_tensor_slices,让每个图像和标签成为单独样本,再添加shuffle和batch提升训练效率:

train_images_tensor = tf.convert_to_tensor(train_images, name='train images')
train_labels_tensor = tf.convert_to_tensor(train_labels, name='train labels')

# 正确构建数据集
train_ds = tf.data.Dataset.from_tensor_slices((train_images_tensor, train_labels_tensor))
train_ds = train_ds.shuffle(900).batch(32)  # 打乱+批量处理

# 验证集同理
valid_ds = tf.data.Dataset.from_tensor_slices((valid_images_tensor, valid_labels_tensor))
valid_ds = valid_ds.shuffle(len(valid_images)).batch(32)

2. 更换为卷积神经网络(CNN)

CNN专门处理图像空间特征,能有效捕捉旋转后的特征差异,示例模型:

model = tf.keras.models.Sequential([
    # 灰度图输入形状为(IMAGE_SIZE, IMAGE_SIZE, 1)
    tf.keras.layers.Conv2D(32, (3,3), activation='relu', input_shape=(IMAGE_SIZE, IMAGE_SIZE, 1)),
    tf.keras.layers.MaxPooling2D((2,2)),
    tf.keras.layers.Conv2D(64, (3,3), activation='relu'),
    tf.keras.layers.MaxPooling2D((2,2)),
    tf.keras.layers.Conv2D(64, (3,3), activation='relu'),
    tf.keras.layers.Flatten(),
    tf.keras.layers.Dense(64, activation='relu'),
    tf.keras.layers.Dense(90)  # 直接指定90类,避免arrClasses的不确定性
])

3. 调整学习率

把学习率改为Adam默认的1e-3,加快参数更新:

opt = tf.keras.optimizers.Adam(learning_rate=1e-3)

4. 验证数据增强正确性

检查RotateImage函数是否正确实现,可视化几张旋转后的图像,确认标签和图像旋转角度一一对应,避免出现旋转错误导致数据集无效。

5. 优化训练策略

  • 增加训练轮数到30-50轮
  • 添加早停回调防止过拟合:
early_stop = tf.keras.callbacks.EarlyStopping(monitor='val_loss', patience=5)
model.fit(
    train_ds,
    validation_data=valid_ds,
    verbose=1,
    epochs=50,
    callbacks=[tensorboard_callback, early_stop]
)

预期效果

修改后,训练准确率应该会快速上升,几轮后就能达到80%以上,验证准确率也会同步提升。如果仍无改善,再检查:

  • 图像归一化是否正确(你已做/255.0,没问题)
  • 验证集是否包含模型训练过的角度样本
  • 标签生成逻辑是否完全对应旋转角度

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 00:01:01