如何使用MNIST数据集实现大于9的数字识别
现有代码不适用的核心原因
你当前的模型是针对MNIST单数字0-9设计的10分类模型,仅支持输出10种离散分类结果,既没有学习过大数、小数的特征,结构本身也不支持输出连续值或多字符组合结果,因此无法满足需求。
场景1:手写多位数/小数图像识别(输入为手写图像,输出对应数值)
如果你的需求是识别写有大于9的数字、小数的图像,按以下步骤调整:
- 数据集替换:原生MNIST仅包含单数字0-9样本,无法支撑大数/小数识别,你可以选用包含多数字的公开数据集,也可以自行拼接MNIST单数字、增加手写小数点样本生成合成数据集,标注为完整的数值字符串。
- 模型结构调整:
- 若预测的数值长度固定:可设置多分类头,每个字符位置对应一个分类器,分类类别包含0-9和小数点共11类,总损失为各位置分类损失的和。
- 若预测的数值长度不固定:可采用OCR领域常用的CRNN+CTC损失结构,无需提前固定字符长度,可直接输出任意长度的数字、小数点组合,转换后即可得到目标数值。
- 输出层与损失调整:删除原最后一层units=10的softmax层和分类损失,替换为对应场景的输出结构与损失函数。
场景2:纯数值回归预测(输入为特征向量,输出连续数值)
如果你的需求是预测连续数值而非图像识别,可直接将任务调整为回归任务,修改后的代码如下:
import tensorflow as tf model = tf.keras.models.Sequential() # 若为纯数值输入可删除Flatten层,替换为对应输入层 model.add(tf.keras.layers.Flatten()) model.add(tf.keras.layers.Dense(units=128, activation=tf.nn.relu)) model.add(tf.keras.layers.Dense(units=128, activation=tf.nn.relu)) # 回归任务输出层:单神经元,无激活函数 model.add(tf.keras.layers.Dense(units=1)) # 编译参数替换为回归适配配置 model.compile(optimizer='adam', loss='mse', metrics=['mae']) # 训练时y_train直接传入对应的连续数值标签即可 model.fit(X_train, y_train, epochs=10)
内容的提问来源于stack exchange,提问作者OK 400
相关产品推荐
相关产品推荐

