在深度学习的图像识别领域中,我们经常使用卷积神经网络CNN来对图像进行特征提取,当我们使用TensorFlow搭建自己的CNN时,一般会使用TensorFlow中的卷积函数和池化函数来对图像进行卷积和池化操作,而这两种函数中都存在参数padding,该参数的设置很容易引起错误,所以在此总结下。

1.为什么要使用padding

为了减少卷积操作导致的,边缘信息丢失,我们需要进行填充(Padding),即在原图周围,添加一圈值为“0”的像素点(zero padding),这样的话,输出维度就和输入维度一致了。

类别 动图
no padding, s=1, f=3 no padding, s=2, f=3
with padding, s=1, f=3 with padding, s=2, f=3

在弄懂padding规则前得先了解拥有padding参数的函数,在TensorFlow中,主要使用tf.nn.conv2d()进行(二维数据)卷积操作,tf.nn.max_pool()、tf.nn.avg_pool来分别实现最大池化和平均池化,通过查阅官方文档我们知道其需要的参数如下:

tf.nn.conv2d(input, filter, strides, padding, use_cudnn_on_gpu=None,name=None)
tf.nn.max_pool_with_argmax(input, ksize, strides, padding, Targmax=None, name=None)
tf.nn.max_pool(value, ksize, strides, padding, name=None)

这三个函数中都含有padding参数,我们在使用它们的时候需要传入所需的值,padding的值为字符串,可选值为’SAME’ 和 ‘VALID’ ;

padding参数的作用是决定在进行卷积或池化操作时,是否对输入的图像矩阵边缘补0,‘SAME’ 为补零,‘VALID’ 则不补,其原因是因为在这些操作过程中过滤器可能不能将某个方向上的数据刚好处理完,如下所示:

当步长为5,卷积核尺寸为6×6时,当padding为VALID时,则可能造成数据丢失(如图2),当padding为SAME时,则对其进行补零(如图1)
图1 图2

2. padding公式

首先,定义变量:
输入图片的宽和高:i_w 和 i_h
输出特征图的宽和高:o_w 和 o_h
过滤器的宽和高:f_w 和 f_h
宽和高方向的步长:s_w 和 s_h
宽和高方向总的补零个数:pad_w 和 pad_h
顶部和底部的补零个数:pad_top 和 pad_bottom
左部和右部的补零个数:pad_left 和 pad_right

1.VALID模式
输出的宽和高为

o_w = (i_w - f_w + 1)/ s_w #(结果向上取整)
o_h = (i_h - f_h + 1)/ s_h  #(结果向上取整)
  1. SAME模式
    输出的宽和高为
o_w = i_w / s_w#(结果向上取整)
o_h = i_h / s_h#(结果向上取整)

各个方向的补零个数为:max()为取较大值,

pad_h = max(( o_h -1 ) × s_h + f_h - i_h , 0)pad_top = pad_h / 2  # 注意此处向下取整pad_bottom = pad_h - pad_toppad_w = max(( o_w -1 ) × s_w + f_w - i_w , 0)pad_left = pad_w / 2 # 注意此处向下取整pad_right = pad_w - pad_left

3.卷积padding的实战分析

接下来我们通过在TensorFlow中使用卷积和池化函数来分析padding参数在实际中的应用,代码如下:

# -*- coding: utf-8 -*-
import tensorflow as tf# 首先,模拟输入一个图像矩阵,大小为5*5
# 输入图像矩阵的shape为[批次大小,图像的高度,图像的宽度,图像的通道数]
input = tf.Variable(tf.constant(1.0, shape=[1, 5, 5, 1]))# 定义卷积核,大小为2*2,输入和输出都是单通道
# 卷积核的shape为[卷积核的高度,卷积核的宽度,图像通道数,卷积核的个数]
filter1 = tf.Variable(tf.constant([-1.0, 0, 0, -1], shape=[2, 2, 1, 1]))# 卷积操作 strides为[批次大小,高度方向的移动步长,宽度方向的移动步长,通道数]
# SAME
op1_conv_same = tf.nn.conv2d(input, filter1, strides=[1,2,2,1],padding='SAME')
# VALIDA
op2_conv_valid = tf.nn.conv2d(input, filter1, strides=[1,2,2,1],padding='VALID')init = tf.global_variables_initializer()
with tf.Session() as sess:sess.run(init)print("op1_conv_same:\n", sess.run(op1_conv_same))print("op2_conv_valid:\n", sess.run(op2_conv_valid))

