tf.nn.conv2d()是TensorFlow中用于创建卷积层的函数,这个函数的调用格式如下:

def conv2d(input: Any,filter: Any,strides: Any,padding: Any,use_cudnn_on_gpu: bool = True,data_format: str = "NHWC",dilations: List[int] = [1, 1, 1, 1],name: Any = None) -> Any

其中,比较重要的参数是 input, filter, strides, padding。

input 就是输入的数据,格式就是TensorFlow的标准,使用四维矩阵的形式,分别是Btach_size(可以说是要处理的图片数量),height, width,deepth(或者说是channel也就是通道数,比如RGB,3个通道)。

filter 在TensorFlow中称为滤波器,本质就相当于卷积核权重矩阵,这里要注意filter的形式,也是四维数组的形式 ,分别是
height高度(卷积核的高度),
width宽度(卷积核的宽度),
deepth(channel)深度(这个与input的deepth一致),
Feature Map的数目,也可以说是卷积核的数目,也就是最后生成的特种图的数目。

stride 也就是步长了,按照上面的 “一贯作风”,也是四维数组的形式,分别表示
在batch_size上的步长,
高度的步长,
宽度的步长以
深度的步长,
对应的是input的四个维度,一般对于图片输入来说,只需要改变中间两个值。这个步长一定层度上决定了输出特征图的大小。

padding 是填充,这里只有两个值 SAME 和 VALID,

后面的参数就是加速之类的选项,不是很重要。

stride和padding两个参数应该结合在一起来说。

1、padding取值为’SAME’

由于图片大小和卷积核大小不一定是倍数关系,在SAME模式下,会通过周围补零来保证所有数据都能被扫描到。那到底补多少零,最后输出的特征图的大小为多少,在这个函数里,是由stride来决定的。先看代码:

import tensorflow as tfdata=tf.Variable(tf.random_normal([64,43,43,3]),dtype=tf.float32)
weight=tf.Variable(tf.random_normal([3,3,3,64]),dtype=tf.float32)sess=tf.InteractiveSession()
tf.global_variables_initializer().run()conv1=tf.nn.conv2d(data,weight,strides=[1,1,1,1],padding='SAME')
conv2=tf.nn.conv2d(data,weight,strides=[1,2,2,1],padding='SAME')
conv3=tf.nn.conv2d(data,weight,strides=[1,3,3,1],padding='SAME')
conv4=tf.nn.conv2d(data,weight,strides=[1,4,4,1],padding='SAME')print(conv1)
print(conv2)
print(conv3)
print(conv4)

输出为
Tensor(“Conv2D_8:0”, shape=(64, 43, 43, 64), dtype=float32)
Tensor(“Conv2D_9:0”, shape=(64, 22, 22, 64), dtype=float32)
Tensor(“Conv2D_10:0”, shape=(64, 15, 15, 64), dtype=float32)
Tensor(“Conv2D_11:0”, shape=(64, 11, 11, 64), dtype=float32)

可以看出输出的尺寸大小与stride的第二第三个参数是倍数关系
当strides=[1,1,1,1]时,输出尺寸与原始尺寸相同
当strides=[1,2,2,1]时,43不是2的倍数,先把43增加到44,再除2,得22
当strides=[1,3,3,1]时,43不是3的倍数,先把43增加到45,再除3,得15
当strides=[1,4,4,1]时,43不是4的倍数,先把43增加到44,再除4,得11
依次类推

我们再来看看,输出的特征图尺寸与卷积核的大小有没有关系:

import tensorflow as tfdata=tf.Variable(tf.random_normal([64,43,43,3]),dtype=tf.float32)
weight=tf.Variable(tf.random_normal([5,5,3,64]),dtype=tf.float32)sess=tf.InteractiveSession()
tf.global_variables_initializer().run()conv1=tf.nn.conv2d(data,weight,strides=[1,1,1,1],padding='SAME')
conv2=tf.nn.conv2d(data,weight,strides=[1,2,2,1],padding='SAME')
conv3=tf.nn.conv2d(data,weight,strides=[1,3,3,1],padding='SAME')
conv4=tf.nn.conv2d(data,weight,strides=[1,4,4,1],padding='SAME')print(conv1)
print(conv2)
print(conv3)
print(conv4)

