网站首页 > 技术文章 正文
本文链接地址: 「链接」
卷积神经网络(CNN)是指在所有网络中,至少优一层使用了卷积运算运算的神经网络,因此命名为卷积神经网络。
那么什么是卷积呢?如果需要卷积一个二位图片,首先定义一个卷积核(kernel),即权重矩阵,它能表面每一次卷积那个方向的值更重要,然后逐步在二维输入数据上“扫描卷积”。当卷积核“滑动”的同时进行卷积:计算权重矩阵和扫描所得的数据矩阵的乘积,求和后得到一个像素输出。
步长(Stride)为每次卷积核移动格数,填充(Padding)为是否对元素数据进行边缘填充。当不填充的时候,即Tensorflow中的VALID选项,卷积后的数据会比输入数据小,而加入合适的填充后,即Tensorflow中的SAME选项,卷积后的数据可以保持和输入数据大小一致。如下图所示:
那么什么是池化呢?池化也称为欠采样或下采样。主要用于特征降维,在保持旋转、平移、伸缩等不变性的前提下,压缩数据和参数的数量,减小过拟合,同时提高模型的容错性。常用的有按均值池化(mean-pooling):更大地保留图像背景信息,按最大值池化(max-pooling):更多的保留纹理信息。如下图所示,池化大大压缩了数据:
原理
以下面的测试程序来讨论Conv2D(卷积)和MaxPool2D(池化)的具体实现原理:
首先定义一个具有1张图,大小为6X6,通道为1个,即输入数据img的shape为[1,6,6,1]。
然后定义过滤器filter,NHWC格式,即批次,高,宽,通道格式,和输入数据是同一个格式。
测试程序
如下程序和图片示例,一个 3X3 的filter(卷积核的特征是提取图片从左上到右下的特征)在 6X6 的图片上,按照步长 1X1 从左往右,从上往下计算蒙版区域输出结果。
卷积计算:
图例1的卷积计算为:1*1 + 0*-1 + 0*-1 + 0*-1 + 1*1 + 0*-1 + 0*-1 + 0*-1 + 1*1 = 3
图例2的卷积计算为:1*1 + 0*-1 + 0*-1 + 0*-1 + 1*1 + 1*-1 + 0*-1 + 0*-1 + 0*1 = 1
池化计算:
图例3,4,5,6分别取区域内的最大值做池化运算(提取图片的纹理特征而不是背景)。
由此,从原来的 6X6 矩阵变成了 2X2 矩阵。
fitler1是一个filter的情况,输出:
|
filter3是2个filter的情况,输出:
|
下面为整个程序代码:
|
程序输出为:
tf.Tensor(
[[[[1.]
[0.]
[0.]
[0.]
[0.]
[1.]]
[[0.]
[1.]
[0.]
[0.]
[1.]
[0.]]
[[0.]
[0.]
[1.]
[1.]
[0.]
[0.]]
[[1.]
[0.]
[0.]
[0.]
[1.]
[0.]]
[[0.]
[1.]
[0.]
[0.]
[1.]
[0.]]
[[0.]
[0.]
[1.]
[0.]
[1.]
[0.]]]], shape=(1, 6, 6, 1), dtype=float32)
tf.Tensor(
[[[[ 1.]]
[[-1.]]
[[-1.]]]
[[[-1.]]
[[ 1.]]
[[-1.]]]
[[[-1.]]
[[-1.]]
[[ 1.]]]], shape=(3, 3, 1, 1), dtype=float32)
tf.Tensor(
[[[[-1.]]
[[ 1.]]
[[-1.]]]
[[[-1.]]
[[ 1.]]
[[-1.]]]
[[[-1.]]
[[ 1.]]
[[-1.]]]], shape=(3, 3, 1, 1), dtype=float32)
******************** op1 ********************
tf.Tensor(
[[[[ 3.]
[-1.]
[-3.]
[-1.]]
[[-3.]
[ 1.]
[ 0.]
[-3.]]
[[-3.]
[-3.]
[ 0.]
[ 1.]]
[[ 3.]
[-2.]
[-2.]
[-1.]]]], shape=(1, 4, 4, 1), dtype=float32)
******************** op2 ********************
tf.Tensor(
[[[[3.]
[0.]]
[[3.]
[1.]]]], shape=(1, 2, 2, 1), dtype=float32)
******************** op3 ********************
tf.Tensor(
[[[[ 3. -1.]
[-1. -1.]
[-3. -1.]
[-1. -1.]]
[[-3. -1.]
[ 1. -1.]
[ 0. -2.]
[-3. 1.]]
[[-3. -1.]
[-3. -1.]
[ 0. -2.]
[ 1. 1.]]
[[ 3. -1.]
[-2. 0.]
[-2. -4.]
[-1. 3.]]]], shape=(1, 4, 4, 2), dtype=float32)
******************** op4 ********************
tf.Tensor(
[[[[ 3. -1.]
[ 0. 1.]]
[[ 3. 0.]
[ 1. 3.]]]], shape=(1, 2, 2, 2), dtype=float32)
猜你喜欢
- 2024-10-28 使用卷积神经网络构建图像分类模型检测肺炎
- 2024-10-28 机器不学习:卷积神经网络CNN与Keras实战
- 2024-10-28 我是如何用5个概念理解的卷积神经网络?(Hadoop大数据)
- 2024-10-28 深度学习笔记:图像识别和卷积网络
- 2024-10-28 PyTorch中傅立叶卷积:计算大核卷积的数学原理和代码实现
- 2024-10-28 一文看完卷积神经网络及实现机制 卷积神经网络的原理与实现
- 2024-10-28 卷积神经网络原理及其C++/Opencv实现(6)—前向传播代码实现
- 2024-10-28 「周末AI课堂」卷积之上的新操作|机器学习你会遇到的“坑”
- 2024-10-28 谈谈CNN中的位置和尺度问题 cnn例题
- 2024-10-28 使用Keras进行深度学习:(一)Keras 入门
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- oraclesql优化 (66)
- 类的加载机制 (75)
- feignclient (62)
- 一致性hash算法 (71)
- dockfile (66)
- 锁机制 (57)
- javaresponse (60)
- 查看hive版本 (59)
- phpworkerman (57)
- spark算子 (58)
- vue双向绑定的原理 (68)
- springbootget请求 (58)
- docker网络三种模式 (67)
- spring控制反转 (71)
- data:image/jpeg (69)
- base64 (69)
- java分页 (64)
- kibanadocker (60)
- qabstracttablemodel (62)
- java生成pdf文件 (69)
- deletelater (62)
- com.aspose.words (58)
- android.mk (62)
- qopengl (73)
- epoch_millis (61)
本文暂时没有评论,来添加一个吧(●'◡'●)