AI人工智能(调包侠)速成之路七(mnist手写数字识别3:cnn卷积神经网络实现)

AI人工智能(调包侠)速成之路五(mnist手写数字识别1:如何调用模型)
AI人工智能(调包侠)速成之路六(mnist手写数字识别2:全连接层实现)

相关代码,模型,测试图片一起打包
下载地址:https://download.csdn.net/download/askmeaskyou/12876950

        前面文章介绍了如何使用训练好的神经网络模型,并借助mnist这个案例学习如何用全连接层设计和训练神经网络。但是全连接层随着输入维度的增加,节点也要相应增加,对应的连接数更是指数级增加,如果我们输入的不是一个28*28像素的单通道黑白图片,而是一个张现在智能手机拍的照片(千万级像素),那用全连接层去堆叠做分类任务基本就是不可能完成的任务了。

1,基础概念:卷积层介绍

        我们使用一个小窗口从上到下、从左到右的滑动窗口扫描整个输入的"大图",然后把每次扫描到的内容做一个卷积变换(重叠对应的元素相乘再累加)记录下来。选取的小窗口就叫卷积核,变换后记录下来的信息是对输入信息的一种抽象转换叫“feature map”,我们可以理解为一个新的“图片”,新的“图片”和输入图片有一样的特征信息,只是改变了记录形式。

 这样不论输入的图片有多大,我们总是用一个小窗口(通常是3*3或者1*1,实践证明窗口越小分类效果好,参数还少)去扫描大图。如上动图显示,这个小窗口与大图的连接每次只有9个,而且在扫描的过程中9个连接的参数是共享的,通过这样的”翻译“,神经网络层与层之间需要训练的连接参数数量级的减少了。“翻译”出来的信息“feature map”还可以多次”翻译“,逐层抽象,最后得到一个输入图片的“特征值”,再用得到的“特征值”来做分类任务。

2基础概念:池化层介绍

        类似于卷积层,我们用一个小窗口从上到下、从左到右的滑动窗口扫描整个输入的"大图",然后把每次扫描到的内容做一个下采样变换(取最大值或者取平均值或者取随机值)记录下来。选取的小窗口就叫池化核,变换后记录下来的信息是对输入信息的一种抽象转换也是“feature map”。池化层通常都是配合在卷积层之后使用,作用和ReLU函数相似。

卷积层的tensorflow2代码实现如下:
    layers.Conv2D(filters=32, kernel_size=(3,3), padding='same',input_shape=(28,28,1),  activation='relu')
filters=32参数的意思是使用32个小窗口同时做扫描,kernel_size=(3,3)参数的意思是小窗口的大小是3*3个格子,padding='same'参数的意思是通过在输入图片的外围补充元素的方式,使得转换后的图片尺寸跟输入图片的尺寸一样大,
input_shape=(28,28,1),参数的意思是输入图片维度格式, activation='relu'参数是使用的激活函数。

池化层的tensorflow2代码实现如下:
    layers.MaxPooling2D(pool_size=(2, 2))
pool_size=(2, 2)参数就是池化核窗口的大小是2*2个格子。

通过上面的参数我们可以任意的控制转换后"feature map"的维度格式,比如输入图片sharp是[28,28,1]的变量我们可以理解为28行28列1个通道的黑白图片,经过转换可以变成sharp是[1,1,64]的变量。表示的还是同一张图片,但是表示的维度方式已经(通过卷积层和池化层)改变了。通常将转换后的"feature map"作为特征值再通过tf.keras.layers.Flatten()打平连接到全连接层上做为最后的输出。

 

3,cnn卷积神经网络实现
有了上面的基础概念现在我们可以写出cnn卷积神经网络的实现代码了。

model = Sequential([
    layers.Conv2D(filters=32, kernel_size=(3,3), padding='same',input_shape=(28,28,1),  activation='relu'),
    layers.MaxPooling2D(pool_size=(2, 2)),
    
    layers.Conv2D(filters=64, kernel_size=(3,3), activation='relu'),
    layers.MaxPooling2D(pool_size=(2, 2)),
    
    layers.Conv2D(filters=64, kernel_size=(3,3), activation='relu'),    
    tf.keras.layers.Flatten(),
    
    layers.Dense(64, activation='relu'),
    layers.Dense(10,activation='softmax')
])

model.summary()可以将设计好的网络结构打印出来。

到这里神经网络模型也准备好了,下面就是不断循环的抽取训练数据进行前向传播获得反馈结果,然后用反馈的结果和标签数据比较,使用优化器不断更新节点参数,让神经网络反馈的结果和标签数据的结果越来越接近(误差越来越小)。在训练的过程中用测试数据统计成功率,成功率超过预期后就可以停止训练了。

#训练配置
model.compile(loss='sparse_categorical_crossentropy',optimizer='adam', metrics=['accuracy']) 
#开始训练
model.fit(x_train,y_train, epochs=2, validation_data=db_test, callbacks=[save_model_cb])

训练代码也有现成的接口可以直接调用。参数内容在前面的文章中已经做过介绍,涉及到一些tensorflow2知识点,如果有疑问还是要系统补充下相关知识。Tensorflow2.0的使用方法参照Tensroflow官方教程

此文相关代码,模型,测试图片一起打包
下载地址:https://download.csdn.net/download/askmeaskyou/12876950

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值