手写数字识别-手把手教你搭建CNN卷积神经网络

1.CNN卷积神经网络介绍

卷积神经网络(Convolutional Neural Network,CNN)是一种前馈神经网络(一个输入层,一个或多个隐藏层,一个输出层的神经网络,每个神经元都与前一层全连接),它的人工神经元可以响应一部分覆盖范围内的周围单元,对于大型图像处理有出色表现。 它包括卷积层(convolutional layer)和池化层(pooling layer)。

卷积层:

    数学上的卷积操作:

å¨è¿éæå¥å¾çæè¿°

原图: 上图的绿色矩阵,这个是计算机眼中的图片。图片通过矩阵的方式进行表达。
卷积核: 上图的黄色矩阵,这个是卷积核,核的大小可以自定义,2x2、 3x3、5x5都可以的,卷积核里面的权值的不同,提取的特征图也不同,不同的核得到的不同的特征图。
计算方式:矩阵乘法。
特征图:上图粉色部分,卷积操作最后获得的结果。

     卷积操作的作用:完成传统计算机视觉算法的功能,如滤波、强化、提取轮廓、模糊处理等,其实可以将卷积操作看做一种模板匹配的过程。卷积核就是模板,特征图就是就是这个模板匹配的结果显示。

池化层:

  数学上的池化操作

取最大值,也可以取均值

池化操作的作用:获取粗粒度信息的过程,因此它可以将原始图像变小。这个过程模拟了人类从宏观角度来观察事物,这种模糊化操作将多个方格的原始图像压缩为一个点,从而忽略掉信息的作用。 

2.项目介绍和技术关键点

项目介绍:

æ们建äºä¸ªæ¨¡åï¼æå®äº MNIST æ°å­è¯å«ä»»å¡

任务:将MINST数据集(如上,手写数字图像)识别为数字标签

网络结构:一层输入层,第一层卷积层,第一层池化层,第二层卷积层,第二层池化层,第一层特征层(全连接层),第二层特征层(全连接层),一层输出层。

项目步骤:1.数据集划分:对于这个项目,将数据集划分为三个部分:训练集、测试集、验证集,验证集的目的主要是在训练的过程中进行验证防止过拟合。因为数据量过大,所以需要采用批处理的形式,从而提高效率并且防止过拟合。2.数据处理:采用Pytorch自带的数据处理的包。3.构建网络,自定义ConvNet类,继承自nn.Module类。注意为防止过拟合,需使用dropout()函数。4.运行并测试模型,为了加速可以使用带cuda的gpu来跑,可以显著提高效率。最后绘制出训练损失曲线图:

 

pytorch使用:https://pytorch.org/

项目源代码:https://github.com/JasonLee-CCNU/package

3.小结

整个项目就是模拟人脑识别图像的过程,由具体到抽象再进一步抽象。通过整个项目我们学习到了,cnn的原理:卷积、池化等,用pytorch搭建cnn,防止过拟合的dropout技术,pytorch数据处理包的使用,数据集的划分,图像数据的基本处理,nn模块的使用。这个小型的项目是我们利用深度学习技术从事计算机视觉识别和图像处理工作的基础。

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个基于CNN手写数字识别代码,使用Keras框架和MNIST数据集: ```python import keras from keras.datasets import mnist from keras.models import Sequential from keras.layers import Dense, Dropout, Flatten from keras.layers import Conv2D, MaxPooling2D # 加载数据集 (x_train, y_train), (x_test, y_test) = mnist.load_data() # 预处理数据集 x_train = x_train.reshape(x_train.shape[0], 28, 28, 1) x_test = x_test.reshape(x_test.shape[0], 28, 28, 1) input_shape = (28, 28, 1) x_train = x_train.astype('float32') x_test = x_test.astype('float32') x_train /= 255 x_test /= 255 y_train = keras.utils.to_categorical(y_train, 10) y_test = keras.utils.to_categorical(y_test, 10) # 构建模型 model = Sequential() model.add(Conv2D(32, kernel_size=(3, 3), activation='relu', input_shape=input_shape)) model.add(Conv2D(64, (3, 3), activation='relu')) model.add(MaxPooling2D(pool_size=(2, 2))) model.add(Dropout(0.25)) model.add(Flatten()) model.add(Dense(128, activation='relu')) model.add(Dropout(0.5)) model.add(Dense(10, activation='softmax')) # 编译模型 model.compile(loss=keras.losses.categorical_crossentropy, optimizer=keras.optimizers.Adadelta(), metrics=['accuracy']) # 训练模型 model.fit(x_train, y_train, batch_size=128, epochs=12, verbose=1, validation_data=(x_test, y_test)) # 评估模型 score = model.evaluate(x_test, y_test, verbose=0) print('Test loss:', score[0]) print('Test accuracy:', score[1]) ``` 这个模型包括了两个卷积层、一个池化层和两个全连接层,具有较高的准确率。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值