实践:实现手写数字识别
在了解了CNN的工作原理后,我们来自己设计一个神经网络来,用于识别手写数字。 编程语言我们选择使用Python 3,因为比较简单而且工具比较丰富。深度学习库我们使用Keras与 Tensorflow配套使用,这两个工具都是开源的而且把复杂的数学操作和算法进行了很好的封装,我们只需要调用 封装好的API,就能实现我们自己的神经网络。
step1
因为我们这次需要识别手写的数字,所以我们需要大量打好标签的数字图片用于训练我们的网络。图片我已经事先搞好了。
一共10000张
0~9一共10个分类,每个分类1000张
每张图片的像素是28x28
训练集跟校验集数量比4:1(即800张用于训练,200张用于校验训练结果)
以文件夹名称作为分类名称,训练目录与校验目录里各放一份。
step2
接下来我们开始设计我们的网络,首先是第一层。因为我们训练的图片是28x28的,所以滤波器的大小不超过这个值就行。一般我们 用3x3就行了;滤波器的个数没有强制要求,因为我们图片像素不大,分类也不多,不需要太多的滤波器,所以我们 初始化32个滤波器,滤波器的步长默认为1,此处我们用默认的就行。第一次卷积操作后,激活函数使用ReLu; 激活后使用2x2的MaxPooling来进行池化。此时我们的网络结构如下图:
代码如下:
# 卷积层
model.add(Convolution2D(
32, # 卷积核数
(3, 3), # 核的长宽
input_shape=input_shape # 输入shape(28,28,3),只在输入层设置即可
))
# 激活层
model.add(Activation('relu'))
# 池化
model.add(MaxPooling2D(
pool_size=(2, 2) # 下采样尺寸
))
step3
经过上述操作我们得到了32个13x13的特征集,我们可以继续提取特征,重复上述的操作(卷积+激活+池化),设计的参数跟上一步一样。 此时我们的网络结构如下图:
代码如下:
# 第二层
model.add(Convolution2D(32, (3, 3)))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
step4
现在我们的特征集是5x5的大小,还能继续卷积下去,当然大家也可以只提取到这里然后做全连接,但准确率可能不会太高。注意 一点,每个卷积层的滤波器个数其实可以是不一样的,在这里我们可以把滤波器设置为64,大小跟步长不变。这一层的结构如下:
代码如下:
# 第三层
model.add(Convolution2D(64, (3, 3)))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
step5
此时我们的特征集已经是1x1,所以后面已经不能再卷积下去了,因此大家要注意我们的网络结构不是想设计多少层就能设计出多少层来的。 此时我们要把这64个特征集一维化,然后进行全连接。全连接层我这里只用了两层(数据量不多,图片也不大,没必要搞这么深,而且 深度跟参数加上去了公司电脑不好跑),第一层128深度,使用ReLu激活;第二层是最后一层作为输出层,因为有10个分类,所以深度是10, 使用SoftMax激活。第一层的神经元跟第二层神经元设定0.2的概率断开,防止过拟合。结构图如下:
过拟合:拿识别数字通俗来讲,过拟合现象就是这个网络针对训练集中的数字有不错的效果,但训练集外的数字效果很差。网络训练
出来的参数只适配了训练图片,但没有把通用的特征参数训练出来。
代码如下:
# 准备全连接(Full Connection)
model.add(Flatten()) # 数据一维化
model.add(Dense(128)) # 全连接层
model.add(Activation('relu')) # 激活
model.add(Dropout(0.2)) # 0.2概率断开神经元连接,防止过拟合
model.add(Dense(10)) # 全连接层
model.add(Activation('softmax'))
step6
此时我们已经设计好我们的神经网络模型,最后我们编译我们的模型,然后从step1中按分类放置好的图片中构建图片生成器放到模型中。 图片生成器ImageDataGenerator与模型Model详细的API可以去keras 的网站中查看。此处完整代码写在train.py。
# 编译
model.compile(
loss='categorical_crossentropy', # 损失函数
optimizer='rmsprop', # 优化器
metrics=['accuracy'] # 指标
)
# 构建训练图片生成器
train_data_gan = ImageDataGenerator(
shear_range=0.2, # 剪切强度(逆时针方向的剪切变换角度)
zoom_range=0.2 # 随机缩放的幅度
)
train_generator = train_data_gan.flow_from_directory(
train_data_dir, # 目录
target_size=(img_width, img_height), # 尺寸
batch_size=train_batch_size, # 批次大小
class_mode='categorical'
)
# 构建校验图片生成器
test_data_gen = ImageDataGenerator()
test_generator = test_data_gen.flow_from_directory(
val_data_dir, # 目录
target_size=(img_width, img_height), # 尺寸
batch_size=train_batch_size, # 批次大小
class_mode='categorical'
)
# 训练的val_loss在5轮内没有减少,则停止训练
# early_stopping = EarlyStopping(monitor='val_loss', patience=5, mode='min')
model.fit_generator(
train_generator, # 训练图片生成器
steps_per_epoch=train_sample // train_batch_size, # 每轮处理图片数量
epochs=epochs, # 训练多少轮次
# callbacks=[early_stopping],
validation_data=test_generator, # 检验图片生成器
validation_steps=train_sample // train_batch_size # 验证集的生成器返回次数
)
# 保存训练好的模型
model.save('First_try.h5')
# 使用softmax作为输出层激活函数 loss: 0.1475 - acc: 0.9562 - val_loss: 0.1353 - val_acc: 0.9688
# 使用sigmoid作为输出层激活函数 loss: 0.2735 - acc: 0.9325 - val_loss: 0.2004 - val_acc: 0.9375
step7
训练好的网络我们可以测试一下效果。输出的内容就是每个分类的得分,可以用可视化工具展示一下。完整代码看pre_model.py
# 装载模型
model = load_model('First_try.h5')
# 放进模型中进行识别
preds = predict(model, img28x28)
# 打印结果
print(preds)
# [[1.8969359e-08 3.0194280e-06 1.5034641e-05 6.6368443e-06 1.3437713e-04
# 4.1928544e-07 1.0285174e-06 7.1962982e-05 3.4167066e-01 6.5809685e-01]]
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
基于python实现的CNN卷积神经网络手写数字识别源码(95分以上期末大作业).zip个人98分期末大作业项目,代码完整下载可用。包含全部项目源码、该项目可以直接使用、项目都经过严格调试,下载即用确保可以运行! 因为我们这次需要识别手写的数字,所以我们需要大量打好标签的数字图片用于训练我们的网络。图片我已经事先搞好了。 一共10000张 0~9一共10个分类,每个分类1000张 每张图片的像素是28x28 训练集跟校验集数量比4:1(即800张用于训练,200张用于校验训练结果) 以文件夹名称作为分类名称,训练目录与校验目录里各放一份。 基于python实现的CNN卷积神经网络手写数字识别源码(95分以上期末大作业).zip个人98分期末大作业项目,代码完整下载可用。包含全部项目源码、该项目可以直接使用、项目都经过严格调试,下载即用确保可以运行! 基于python实现的CNN卷积神经网络手写数字识别源码(95分以上期末大作业).zip个人98分期末大作业项目,代码完整下载可用。包含全部项目源码、该项目可以直接使用、项目都经过严格调试,下载即用确保可以运行!
资源推荐
资源详情
资源评论
收起资源包目录
基于python实现的CNN卷积神经网络手写数字识别.zip (41个子文件)
主-master
data.7z 1.81MB
doc
model.png 77KB
xx.png 51KB
1f.png 13KB
x1.png 128KB
fe.png 171KB
c1.jpg 22KB
x.png 13KB
2f.png 30KB
fc2.jpg 18KB
xxxx.png 47KB
xxxxx.png 99KB
tim_l.png 10KB
4f.png 26KB
convolution.png 98KB
act2.jpg 8KB
result.png 20KB
hd.jpg 47KB
relu.png 5KB
xxx.png 93KB
act.jpg 6KB
3f.png 13KB
pooling.jpg 29KB
8.png 72KB
p2.jpg 25KB
num.png 3KB
xxxxxx.png 107KB
p3.jpg 28KB
rgb.png 5KB
con2.gif 64KB
act1.jpg 11KB
tim_s.jpg 6KB
p3.png 178KB
fc.png 46KB
con1.jpg 16KB
First_try.h5 340KB
使用说明.txt 6KB
train_GPU.py 3KB
.gitignore 17B
train.py 3KB
pre_model.py 1KB
共 41 条
- 1
资源评论
程序员张小妍
- 粉丝: 1w+
- 资源: 3027
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功