从0开始的深度学习——搭建一个卷积神经网络

为什么需要卷积神经网络?

当我们要处理的网络的特征值过多时,按照传统方法(搭建全连接层)搭建神经网络将会耗费大量空间:
在这里插入图片描述
像这样的仅仅是搭建一层网络就会耗费 N ∗ M N*M NM个空间。
而当我们要处理一张512*512的三通道照片时,搭建网络所消耗的空间将非常巨大,于此同时所带来的时间消耗也会很大。
于是,为了解决这样一类问题,我们就往神经网络中引入了卷积的概念。
所以,顾名思义,卷积神经网络就是:卷积+神经网络

卷积的作用

一句话简单地说,卷积的作用就是提取精炼原来数据的特征。
在这里插入图片描述

卷积神经网络的一般结构:

  1. C:Convolutin(卷积)
  2. B:BN(批标准化)
  3. A:Activation(激活)
  4. P:Pooling(池化)
  5. D:Dropout(丢弃)
    一般情况下,我们要建立一个卷积神经网络,只需要建立好这5个网络层,最后再连接上一个全连接的输出层即可。
    下面,我将分步介绍这5层网络(基于tensorflow):

卷积层:

介绍卷积层之前,先介绍几个概念:
卷积核:就是卷积的大小,一般为正方形或立方体。
在这里插入图片描述
这个图片中间的就是一个3x3的卷积核
滑动步长:即卷积核一次性移动的长度
全零填充:是否需要在原矩阵旁加一圈0
在tensorflow中有帮我们搭建好建立卷积网络的函数:

tf.keras.layers.Conv2D(
    filter = 卷积核个数
    kernel_size = 卷积核尺寸(若为正方形可以只写边长)
    strides = 滑动步长(默认为1,纵向横向相等可以就写一个,否则为纵向+横向)
    padding = "same" or "valid" 是否使用全0天才(默认为否)
    activation = "relu"or"sigmod"or"tanh"使用的激活函数
    #若存在BN层可不写
)

当然,在正式建立的时候这些参数前面的英文是可以忽略的
举个例子:

model = tf.keras.models.Sequential([
    Conv2D(3,5,padding='vaild',activation='relu')
    #建立一个由三个卷积核构成,卷积核尺寸为5x5,步长为1,不使用全0填充,激活函数为'relu'的卷积层神经网络
    conv2D(filters=6,kernel_size=(5,4),strides=2,padding='same',activation='sigmod')
    #建立一个由6个卷积核构成,卷积核尺寸为5x4,步长为2,使用全0填充,激活函数为'sigmod'的卷积神经网络
])

BN层:

BN层叫做批标准化层
标准化:使数据符合0均值,1为标准差的分布
批标准化:对一小批数据做标准化处理
为什么要进行标准化:神经网络对以0为均值,1为标准差的数据的识别度高,拟合效果好,所以我们都希望喂入神经网络的数据符合这一标准,故运用了标准化这一步骤。
需要注意的是:BN层位于卷积层之后,激活层之前,所以当你要运用BN层时,需要将卷积层和激活层分开写。
用tensorflow描述标准化:

model = tf.keras.models.Sequential([
    Conv2D=(filters=5,kernel_size=(4,4),padding='same')
    BatchNormalization(),#BN层
    Activation('relu')#激活层
    #...
])

激活层

如上:

Activation('激活函数名')

池化层

什么是池化层:池化层用于减少特征数据量:
在这里插入图片描述
用tensorflow描述池化:

#按最大值优化:
tf.keras.layers.Maxpool2D(
    pool_size=池化核尺寸,
    strides=池化步长,
    padding='vaild'or'same'是否使用全0填充,
)
#按平均值池化:
tf.keras.layers.AveragePooling2D(
    pool_size=池化核尺寸,
    strides=池化步长,
    padding='vaild'or'same'是否使用全0填充,
)

舍弃层:

为了防止过拟合,神经网络在训练时,将一部分神经元按照概率从神经网络中暂时舍弃,实现这一层的网络叫做舍弃层。
用tensorflow实现舍弃层:

Droupout(舍弃概率)

搭建一个卷积神经网络:

model = tf.keras.models.Sequential([
    #CBAPD
    Conv2D(filter=6,kernel_size=(5,5),strides=2,padding='same'),#卷积层
    BatchNormalization(),#BN层
    Activation('relu'),#激活层
    MaxPool2D(pool_size=(2,2),strides=1,padding='same'),#池化层
    Dropout(0.2),#舍弃层
])

之后的配置学习方法之类的如正常神经网络一致即可

  • 4
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

go_bananas

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值