VALID模式的分析:

SAME模式分析:

o_w = i_w  / s_w = 5/2 = 3
o_h = i_h / s_h = 5/2 = 3pad_w = max ( (o_w - 1 ) × s_w + f_w -  i_w , 0 )=  max ( (3 - 1 ) × 2 + 2 - 5 , 0 )  = 1
pad_left = 1 / 2 =0
pad_right = 1 - 0 =0
# 同理
pad_top = 0
pad_bottom = 1


运行代码后的结果如下:

4.池化padding的实战分析

这里主要分析最大池化和平均池化两个函数,函数中padding参数设置和矩阵形状计算都与卷积一样,但需要注意的是:

  1. 当padding=‘SAME’,计算avg_pool时,每次的计算是除以图像被filter框出的非零元素的个数,而不是filter元素的个数,如下图,第一行第三列我们计算出的结果是除以2而非4,第三行第三列计算出的结果是除以1而非4;
  2. 当计算全局池化时,即与图像矩阵形状相同的过滤器进行一次池化,此情况下无padding,即在边缘没有补0,我们直接除以整个矩阵的元素个数,而不是除以非零元素个数(注意与第一点进行区分)

池化函数的代码示例如下:

# -*- coding: utf-8 -*-
import tensorflow as tf# 首先,模拟输入一个特征图,大小为5*5
# 输入图像矩阵的shape为[批次大小,图像的高度,图像的宽度,图像的通道数]
input = tf.Variable(tf.constant(1.0, shape=[1, 5, 5, 1]))# 最大池化操作 strides为[批次大小,高度方向的移动步长,宽度方向的移动步长,通道数]
# ksize为[1, 池化窗口的高,池化窗口的宽度,1]
# SAME
op1_max_pooling_same = tf.nn.max_pool(input, [1,2,2,1], strides=[1,2,2,1],padding='SAME')
# VALID
op2_max_pooling_valid = tf.nn.max_pool(input, [1,2,2,1], strides=[1,2,2,1],padding='VALID')# 平均池化
op3_avg_pooling_same = tf.nn.avg_pool(input, [1,2,2,1], strides=[1,2,2,1],padding='SAME')
# 全局池化,filter是一个与输入矩阵一样大的过滤器
op4_global_pooling_same = tf.nn.avg_pool(input, [1,5,5,1], strides=[1,5,5,1],padding='SAME')init = tf.global_variables_initializer()
with tf.Session() as sess:sess.run(init)print("op1_max_pooling_same:\n", sess.run(op1_max_pooling_same))print("op2_max_pooling_valid:\n", sess.run(op2_max_pooling_valid))print("op3_max_pooling_same:\n", sess.run(op3_avg_pooling_same))print("op4_global_pooling_same:\n", sess.run(op4_global_pooling_same))

运行结果如下:

5.总结

在搭建CNN时,我们输入的图像矩阵在网络中需要经过多层卷积和池化操作,在这个过程中,feature map的形状会不断变化,如果不清楚padding参数引起的这些变化,程序在运行过程中会发生错误,当然在实际写代码时,可以将每一层feature map的形状打印出来,了解每一层Tensor的变化。

参考:
https://www.cnblogs.com/White-xzx/p/9497029.html
https://zhuanlan.zhihu.com/p/36278093

