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

如何在Keras中从目录导入手写数字数据集(含阿拉伯BMP格式)

没问题,这两个场景我都熟,下面给你一步步拆解解决方案:

1. 在Keras中从目录导入类似MNIST的手写数字数据集

Keras提供了ImageDataGenerator配合flow_from_directory方法,非常适合从结构化目录中导入图像数据集,尤其是类似MNIST这种按类别分文件夹的场景。

首先确保你的目录结构是这样的(训练集和测试集结构完全一致):

train/
    0/
        img1.png
        img2.png
        ...
    1/
        img1.png
        img2.png
        ...
    ...
    9/
        img1.png
        img2.png
        ...
test/
    0/
    1/
    ...
    9/

接下来是具体代码:

# 导入必要的库
from tensorflow.keras.preprocessing.image import ImageDataGenerator
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Flatten, Conv2D, MaxPooling2D

# 初始化数据生成器,做像素值归一化(缩到0-1区间)
train_datagen = ImageDataGenerator(rescale=1./255)
test_datagen = ImageDataGenerator(rescale=1./255)

# 从目录加载训练数据
train_generator = train_datagen.flow_from_directory(
    'path/to/your/train/directory',  # 替换成你的训练集实际路径
    target_size=(28, 28),  # 统一图像尺寸(匹配MNIST的28x28)
    color_mode='grayscale',  # 手写数字是灰度图,选这个参数
    batch_size=32,  # 批量大小可根据显存调整
    class_mode='categorical'  # 多分类任务用这个,对应categorical_crossentropy损失
    # 如果标签是整数形式,也可以用class_mode='sparse',对应sparse_categorical_crossentropy
)

# 加载测试数据
test_generator = test_datagen.flow_from_directory(
    'path/to/your/test/directory',
    target_size=(28, 28),
    color_mode='grayscale',
    batch_size=32,
    class_mode='categorical'
)

# 示例模型训练代码
model = Sequential([
    Conv2D(32, (3,3), activation='relu', input_shape=(28,28,1)),
    MaxPooling2D((2,2)),
    Flatten(),
    Dense(128, activation='relu'),
    Dense(10, activation='softmax')
])

model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])
model.fit(train_generator, epochs=10, validation_data=test_generator)
2. 导入BMP格式的阿拉伯手写数字数据集

放心,Keras完全支持BMP格式的图像——因为底层依赖的PIL/Pillow库可以直接读取BMP文件,所以操作和上面几乎一致,只需要注意几个细节:

先确认你的目录结构符合要求(训练集、测试集下的子文件夹对应阿拉伯数字类别),然后直接用flow_from_directory方法即可,不需要额外处理格式。

适配后的代码:

from tensorflow.keras.preprocessing.image import ImageDataGenerator

# 初始化生成器,做像素归一化
train_datagen = ImageDataGenerator(rescale=1./255)
test_datagen = ImageDataGenerator(rescale=1./255)

# 加载训练数据,BMP格式会被自动识别
train_generator = train_datagen.flow_from_directory(
    'path/to/your/arabic_train_dir',  # 替换成你的阿拉伯数字训练集路径
    target_size=(28, 28),  # 确保图像尺寸统一(哪怕有个别图像尺寸不对,会自动调整)
    color_mode='grayscale',  # 阿拉伯手写数字一般是灰度图,若实际是彩色可改为'rgb'
    batch_size=32,
    class_mode='categorical'  # 按你的类别数量调整,比如如果是10类就用这个
)

test_generator = test_datagen.flow_from_directory(
    'path/to/your/arabic_test_dir',
    target_size=(28, 28),
    color_mode='grayscale',
    batch_size=32,
    class_mode='categorical'
)

# 后续模型训练和上面的示例一致,直接用model.fit(train_generator...)即可

几个额外小提示:

  • 若不确定图像是否为灰度图,可打开一张查看;如果是彩色但内容是灰度,用color_mode='grayscale'会自动转成单通道,更适合手写数字分类。
  • 如果你的数据集类别不是10个,记得调整模型最后一层Dense的单元数(比如15类就改成15)。
  • 若显存不足,可把batch_size调小(比如改成16)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 05:15:27