输出为
Tensor(“Conv2D_16:0”, shape=(64, 43, 43, 64), dtype=float32)
Tensor(“Conv2D_17:0”, shape=(64, 22, 22, 64), dtype=float32)
Tensor(“Conv2D_18:0”, shape=(64, 15, 15, 64), dtype=float32)
Tensor(“Conv2D_19:0”, shape=(64, 11, 11, 64), dtype=float32)

通过上面可以知道,在SAME模式下,输出的尺寸与卷积核的尺寸没有关系,只与strides有关系

2、padding取值为VALID

在VALID模式下,不会补零,扫描不到的数据会被直接抛弃。

import tensorflow as tfdata=tf.Variable(tf.random_normal([64,43,43,3]),dtype=tf.float32)
weight=tf.Variable(tf.random_normal([5,5,3,64]),dtype=tf.float32)sess=tf.InteractiveSession()
tf.global_variables_initializer().run()
conv1=tf.nn.conv2d(data,weight,strides=[1,1,1,1],padding='VALID')
conv2=tf.nn.conv2d(data,weight,strides=[1,2,2,1],padding='VALID')
conv3=tf.nn.conv2d(data,weight,strides=[1,3,3,1],padding='VALID')
conv4=tf.nn.conv2d(data,weight,strides=[1,4,4,1],padding='VALID')print(conv1)
print(conv2)
print(conv3)
print(conv4)

输出为:
Tensor(“Conv2D_20:0”, shape=(64, 39, 39, 64), dtype=float32)
Tensor(“Conv2D_21:0”, shape=(64, 20, 20, 64), dtype=float32)
Tensor(“Conv2D_22:0”, shape=(64, 13, 13, 64), dtype=float32)
Tensor(“Conv2D_23:0”, shape=(64, 10, 10, 64), dtype=float32)

import tensorflow as tfdata=tf.Variable(tf.random_normal([64,43,43,3]),dtype=tf.float32)
weight=tf.Variable(tf.random_normal([3,3,3,64]),dtype=tf.float32)sess=tf.InteractiveSession()
tf.global_variables_initializer().run()
conv1=tf.nn.conv2d(data,weight,strides=[1,1,1,1],padding='VALID')
conv2=tf.nn.conv2d(data,weight,strides=[1,2,2,1],padding='VALID')
conv3=tf.nn.conv2d(data,weight,strides=[1,3,3,1],padding='VALID')
conv4=tf.nn.conv2d(data,weight,strides=[1,4,4,1],padding='VALID')print(conv1)
print(conv2)
print(conv3)
print(conv4)

Tensor(“Conv2D_28:0”, shape=(64, 41, 41, 64), dtype=float32)
Tensor(“Conv2D_29:0”, shape=(64, 21, 21, 64), dtype=float32)
Tensor(“Conv2D_30:0”, shape=(64, 14, 14, 64), dtype=float32)
Tensor(“Conv2D_31:0”, shape=(64, 11, 11, 64), dtype=float32)

从上面两组数据对比可以看出,在VALID模式下,输出的尺寸与卷积核的尺寸,步长都相关。计算公式如下:


由于是VALID模式,padding=0

