什么是卷积神经网络

CNN:神经网络在前面的学习中我们已经了解过很多了,其本质就是多层感知机,卷积神经网络其实也一样,但是我们可以将其看成多层感知机的变种。它成功的原因在于其所采用的局部连接权值共享的方式:

  • 一方面减少了权值的数量使得网络易于优化,算力大大提高
  • 另一方面降低了模型的复杂度,也就是减小了过拟合的风险

该优点在网络的输入是图像时表现的更为明显,使得图像可以直接作为网络的输入,避免了传统识别算法中复杂的特征提取和数据重建的过程,在二维图像的处理过程中有很大的优势。

2.模型构建:

CNN:首先了解卷积神经网络的四个组件:

  • 卷积层(Convolution)
  • 非线性映射(ReLu),即非线性激活函数
model.add(Conv2D(32,(3,3),activation='relu',padding='valid',input_shape=((28,28,1))))
  • 池化层(Pooling)
model.add(MaxPool2D(2))
  • 分类层(FC)
model.add(Flatten())

接下来我主要介绍卷积层和池化层

  • 首先介绍卷积层,卷积层主要有以下三种特性:

    • 参数共享
    • 自动提取特征
    • 平移不变性

卷积操作其实并不算复杂,但是他有很多种卷积方式,我们在进行卷积之后输出的图像也会和我们选择的卷积核有关,能够让维度下降、不变、甚至上升。

  • 接着介绍池化层,池化层一般分为以下两种池化:

    • 一般池化(最常用的池化,池化的过程中,不会将前面操作过的像素再用于池化操作)
    • 重叠池化,和一般池化相反,一般池化的步长为1时,使用过的像素就会重叠,即重复使用
    • 池化层的同样拥有三种特性:
      • 池化无参数
      • 具有降维作用
      • 缩放不变

一般的池化操作我们会使用最大池化,即在选定的部分像素中,我们选择其中最大的一个像素值来作为这一部分的像素的代表,这就使得整体的数据降维,我们生活中常见的马赛克,就是池化操作产生的。

常见的卷积神经网络模型

  1. LetNet-5模型

    Conv-Pool-Conv-Pool-FC-FC-Softmax

模型相对简单,层数也较少

  1. AlexNet模型

    Conv-Pool-Conv-Pool-Conv-Conv-Conv-Pool-FC-FC-Softmax

  2. VGG-16模型

    Conv-Conv-Pool-Conv-Conv-Pool-Conv-Conv-Conv-Pool-Conv-Conv-Conv-Pool-FC-FC-FC-Softmax

  3. GoogleNet模型(Inception V1)


是一种既有深度又有宽度的模型,具有以下功能:

  • 实现跨通道的交互和信息整合
  • 可以把不同特征图组合
  • 全连接可以看作1X1卷积操作
  1. ResNet模型

    该模型使用ReLu函数用于激活,改善了梯度消失的问题,使信息前后向传播更加顺畅
  • 提升了参数利用率
  • 底层的特征也进行了充分的传递,泛化性较好
  • Loss对底层参数有一定的影响,能较容易地进行训练

3.实验过程:

  1. 手写数字集测试
  • 首先我们对比一下,图片在经过卷积或者池化操作之后,跟原图会有什么区别
# TensorFlow 卷积池化
import tensorflow as tf
import matplotlib.pyplot as plt
import numpy as np
(x_train,y_train),(x_test,y_test) = tf.keras.datasets.mnist.load_data()
x_train = x_train.reshape((-1,28,28,1))/255.0
x_test = x_test.reshape((-1,28,28,1))/255.0
filter = tf.constant([[-1,-1,-1],[-1,9,1],[-1,-1,-1]],dtype='float32')
filter = tf.reshape(filter,(3,3,1,1))
img = tf.constant(x_train[0:1]/255.0,dtype='float32')
conv_img = tf.nn.conv2d(img,filter,strides=[1,2,2,1],padding='SAME')
pool_img = tf.nn.max_pool(img,[1,2,2,1],[1,2,2,1],padding="VALID")
# window_size,stride
print(conv_img.shape)
plt.subplot(131)
plt.imshow(tf.squeeze(img))
plt.subplot(132)
plt.imshow(tf.squeeze(conv_img))
plt.subplot(133)
plt.imshow(tf.squeeze(pool_img))
plt.show()


由于我们采用的卷积核的特性,将一些较大的值都滤掉了,反观池化,虽然较大的值都保留了,但是同样损失了很多细节。

  • 接下里,我们构建一个经典LeNet-5的卷积神经网络,进行手写数字的识别
