CNN卷积汇总
1,卷积作用:减少参数(卷积核参数共享),卷积过程中不断对上一个输出进行抽象,由局部特征归纳为全局特征(不同卷积层可视化可以观察到这点)
2,卷积核
早期卷积核由人工总结,如图像处理中有:
深度神经网络中,卷积核则由网络训练过程中学习获得。
3, 神经网络中的卷积类型
- Group convolution:分组卷积。对通道channel进行分组后分别卷积。减少参数。
比如输入和输出通道都为64,卷积核大小为3*3,则原始参数量为64*3*3*64=36864,通道分组为8组,每组输入输出都为32,参数量为8*8*3*3*8=4608。为原来的1/8。
- Depthwise convolution:卷积核深度为1,只对相应通道的空间部分卷积
- Pointwise convolution:卷积核大小为1*1,只对通道部分卷积
- Depthwise Separable convolution:上面2者结合即为此。先对每个通道的空间部分卷积,再对各个通道卷积,分离了空间与channel。减少参数。
比如,输入通道为16,输出通道为32,使用卷积核大小3*3,如果直接卷积,则我们需要32个卷积核,每个参数为3*3*16,总参数为32*3*3*16=4608。分开操作时,第一步,我们每个卷积核只一个输入通道进行卷积,即对空间部分卷积,需要16个卷积核,每个3*3*1,共144个参数;第二步,对通道部分卷积,此时不需要对空间卷积了,所以卷积核大小为1*1(即保留原始空间信息),对16个通道卷积,即一个卷积核参数为1*1*16,输出32则用32个卷积核,共16*32=512个参数。总参数656个。参数量为原来的1/7。对于空间和通道较独立的数据,使用此方法不仅效率高,而且效果好。
- Dilated convolution:空洞卷积。解决下采样(pooling)过程中信息丢失问题,实现像素级的语义分割。
如图,卷积核大小不变,但是中间可以留空,这样可以增大卷积核的视野,而无需扩大卷积核大小(增加参数/计算量)。
- 反卷积(转置卷积):反卷积核与元素卷积核的输入输出shape是交换形式,实现还原原始shape的操作。
4,tensorflow实现
常规卷积
tf.nn.conv2d(input, filter, strides, padding, use_cudnn_on_gpu=None, data_format=None, Name=None)
可以用高级API,这里步长对于样本和通道维度默认设为1了,所以只有2个参数。对于dilation也是如此。同时还有trainable等特性。
tf.layers.Conv2D(
filters,
kernel_size,
strides=(1, 1),
padding='valid',
data_format='channels_last',
dilation_rate=(1, 1),
activation=None,
use_bias=True,
kernel_initializer=None,
bias_initializer=<tensorflow.python.ops.init_ops.Zeros object at 0x000001ECFFC4D188>,
kernel_regularizer=None,
bias_regularizer=None,
activity_regularizer=None,
kernel_constraint=None,
bias_constraint=None,
trainable=True,
name=None,
**kwargs,
)
Depthwise convolution
tf.nn.depthwise_conv2d(input, filter, strides, padding, rate=None, name=None, data_format=None)
Separable convolution
tf.nn.separable_conv2d(input, depthwise_filter, pointwise_filter, strides, padding, rate=None, name=None, data_format=None)
反卷积
tf.nn.conv2d_transpose(value, filter, output_shape, strides, padding="SAME", data_format="NHWC", name=None)
以上参数就不具体说明了,在此只是作个汇总,方便查看。
参考资料
https://www.cnblogs.com/noticeable/p/9197640.html
https://www.cnblogs.com/cvtoEyes/p/8848815.html
原文地址:https://www.cnblogs.com/lunge-blog/p/11876606.html
- Visual C#.Net网络程序开发-Tcp篇(3) 祥细内容:
- 安全科普:流量劫持能有多大危害?
- OpenSSL心脏出血漏洞全回顾
- Nmap扫描对比工具–libnmap实践
- 如何使用TensorFlow实现神经网络
- 安全科普:详解流量劫持的形成原因
- Office”组合”式漏洞攻击样本分析
- jsp标签小结
- 专家解释“愤怒的小鸟”如何变身间谍
- BT5 + wireshark玩wifi捕获和中间人攻击
- Hibernate HQL注入攻击入门
- 高效开源的网络扫描框架NINJA-PingU
- 对List.Sort的简单研究
- 使用Apache API监控Uber的实时数据,第3篇:使用Vert.x的实时仪表板
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- dotnet 基于 dotnet format 的 GitHub Action 自动代码格式化机器人
- 10.7 border-width边框粗细:outline与border有什么不同?
- WPF 非客户区的触摸和鼠标点击响应
- Flink 解决 No ExecutorFactory found to execute the application
- 10.8 如何用js验证一下boz-sizing样式对块级盒子大小的影响?
- 10.9 块级盒子的内外边距:如何使用box-sizing重新定义盒子模式?
- 10.10 圆角边框border-radius与盒子阴影:如何使用它实现圆等特殊形状?
- 函数内部的this指向
- 正则表达式在js中的使用
- 10.11 如何使用git?
- 10.13 如何使用transform样式?
- 正则表达式中的特殊字符
- ES6新增语法--let
- ES6新增语法--const
- 10.14 如何实现一个居中弹出的窗口?