手写数字识别----CNN(卷积神经网络)

利用K近邻算法与CNN(卷积神经网络)实现手写数字识别

from sklearn.datasets import load_digits  # sklearn 为我们提供的手写数字数据集
import numpy as np

# 数据预处理
digits = load_digits()
X_data = digits.data.astype(np.float32)
y_data = digits.target.astype(np.float32).reshape(-1, 1)

X_data.shape, y_data.shape

在这里插入图片描述

# 数据的标准化(normalization)是将数据按比例缩放,
# 使之落入一个小的特定区间。这样去除数据的单位限制,
# 将其转化为无量纲的纯数值,便于不同单位或量级的指标能够进行比较和加权。
from sklearn.preprocessing import OneHotEncoder
from sklearn.preprocessing import MinMaxScaler
scaler = MinMaxScaler()
X = scaler.fit_transform(X_data)
X = X.reshape(-1, 8, 8, 1)
y = OneHotEncoder(categories='auto').fit_transform(
    y_data).todense()  # one-hot 编码

X.shape, y.shape

在这里插入图片描述

model = tf.keras.models.Sequential()
#添加第一个卷积层,使用tf.keras.layers.Conv2D()实现
model.add(tf.keras.layers.Conv2D(
    filters=10,              # 卷积层神经元(卷积核)数目
    kernel_size=[3, 3],      # 卷积核大小
    strides=(1, 1),          # 步长
    padding='same',          # padding策略(vaild 或 same)
    activation=tf.nn.relu,   # 激活函数
    input_shape=(8, 8, 1)    # 指出输入的形状 (samples,rows,cols,channels),只指出后三维,第一维度按 batch_size 自动指定
))
#添加池化层,选择最大池化,使用,tf.keras.layers.MaxPool2D()实现
model.add(tf.keras.layers.MaxPool2D(
    pool_size=[3, 3],      # 池窗口大小
    strides=2,             # 步长
    padding='same'
))
#卷积层 + BN归一化层 + 激活层,使用tf.keras.layers.BatchNormalization()实现Batch归一化
model.add(tf.keras.layers.Conv2D(filters=5, kernel_size=[3, 3], strides=(2, 2), padding='same'))
model.add(tf.keras.layers.BatchNormalization())
model.add(tf.keras.layers.Activation('relu'))
#池化层
model.add(tf.keras.layers.MaxPool2D(pool_size=[3, 3], strides=2, padding='same'))
#展开特征图
model.add(tf.keras.layers.Reshape(target_shape=(1*1*5,)))
#全连接层
model.add(tf.keras.layers.Dense(units=50, activation=tf.nn.relu))
#输出层
model.add(tf.keras.layers.Dense(units=10))
model.add(tf.keras.layers.Softmax())
#通过model.summary()输出模型各层的参数状况
model.summary()

在这里插入图片描述

#配置训练过程
model.compile(
    optimizer=tf.keras.optimizers.Adam(learning_rate=0.001),    # 设置优化器,这里使用 Adam 优化器,设置学习率为 0.001
    loss=tf.keras.losses.categorical_crossentropy,              # 设置损失函数,这里使用交叉熵损失
    metrics=[tf.keras.metrics.categorical_accuracy]             # 设置评估指标,用于检查 y_ture 中最大值对应的 index 与 y_pred 中最大值对应的 index 是否相等
)
batch_size = 32  # 设定 batch_size 为 32
epochs = 50  # 迭代 50 个周期
model.fit(X, y, epochs=epochs, batch_size=batch_size)

实验结果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值