import tensorflow as tf
from tensorflow.keras.layers import *
from tensorflow.keras.models import Sequential
(x_train,y_train),(x_test,y_test) = tf.keras.datasets.mnist.load_data()
#tf.keras.datasets.mnist.load_data()
#tf.keras.datasets.fashion_mnist.load_data()
x_train = x_train.reshape((-1,28,28,1))/255.0
x_test = x_test.reshape((-1,28,28,1))/255.0
y_train = tf.keras.utils.to_categorical(y_train,10)
y_test = tf.keras.utils.to_categorical(y_test,10)
model = Sequential()
model.add(Conv2D(32,(3,3),activation='relu',padding='valid',input_shape=((28,28,1))))
model.add(MaxPool2D(2))
model.add(Conv2D(32,(3,3),activation='relu',padding='same'))
model.add(Flatten()) #FC,将二维图片展平成一维向量
model.add(Dense(128,activation='relu'))
model.add(Dense(10,activation='softmax'))
model.compile(optimizer=tf.keras.optimizers.Adam(),
loss=tf.keras.losses.categorical_crossentropy,metrics=['accuracy'])
model.fit(x_train,y_train,batch_size=128,epochs=20)
print(model.evaluate(x_test,y_test))

从上述代码中,我们可以发现,这个卷积神经网络中,我们使用了两个卷积层、两个最大池化层、两个全连接层

  • 我们得到的精度如下:
  1. Alex-net模型:(主要为8层)
    Conv-pool-Conv-pool-Conv-Conv-Conv-pool-FC-FC-Softmax分类输出
  • 初始框架优化效果:
  • 将卷积核的数目核batch_size扩大一倍后:
  • 感觉精度不高的原因是模型太简单,我们在原模型的基础上增加一层卷积

    效果不错,再也不是乌龟爬式的增长了
  • 再加两层卷积之后再池化
  • 重复上述操作

    精度的提升很小,说明靠这种方法来提升精度已经达到了极限值
  1. VGG16模型:(卷积核3x3;池化核2x2,步长为2,即不重叠池化)

    从上图我们可以看到,该模型由最大池化层分隔,总共分隔成了6块,其中五块为卷积层,一块为全连接层。且每一次的卷积都使得输入和输出的图像大小不变,只有在池化时变为原来的一半,最后由三层全连接层输出
  • 略微增大卷积核个数,得到精度如下:
  • VGG16模型的层数实在是太多了,以至于我觉得该模型应该是属于过拟合的状态,我决定将其简化,原本的VGG16模型有5个模块,删去最后一个,剩下四个模块。

    稍微提升了一些
  1. InceptionNet模型:(更多的支路,更宽的神经网络)
  • 该模型初次的精度如下:

  • 我们知道,卷积核可以提取突破的特征,初步设想,给定较多的卷积核,便能提取更多特征,那么最后的精度应该会高。所以将原来的卷积核个数翻倍,得到的结果如下:

    看来这招在这里并不合适

  • 既然增加卷积核的个数行不通,索性让神经网络变得更深一些

    精度下降了,看来单纯地深化神经网络,也不一定就能达到最好的效果,太复杂的模型很有可能会过拟合,导致精度下降。

  • 删去一层深度之后,效果似乎有所好转

  • 增加一条支路,让其模型变成5条支路,3层深度

  1. ResNet模型
  • 初始精度大概是0.126左右,稍微添加了一层卷积,结果精度直接降低一半
  • 删去两层卷积

总结

总的来说对几个常见的卷积神经网络结构有了一定的了解,无非就是卷积、池化、归一化、全连接的各种组合,在调试优化模型的过程中我也进行了很多尝试,有了一定的收获。调参是门技术活,而我只会没脑子的瞎调

