MNIST训练数字识别-Keras

本文介绍了一种使用卷积神经网络(CNN)进行MNIST手写数字识别的方法。通过构建深度网络,包括卷积层、最大池化层、Dropout层及全连接层,实现对手写数字的有效识别。模型在训练集上进行训练,并在测试集上达到较高的准确率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

端到端的MNIST训练数字识别

# -*- coding:utf-8 -*-
import numpy as np
from keras.datasets import mnist
from keras.models import Sequential
from keras.layers import Dense,Dropout,Flatten
from keras.layers.convolutional import Conv2D,MaxPooling2D

#读入数据
(X_train,y_train),(X_test,y_test) = mnist.load_data()
# print(X_train[0].shape)
# print(y_train[0])

X_train =X_train.reshape(X_train.shape[0],28,28,1).astype('float32')
X_test = X_test.reshape(X_test.shape[0],28,28,1).astype('float32')
X_train/=255
X_test/=255
#输入层需要10个节点,最好把最好的目标数字0-9做成OneHot编码
def tran_y(y):
    y_ohe = np.zeros(10)
    y_ohe[y] = 1
    return y_ohe

#标签用onehot编码重新表示一下
y_train_ohe = np.array([tran_y(y_train[i]) for i in range(len(y_train))])
y_test_ohe = np.array([tran_y(y_test[i]) for i in range(len(y_test))])

#搭建卷积神经网络
model = Sequential()

#添加一层卷积层,构建64个过滤器,每个过滤器覆盖范围是3*3*1.过滤器步长为1,
# padding为0,并用relu进行非线性变换
model.add(Conv2D(filters=64,kernel_size=(3,3),strides=(1,1),
padding = 'same',input_shape=(28,28,1),activation='relu'))

#添加一层最大池化Max Pooling,在2*2格子中取最大值
model.add(MaxPooling2D(pool_size=(2,2)))

#设立Dropout层,将dropout的概率设为0.5,
model.add(Dropout(0.5))
#重复构造,搭建深度网络
model.add(Conv2D(128,kernel_size=(3,3),strides=(1,1),padding='same',activation='relu'))
model.add(MaxPooling2D(pool_size=(2,2)))
model.add(Dropout(0.5))
model.add(Conv2D(256,kernel_size=(3,3),strides=(1,1),padding='same',activation='relu'))
model.add(MaxPooling2D(pool_size=(2,2)))
model.add(Dropout(0.5))

#把当前节点展平
model.add(Flatten())
#构造全连接神经网络层
model.add(Dense(128,activation='relu'))
model.add(Dense(64,activation='relu'))
model.add(Dense(32,activation='relu'))
model.add(Dense(10,activation='softmax'))

#定义损失函数,一般分类问题的损失函数都选择采用交叉熵
model.compile(loss='categorical_crossentropy',optimizer='adagrad',metrics=['accuracy'])
#批量放入样本,进行训练
model.fit(X_train,y_train_ohe,validation_data=(X_test,y_test_ohe),epochs=20,batch_size=128)

#在测试集上评价模型的准确度
scroes = model.evaluate(X_test,y_test_ohe,verbose=0)
print(scroes)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值