基于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
相关产品推荐
相关产品推荐