深度卷积神经网络学习(CNN)相关推荐

  1. 深度卷积神经网络(CNN tricks)调参技巧

    (53条消息) 深度卷积神经网络(CNN tricks)调参技巧(一)学习率调节_踏雪飞鸿的博客-CSDN博客https://blog.csdn.net/weixin_38957591/article ...

  2. 深度卷积神经网络(CNN tricks)调参技巧(一)学习率调节

    做卷积神经网路方面的研究,有时会遇到一些苦恼.大抵是: 1.复现别人的网络,得不到相同的表现. 2.自己的网络调参,结果调不上去. 所以有些大佬就总结了一些调参的tricks,在这里学习记录一下,然后 ...

  3. 67页综述深度卷积神经网络架构:从基本组件到结构创新

    点击我爱计算机视觉标星,更快获取CVML新技术 本文为52CV群友王广胜对上个月更新的CNN综述文章A Survey of the Recent Architectures of Deep Convo ...

  4. 深度学习时间序列预测:卷积神经网络(CNN)算法构建单变量时间序列预测模型预测空气质量(PM2.5)+代码实战

    深度学习时间序列预测:卷积神经网络(CNN)算法构建单变量时间序列预测模型预测空气质量(PM2.5)+代码实战 神经网络(neual networks)是人工智能研究领域的一部分,当前最流行的神经网络 ...

  5. 深度学习多变量时间序列预测:卷积神经网络(CNN)算法构建时间序列多变量模型预测交通流量+代码实战

    深度学习多变量时间序列预测:卷积神经网络(CNN)算法构建时间序列多变量模型预测交通流量+代码实战 卷积神经网络,听起来像是计算机科学.生物学和数学的诡异组合,但它们已经成为计算机视觉领域中最具影响力 ...

  6. 【深度学习】越来越卷,教你使用Python实现卷积神经网络(CNN)

    @Author:Runsen https://blog.csdn.net/weixin_44510615/article/details/117409037 卷积神经网络 Yann LeCun 和Yo ...

  7. 深度学习---卷积神经网络(CNN)

    文章目录 1. 什么是深度学习? 2. 深度学习框架 2.1 卷积神经网络(CNN) 2.1.1 引子 :边界检测 2.1.2 CNN的基本概念 2.1.3 CNN的结构组成 2.1.4 卷积神经网络 ...

  8. 机器学习——深度学习之卷积神经网络(CNN)——AlexNet卷积神经网络结构

    目录 一.AlexNet卷积神经网络结构模型 1.数据库ImageNet 2.AlexNet第一层卷积层 二.AlexNet卷积神经网络的改进 1.非线性变化函数的改变--ReLU 2.最大池化(Ma ...

  9. 深度学习21天——卷积神经网络(CNN):实现mnist手写数字识别(第1天)

    目录 一.前期准备 1.1 环境配置 1.2 CPU和GPU 1.2.1 CPU 1.2.2 GPU 1.2.3 CPU和GPU的区别 第一步:设置GPU 1.3 MNIST 手写数字数据集 第二步: ...

最新文章

  1. 2022-2028年中国PE膜产业竞争现状及发展前景分析报告
  2. unity 继承了 获取_Unity游戏开发——设计模式概述
  3. sleep() wait() notify/notifyAll() 的区别
  4. linux sed 选取,linux sed 替换(整行替换,部分替换)、删除delete、新增add、选取...
  5. primefaces_通过OmniFaces缓存组件以编程方式缓存PrimeFaces图表
  6. 前端学习(239):渐进增强和优雅降级
  7. dell服务器T100无法进入系统,DELL服务器开机Alert!Cover was previously removed F1
  8. 【Docker】elasticsearch 监控工具 elasticsearch-HQ Unable to create connection to: http://localhost:9200
  9. 【RBM】代码学习--DeepLearningToolBox
  10. Ubuntu解决包依赖关系
  11. 好看的流程审批html,审批流程(加班)驳回(流程被删除).html
  12. 傅里叶光学导论_激光位移传感器的光学系统设计
  13. 使用前端方式挑战 Chrome 小恐龙游戏高分
  14. html5分镜头脚本范例,(最新整理)分镜头脚本范本
  15. 思考像微信QQ视频通话最小化后悬浮展现实现思路
  16. c语言过磅系统,衡安无人值守地磅称重系统过磅流程
  17. git via xkcd
  18. 秒杀脚本丨Python淘宝或京东等秒杀抢购脚本实现
  19. 北京航班延误_预测航班延误
  20. Win10安装Kali子系统

热门文章

  1. 前端学习案例2-brower路由2
  2. Spread 16.0 for ASP.NET-WEB-Crack
  3. 高德地图海量点加载自定义fonticon,canvas绘制fonticon
  4. 豆瓣电影Top250爬虫
  5. AVProVideo视频插件使用
  6. 基于4G DTU和工业4G路由器的互联网+智慧物流解决方案
  7. Windows10安装深度Linux,可能是最漂亮的国产Linux,windows下安装深度操作系统步骤...
  8. python小说爬虫实训报告_python之新手一看就懂的小说爬虫
  9. 浙江科技学院计算机试卷,浙江科技学院计算机专业统计学原理复习题参考答案.doc...
  10. 深入解读A/B 测试的统计学原理