深度学习-Tensorflow1.x-CNN中的padding参数相关推荐

  1. 一文简单弄懂tensorflow_【TensorFlow】一文弄懂CNN中的padding参数

    在深度学习的图像识别领域中,我们经常使用卷积神经网络CNN来对图像进行特征提取,当我们使用TensorFlow搭建自己的CNN时,一般会使用TensorFlow中的卷积函数和池化函数来对图像进行卷积和 ...

  2. 【深度学习】(8) CNN中的通道注意力机制(SEnet、ECAnet),附Tensorflow完整代码

    各位同学好,今天和大家分享一下attention注意力机制在CNN卷积神经网络中的应用,重点介绍三种注意力机制,及其代码复现. 在我之前的神经网络专栏的文章中也使用到过注意力机制,比如在MobileN ...

  3. 深度学习在情感分析中的应用

    然语言情感分析简介 情感分析无处不在,它是一种基于自然语言处理的分类技术.其主要解决的问题是给定一段话,判断这段话是正面的还是负面的.例如在亚马逊网站或者推特网站中,人们会发表评论,谈论某个商品.事件 ...

  4. 深度学习在目标视觉检测中的应用进展与展望

    作者:张慧,王坤峰,王飞跃 来源:王飞跃科学网博客 摘要:目标视觉检测是计算机视觉领域的一个重要问题,在视频监控.自主驾驶.人机交互等方面具有重要的研究意义和应用价值.近年来,深度学习在图像分类研究中 ...

  5. 深度学习在智能助理中的应用

    一.什么是智能助理 随着智能手机和移动互联网的普及,越来越多原来发生在线下的交互场景,逐渐从线下转移到线上.人们也开始习惯通过在线沟通的方式来获取各种服务:让秘书安排出差的机票和酒店,向英语老师咨询学 ...

  6. 深度学习在轨迹数据挖掘中的应用研究综述

    深度学习在轨迹数据挖掘中的应用研究综述 人工智能技术与咨询 来源:< 计算机科学与应用> ,作者李旭娟等 关键词: 深度学习:数据挖掘:轨迹挖掘:长短时记忆:序列到序列 摘要: 在过去十年 ...

  7. 深度学习在医学影像中的研究进展及发展趋势

    点击上方蓝字关注我们 深度学习在医学影像中的研究进展及发展趋势 王丽会1,2, 秦永彬1,2 1 贵州省智能医学影像分析与精准诊断重点实验室,贵州 贵阳 550025 2 贵州大学计算机科学与技术学院 ...

  8. 【2017年第2期】深度学习在化学信息学中的应用(下)

    徐优俊, 裴剑锋 北京大学前沿交叉学科研究院定量生物学中心,北京 100871 摘要:深度学习在计算机视觉.语音识别和自然语言处理三大领域中取得了巨大的成功,带动了人工智能的快速发展.将深度学习的关键 ...

  9. 深度学习在物理层信号处理中的应用研究

    摘要:本文主要介绍基于深度学习的物理层应用,并提出一种基于深度Q网络(DQN)的MIMO系统位置信息验证方案,接收者在多变未知的信道环境下利用深度Q网络不断更新. 01引言 随着移动流量呈现的爆发式增 ...

最新文章

  1. 免费开放!清华、智源、协和联合开发乳腺癌AI诊断工具,可预测分子亚型,准确率高达76%...
  2. Asp.net导出Excel
  3. 题目1176:树查找
  4. Linux 查看命令路径 以及相关信息
  5. 常见的web应用服务器
  6. Mybatis常用总结:参数,返回,执行sql,include等
  7. leetcode面试题 04.03. 特定深度节点链表(bfs)
  8. Android应用发布渠道汇总(更新中)
  9. mysql主从中异步和半同步的区别
  10. Windows自带的远程桌面共享工具mstsc
  11. thinkphp出现FILE: D:\www\zhao01\ThinkPHP\Library\Think\Dispatcher.class.php 解决方案
  12. 每一个互联网公司都要掌握的《计算广告》,它是数据与计算的灵魂
  13. 京东到家开放平台网关系统设计实践
  14. [附源码]java毕业设计归元种子销售管理系统
  15. [Linux]termios
  16. 上古卷轴php代码,上古卷轴5负重代码使用方法及修改方法介绍
  17. 使用S60手机的相机对焦功能
  18. 百思不得姐(第三天)
  19. 2022-23 年电子邮箱哪个好用?邮箱大全测评来了,请及时查看哦
  20. Internet of Things:物联网的应用领域涉及到方方面面,在工业、农业、环境、交通

热门文章

  1. PHP特级课视频教程_第二十七集 Coreseek安装与测试_李强强
  2. 迁移 Docker 到其它磁盘目录
  3. 知乎: 如何评价阿里开源的企业级 Node.js 框架 egg? #18
  4. Serverless 实战 —— 快速搭建 SpringBoot 应用
  5. SpringBoot约定大于配置的特性解读 SpringBoot快速入门
  6. Docker安装FireBird数据库
  7. Redis集群搭建~Redis-x64-3.2.100版本
  8. linux下svn(subversion)服务端添加工程及配置权限
  9. 开发技术--设计模式
  10. 用python代替人脑运算24点游戏