tf.nn.conv2d()函数详解(strides与padding的关系)相关推荐

  1. pytorch之torch.nn.Conv2d()函数详解

    文章目录 一.官方文档介绍 二.torch.nn.Conv2d()函数详解 参数详解 参数dilation--扩张卷积(也叫空洞卷积) 参数groups--分组卷积 三.代码实例 一.官方文档介绍 官 ...

  2. 【PyTorch】nn.Conv2d函数详解

    文章目录 1. 函数语法格式 2. 参数解释 3. 尺寸关系 4. 使用案例 5. nn.functional.conv2d 1. 函数语法格式 CONV2D官方链接 torch.nn.Conv2d( ...

  3. tf.nn.bidirectional_dynamic_rnn()函数详解

    转载自:https://blog.csdn.net/zhylhy520/article/details/86364789 首先我们了解一下函数的参数 bidirectional_dynamic_rnn ...

  4. tf.nn.softmax参数详解以及作用

    tf.nn.softmax参数详解以及作用 参考地址:https://zhuanlan.zhihu.com/p/93054123 tf.nn.softmax(logits,axis=None,name ...

  5. conv2d的输入_pytorch1.0中torch.nn.Conv2d用法详解

    Conv2d的简单使用 torch 包 nn 中 Conv2d 的用法与 tensorflow 中类似,但不完全一样. 在 torch 中,Conv2d 有几个基本的参数,分别是 in_channel ...

  6. nn.Linear()函数详解

    nn.Linear()函数详解 torch.nn.Linear(in_features, out_features, bias=True, device=None, dtype=None)[原文地址] ...

  7. 【pytorch系列】卷积操作原理解析与nn.Conv2d用法详解

    参考: https://pytorch.org/docs/master/generated/torch.nn.Conv2d.html#torch.nn.Conv2d https://zhuanlan. ...

  8. Conv2d函数详解(Pytorch)

    本文是基于Pytorch框架下的API :Conv2d().该函数使用在二维输入,另外还有Conv1d().Conv3d(),其输入分别是一维和三维.下面将介绍Conv2d()的参数. 一.参数介绍 ...

  9. tf.nn.sampled_softmax_loss用法详解

    tensorflow中具体的函数说明如下: tf.nn.sampled_softmax_loss(weights, # Shape (num_classes, dim) - floatXXbiases ...

最新文章

  1. log4net 在asp.net WEB应用程序中的配置
  2. 问题 C: 【例2-3】围圈报数
  3. Redis线上救命丸:01---误操作AOF、RDB恢复数据
  4. 用Eclipse搭建web项目
  5. poj 1236 Network of Schools (强连通分支缩点)
  6. 简单就是不复杂 转
  7. python diango 增删改查_python中关于django对数据库Mysql的增删改查操作详解
  8. linux中启动与终止lnmp的脚本
  9. 一文读懂:云上用户如何灵活应用定制化网络服务
  10. huaweiPush模块使用说明
  11. Android系统裁剪:手把手教你如何进行系统裁剪
  12. 计算机应用中英文缩写ai表示,2014年全国计算机等级一级考试题库
  13. 三口烧瓶规格有哪些_什么是三口烧瓶,应该如何制作 | | 化工资讯网
  14. archmanjaro添加black arch及cn源
  15. int型和char型之间的类型转换
  16. 天干地支的推算(根据公元纪年的年月日推算干支的年月日)
  17. Docker入门实战(三)-Docker容器镜像
  18. 基于MATLAB/Simulink的电力系统稳定器(PSS)和静态无功补偿器(SVC)的两机传动系统暂态稳定性仿真模型,观察PSS和SVC对系统稳定性的影响
  19. 安卓录屏录麦克风ANE screenANE
  20. 光的干涉|几种波的干涉仿真及检验

热门文章

  1. 快速仿写京东、天猫下拉刷新
  2. 团体程序设计天梯赛-练习集——7-10 彩虹瓶 (25分)
  3. c语言停车场的收费管理系统,c语言停车场管理系统
  4. 常用Android第三方库推荐
  5. 2015百度之星复赛(hdu5258 - 5262)
  6. 疫情后推动出行即服务
  7. BTG遭遇51%攻击,幕后黑手竟是他!
  8. 编程语言只是一个工具
  9. 【伊利丹】Hadoop-2.5.0-CDH5.2.0/Hive与Hbase整合实验
  10. 改造宿舍门成为智能门(未完)