本文是《TensorFlow从浅入深》系列之第11篇

TensorFlow从浅入深系列之一 -- 教你如何设置学习率(指数衰减法)

TensorFlow从浅入深系列之二 -- 教你通过思维导图深度理解深层神经网络

TensorFlow从浅入深系列之三 -- 教你如何对MNIST手写识别

TensorFlow从浅入深系列之四 -- 教你深入理解过拟合问题(正则化)

TensorFlow从浅入深系列之五 -- 教你详解滑动平均模型

TensorFlow从浅入深系列之六 -- 教你深入理解经典损失函数(交叉熵、均方误差)

TensorFlow从浅入深系列之七 -- 教你使用验证数据集判断模型效果

TensorFlow从浅入深系列之八 -- 教你学会变量管理

TensorFlow从浅入深系列之九 -- 教你认识图像识别中经典数据集

TensorFlow从浅入深系列之十 -- 教你认识卷积神经网络的基本网路结构及其与全连接神经网络的差异

卷积层

图6-8显示了卷积层神经网络结构中重要的部分:滤波器(filter)或者内核(kernel)。

过滤器可以将当前层神经网络上的一个子节点矩阵转化为下一层神经网络上的一个单位节点矩阵 。 单位节点矩阵指的是一个长和宽都为1,但深度不限的节点矩阵 。

在一个卷积层巾,过滤器所处理的节点矩阵的长和宽都是由人工指定的,这个节点矩阵的尺寸也被称之为过滤器的尺寸。常用的过滤器尺寸有 3 × 3 或 5 × 5
过滤器的尺寸指的是一个过滤器输入节点矩阵的大小(长和宽),而深度指的是输出单位节点矩阵的深度。如图 6-8 所示,左侧小矩阵的尺寸为过滤器的尺寸,而右侧单位矩阵的深度为过滤器的深度。


下边通过一个样例来说明卷积运算及前向传播过程。样例中将展示如何通过过滤器将一个 2 × 2 × 3 的节点矩阵变化为一个
1 × 1× 5 的单位节点矩阵 。

假设使用来表示对于输出单位节点矩阵中的第i个节点,过滤器输入节点(x,y,z)的权重,使用表示第i个输出节点对应的偏置项参数,那么单位矩阵中的第i个节点的取值g(i)为:

其中,为过滤器中节点(x, y, z)的取值,f为激活函数。图6-9展示了再给定a,的情况下,使用ReLU作为激活函数时g(0)的计算过程。

在图6-9的左侧给出了 a 和 的取值,这里通过 3 个二维矩阵来表示一个三维矩阵的取值,其中每一个二维矩阵表示三维矩阵在某一个深度上的取值 。点(·)符号表示点积,也就是矩阵中对应元素乘积的和。图 6-9 的右侧显示了g(0)的计算过程。如果给出 , 那么也可以类似地计算出 g(1)到 g(4)的取值。

6-9 使用过滤器计算g(0)取值的过程示意图

为了更好的可视化过滤器的移动过程,图6-10展示了在 3 × 3 矩阵上使用 2 × 2过滤器卷积层结构前向传播的过程,这里节点深度为1。

在这个过程中,首先将这个过滤器用于左上角子矩阵,然后移动到右上角矩阵,再到左下角矩阵,最后到右下角矩阵。过滤器每移动一次,可以计算得到一个值(当深度为k时会计算出 k个值) 。将这些数值拼接成一个新的矩阵,就完成了卷积层前向传播的过程。图 6-10的右侧显示了过滤器在移动过程中计算得到的结果与新矩阵中节点的对应关系 。

