CNN(卷积神经网络)原理讲解及简单代码

一、原理讲解

1. 卷积神经网络的应用

  • 分类(分类预测)
  • 检索(检索出该物体的类别)
  • 检测(检测出图像中的物体,并标注)
  • 分割(将图像分割出来)
  • 人脸识别
  • 图像生成(生成不同状态的图像)
  • 自动驾驶
  • 等等。。。

 

2. 传统神经网络与卷积神经网络比较

传统神经网络采用的是全连接神经网络,权重矩阵的参数太多,导致速度减慢,也会产生过拟合。

卷积神经网络通过卷积核,大大降低了参数个数。实现局部关联,参数共享的效果。

 

3. 卷积神经网络基本结构

  • 卷积层
  • 激活层(ReLu)
  • 池化层
  • 全连接层

 

3.1 卷积层(Convolutional Layer)

卷积是对两个实变函数的一种数学操作,也就是求内积。

在图像处理中,图像是以二维矩阵的形式输入到神经网络的,因此我们需要二维卷积。

 

图3-1

 

图3-2

 

 

 

 

图3-3

 

图3-1、图3-2、图3-3很好地展示了卷积过程,名称注释如下:

input:输入层,即图像的矩阵向量

kernel:卷积核或称滤波器,可以定义卷积核的大小,图3-1中卷积核的大小为2*2

output:输出,即特征图feature map,通过卷积计算出来的结果。计算公式为input(图3-1中为4*3)•kernel(图3-1中为2*2),两个向量求内积。

stride:步长,即卷积核向右滑动的长度。图3-1中步长为1。

padding:填充,当卷积时,卷积核滑动到最右侧发现无法形成与自己单元一致的向量时,需要在四周用0填充,确保卷积核能完成计算过程。如图3-4所示。

depth/channel:深度,即当前卷积层中卷积核的个数。如图3-4为2层。

 

图3-4

卷积是从输入图像中提取特征的第一层,Conv层的目标是提取输入数据的特征。 卷积通过使用小方块输入数据学习图像特征来保持像素之间的关系。

 

输出的特征图(feature map)大小:

图3-5

未加padding时:

(N-F)/stride + 1

加padding时:

(N-F+padding*2)/stride + 1

 

例子:

input:32*32

filter:10, 5*5

stride:1

padding:2

输出:?  (32-5+2*2)/1+1=32 ,即 32*32*10

参数:?  (5*5+1)*10

 

代码实现:

1 # 定义卷积核,10个卷积核,卷积核大小是5,用Relu激活
2 conv0 = tf.layers.conv2d(datas, 10, 5, activation=tf.nn.relu)

3.2 池化层(Pooling Layer)

特征:

保留了主要特征的同事减少参数和计算量,防止过拟合,提高模型泛化能力。

它一般处在卷积层和卷积层之间,全连接层和全连接层之间。

类型划分:

max pooling:最大化池化,如图3-6和图3-7所示

average pooling:平均池化,如图3-7所示

图3-6

 

图3-7

 

 

3.3 全连接层(Fully Connected Layer)

  • 两层之间所有神经元都有权重连接
  • 通常全连接才呢过在卷积神经网络尾部
  • 全连接层参数量通常最大

 

二、代码实战

 1 # 定义卷积层, 20个卷积核,卷积核大小为5, 用Relu激活
 2 conv0 = tf.layers.conv2d(datas, 20, 5, activation=tf.nn.relu)
 3 # 定义max-pooling层,pooling窗口为2*2,步长为2*2
 4 pool0 = tf.layers.max_pooling2d(conv0, [2, 2], [2, 2])
 5 
 6 # 定义卷积层,40个卷积核,卷积核大小为4, 用Relu激活
 7 conv1 = tf.layers.conv2d(pool0, 40, 4, activation=tf.nn.relu)
 8 # 定义max-pooling层,pooling窗口为2*2,步长为2*2
 9 pool1 = rf.layers.max_pooling2d(conv1, [2, 2], [2, 2])
10 
11 # 将3维特征装换为1维向量
12 flatten = tf.layers.flatten(pool1)
13 
14 # 全连接层,转换为长度为400的特征向量
15 fc = tf.layers.dense(flatten, 400, activation=tf.nn.relu)
16 
17 # 加上DropOut,防止过拟合
18 dropput_fc = tf.layers.dropout(fc, dropout_placeholdr)
19 
20 # 未激活的输出层
21 # num_classes:分类数
22 logits = tf.layers.dense(dropout_fc, num_classes)
23 
24 predicted_labels = tf.arg_max(ligits, 1)

 

转载于:https://www.cnblogs.com/cymx66688/p/10858750.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值