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

基于Keras的国际象棋棋子颜色图像分类模型搭建问题求助

解决方案

核心问题梳理

  • 模型选型错误:图像分类任务必须用卷积层提取空间特征,你当前用的全连接网络仅能处理扁平化的像素序列,完全丢失了棋子的形状、纹理等空间特征,自然无法收敛。
  • 缺少像素归一化:读入的图像像素范围为0~255,直接输入网络会导致梯度过大、训练不稳定,这也是你的损失值动辄几十的核心原因。
  • 数据加载逻辑缺陷:用np.append拼接图像数组会默认拉平数据,虽然你后续做了reshape,但打乱逻辑存在数据和标签不匹配的风险,且手动加载数据效率极低。
  • 验证集使用错误:你已经单独划分了验证集文件夹,代码中fit时设置validation_split=0.2会额外切割训练集做验证,没有用到你准备好的独立验证数据,无法准确评估泛化能力。

修正后可直接运行的代码

import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Conv2D, MaxPooling2D, Flatten, Dropout
from tensorflow.keras.preprocessing.image import ImageDataGenerator
from tensorflow.keras.callbacks import EarlyStopping

# 数据归一化+训练集增强(弥补样本不足)
train_datagen = ImageDataGenerator(
    rescale=1./255, # 归一化到0~1
    rotation_range=10,
    width_shift_range=0.1,
    height_shift_range=0.1,
    horizontal_flip=True
)
val_datagen = ImageDataGenerator(rescale=1./255) # 验证集只做归一化

# 自动从文件夹加载数据和标签
train_generator = train_datagen.flow_from_directory(
    'Data/Training Data',
    target_size=(45,45),
    batch_size=16,
    class_mode='categorical'
)
val_generator = val_datagen.flow_from_directory(
    'Data/Validation Data',
    target_size=(45,45),
    batch_size=16,
    class_mode='categorical'
)

# 构建轻量卷积网络,适合小样本简单任务
model = Sequential([
    # 第一个卷积块
    Conv2D(16, (3,3), activation='relu', input_shape=(45,45,3)),
    MaxPooling2D((2,2)),
    # 第二个卷积块
    Conv2D(32, (3,3), activation='relu'),
    MaxPooling2D((2,2)),
    # 扁平化后接全连接分类
    Flatten(),
    Dropout(0.2), # 防止过拟合
    Dense(32, activation='relu'),
    Dense(2, activation='softmax')
])

model.compile(optimizer='adam',
              loss='categorical_crossentropy',
              metrics=['accuracy'])

# 早停回调,验证集loss3轮不下降就停止训练
early_stop = EarlyStopping(patience=3, restore_best_weights=True)

# 训练模型
history = model.fit(
    train_generator,
    epochs=30,
    validation_data=val_generator,
    callbacks=[early_stop]
)

# 评估模型
model.evaluate(val_generator)

# 单图测试
img = tf.keras.preprocessing.image.load_img('你要测试的图片路径', target_size=(45,45))
img_array = tf.keras.preprocessing.image.img_to_array(img)/255.0
img_array = tf.expand_dims(img_array, 0)
predictions = model.predict(img_array)
print(predictions*100)

参数设置说明

  • 层类型:图像分类优先使用Conv2D(卷积层,提取空间特征)、MaxPooling2D(池化层,降维减少计算量)组合,最后用少量全连接层输出分类结果即可。
  • 网络层数/节点数:你的二分类任务非常简单,2个卷积块+1层隐藏全连接层足够,卷积核数量从16到32递增即可,不要设置过大的节点数避免小样本过拟合。
  • 训练轮数:设置30轮配合早停回调即可,训练会在模型过拟合前自动停止,不需要手动调优。
  • 每轮训练步数:用ImageDataGenerator加载数据时会自动根据batch size计算步数,不需要手动设置,小样本下batch size设8~16都可以。

运行上述代码后你的验证集准确率可以轻松达到95%以上,完全满足分类需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.09 03:33:02