当过滤器的大小不为 1 × 1时,卷积层前向传播得到的矩阵的尺寸要小于当前层矩阵的尺寸 ,一般是n-k+1,n为矩阵的大小,k为过滤器的大小。6-10 所示,当前层矩阵的大小为 3 × 3 (图 6-10 左侧矩阵〉,而通过卷积层前向传播算法之后,得到的矩阵大小为 2 × 2(图 6-10 右侧矩阵)。为了避免尺寸的变化,可以在当前层矩阵的边界上加入全 0 填充( zero-padding)。这样可以使得卷积层前向传播结果矩阵的大小和 当前层矩阵保持一致。 图 6- 11显示 了使用全0填充后卷积层前向传播过程示意图。

除了使用全 0 填充,还可以通过设置过滤器移动的步长来调整结果矩阵的大小。在图 10 和图 6-11 中,过滤器每次都只移动一格。图 6-12 中显示了当移动步长为 2 且使用全 0 填充时,卷积层前向传播的过程。

从图 6-12上可以看出,当长和宽的步长均为 2 时,过滤器每隔 2 步计算一次结果,所以得到的结果矩阵的长和宽也就都只有原来的一半。以下公式给出了在同时使用全 0 填充时结果矩阵的大小 。

其中表示输出层矩阵的长度,它等于输入层矩阵长度除以长度方向上的步长向上取整数表示输出层矩阵的宽度,它等于输入层矩阵宽度除以宽度方向上的步长向上取整值

如果不使用全 0 填充,以下公式给出了结果矩阵的大小 。


在卷积神经网络中,每一个卷积层中使用的过滤器中的参数都是一样(参数共享)的。这是卷积神经网络一个非常重要的性质。从直观上理解,共享过滤器的参数可以使得图像上的内容不受位置的影响,同时也可以减少神经网络上的参数。

卷积层的参数个数和图片的大小无关,它只和过滤器的尺寸、深度以及当前层节点矩阵的深度有关。这使得卷积神经网络可以很好地扩展到更大的图像数据上 。

结合过滤器的使用方法和参数共享的机制,图 6-13 给出了使用了全 0 填充、步长为 2的卷积层前向传播的计算流程 。

6-13 卷积层前向传播过程样例图

图 6-13 给出了过滤器上权重的取值以及偏置项的取值,通过图 6-9 中所示的计算方法,可以得到每一个格子的具体取值 。 以下公式给出了左上角格子取值的计算方法,其他格子可以依次类推。


TensorFlow实现卷积计算前向传播:

#!/usr/bin/env python
# -*- coding:utf-8 -*-import tensorflow as tf# 通过 tf.get_variable 的方式创建过滤器的权重变量和偏置项变量。
# 上面介绍了卷积层的参数个数只和滤波器的尺寸、深度以及当前层节点矩阵的深度有关,所以这里声明的参数变量是一个四维矩阵,
# 前面两个维度代表了过滤器的尺寸,第三个维度表示当前层的深度,第四个维度表示过滤器的深度。
filter_weights = tf.get_variable('weights', [5, 5, 3, 16], initialzer=tf.truncated_normal_initializer(seed=0.1))# 和卷积层的权重类似,当前层矩阵上不同位置的偏置项也是共辜的,所以总共有下个深度个不
# 同的偏E项。本样例代码中 16 为过滤器的深度,也是神经网络中下一层节点矩阵的深度 。
biases = tf.get_variable('biases', [16], initializer=tf.constant_initializer(0.1))# tf.nn.conv2d 提供了一个非常方便的函数来实现卷积层前向传播的算法。这个函数的第一个输入为当前层的节点矩阵。
# 注意这个矩阵是一个四维矩阵,后面三个维度对应一个节点矩阵,第一维对应一个输入batch。
# 比如在输入层,input[O , :, :, :]表示第一张图片, input[l, :, :, :]表示第二张图片,以此类推。
# tf.nn.conv2d 第二个参数提供了卷积层的权重,第三个参数为不同维度上的步长。
# 虽然第三个参数提供的是一个长度为 4 的数组,但是第一维和最后一维的数字要求一定是 l 。
# 这是因为卷积层的步长只对矩阵的长和宽有效。最后一个参数是填充(padding)的方法,
# TensorFlow中提供SAME或是VALID两种选择。其中SAME但表示添加全0填充,“VALID”表示不添加
conv = tf.nn.conv2d(input, filter_weights, strides=[1, 1, 1, 1], padding='SAME')# tf.nn.bias_add提供了一个方便的函数给每一个节点加上偏置项。注意这里不能直接使用加法!!1
# 因为知阵上不同位置上的节点都需要加上同样的偏置项。
bias = tf.nn.bias_add(conv, biases)# 将计算结果通过ReLU激活函数完成去线性化
actived_conv = tf.nn.relu(bias)

如有对tf.nn.conv2d()函数不懂,请参考博文TensorFlow函数之tf.nn.conv2d()(附代码详解)讲解

【TensorFlow】TensorFlow从浅入深系列之十一 -- 教你深入理解卷积神经网络中的卷积层相关推荐

  1. 【TensorFlow】TensorFlow从浅入深系列之十三 -- 教你深入理解模型持久化(模型保存、模型加载)

    本文是<TensorFlow从浅入深>系列之第13篇 TensorFlow从浅入深系列之一 -- 教你如何设置学习率(指数衰减法) TensorFlow从浅入深系列之二 -- 教你通过思维 ...

  2. 【TensorFlow】TensorFlow从浅入深系列之十 -- 教你认识卷积神经网络的基本网路结构及其与全连接神经网络的差异

    本文是<TensorFlow从浅入深>系列之第10篇 TensorFlow从浅入深系列之一 -- 教你如何设置学习率(指数衰减法) TensorFlow从浅入深系列之二 -- 教你通过思维 ...

  3. 【TensorFlow】TensorFlow从浅入深系列之九 -- 教你认识图像识别中经典数据集

    本文是<TensorFlow从浅入深>系列之第9篇 TensorFlow从浅入深系列之一 -- 教你如何设置学习率(指数衰减法) TensorFlow从浅入深系列之二 -- 教你通过思维导 ...

  4. 【TensorFlow】TensorFlow从浅入深系列之二 -- 教你通过思维导图深度理解深层神经网络

    本文是<TensorFlow从浅入深>系列之第2篇 TensorFlow从浅入深系列之一 -- 教你如何设置学习率(指数衰减法) TensorFlow从浅入深系列之二 -- 教你通过思维导 ...

  5. 【TensorFlow】TensorFlow从浅入深系列之十二 -- 教你深入理解卷积神经网络中的池化层

    本文是<TensorFlow从浅入深>系列之第12篇 TensorFlow从浅入深系列之一 -- 教你如何设置学习率(指数衰减法) TensorFlow从浅入深系列之二 -- 教你通过思维 ...

  6. 【TensorFlow】TensorFlow从浅入深系列之八 -- 教你学会变量管理

    本文是<TensorFlow从浅入深>系列之第8篇 TensorFlow从浅入深系列之一 -- 教你如何设置学习率(指数衰减法) TensorFlow从浅入深系列之二 -- 教你通过思维导 ...

  7. 【TensorFlow】TensorFlow从浅入深系列之七 -- 教你使用验证数据集判断模型效果

    本文是<TensorFlow从浅入深>系列之第7篇 TensorFlow从浅入深系列之一 -- 教你如何设置学习率(指数衰减法) TensorFlow从浅入深系列之二 -- 教你通过思维导 ...

  8. 【TensorFlow】TensorFlow从浅入深系列之六 -- 教你深入理解经典损失函数(交叉熵、均方误差)

    本文是<TensorFlow从浅入深>系列之第6篇 TensorFlow从浅入深系列之一 -- 教你如何设置学习率(指数衰减法) TensorFlow从浅入深系列之二 -- 教你通过思维导 ...

  9. 【TensorFlow】TensorFlow从浅入深系列之五 -- 教你详解滑动平均模型

    本文是<TensorFlow从浅入深>系列之第5篇 TensorFlow从浅入深系列之一 -- 教你如何设置学习率(指数衰减法) TensorFlow从浅入深系列之二 -- 教你通过思维导 ...

最新文章

  1. C++知识点41——运算符的重载概念与分数类实现(下)
  2. 根据客户中英文系统进入中英文页面
  3. 跳水比赛背后的隐形教练现身了!百度智能云还完成了历史性的大升级
  4. 廖雪峰Java1-3流程控制-9break、continue
  5. hp-ux锁定用户密码_UX设计101:用户研究-入门需要了解的一切
  6. Linux上Oracle 11g安装步骤图解(超详细图文教程)附带导入数据和新建数据库教程
  7. OpenSSL学习(二十二):基础-指令sess_id
  8. uva 1637 Double Patience
  9. C语言大作业--小型工资管理系统
  10. TikTok(国际版抖音)时间线
  11. Win10下安装python和pycharm
  12. 实验代做 行人识别_实验室代做实验项目
  13. 【转载】在美国找工作秘籍
  14. PeopleSoft 快捷键
  15. TP框架中S函数使用方法
  16. zippo蚀刻计算机键盘,【图片】蚀刻机自己填漆【zippo吧】_百度贴吧
  17. asp生成带参数的二维码并合成推广海报图片,asp合并合成推广海报图片asp代码
  18. 项目性能优化之性能问题分析和压力测试
  19. java实现zip压缩
  20. Linux下查看隐藏文件夹

热门文章

  1. ubuntu16 安装mysql5.7_ubuntu16中安装MySQL5.7.29
  2. java不同进程的相互唤醒_JAVA多线程之线程间的通信方式
  3. python没有tkinter_Python升级提示Tkinter模块找不到的解决方法
  4. pythonrandom函数_python之random函数
  5. python数据分布_Python中的数据分布
  6. html清除div虚线,纯CSS去除按钮以及链接点击时虚线
  7. cacti php zombie,Cacti1.2.x新版教程之监控本机
  8. 添加作者_卤肉,有“添加剂”才香?大错特错,没有这5种香料,什么味道都没有...
  9. leetcode53 python3 96ms 最大子序列和 python解法
  10. 解决PHPstorm菜单栏搜索栏乱码的问题