tensowflow实现离散卷积运算

  • 0. 基本概念
  • 1. 求输出矩阵的大小并对原始array进行pad处理
    • 1.1 full (tensorflow没有该参数)
    • 1.2 same
    • 1.3 valid
  • 2. 将卷积核旋转180度
  • 3. 滑动卷积核,将卷积核从padded array的左上角,按照stride依次移动直到右下角
  • 4. 每步移动的时候,将旋转后的卷积核与其笼罩的padded arrayd的元素做加权求和
  • 5. 总结

0. 基本概念

矩阵的卷积运算主要用在图像处理中,假设输入信号为x,激活响应为h,则其卷积定义为:

激活响应(也称为核)的维度通常为奇数,中心元素下标为(0,0),index如下所示

与卷积核h不同,输入图像x和输出图像y的(0,0)点都在左上角,横坐标往右index增大,纵坐标往下index增大。因此,输出图像y的横坐标从0到M-1,纵坐标从0到N-1,这里M和N分别是输出图像宽度、高度上的像素点的个数。如果要在x左方补零,则这些0元素的横坐标取负数;如果要在x上方补零,这些零元素的纵坐标取负数。rot180(h)在padded_x上滑动的时候,取出rot180(h)笼罩的区域(该区域有可能含x补零的区域,对应x的负index),将对应区域做加权和。上式中x[i,j]的i和j取值从-∞到-∞的意义就是x中的被rot180(h)的当前位置笼罩着的左、右边界index及上、下边界index。每次滑动要做加权平均的时候,i、j的边界index取值是不一样的。不难观察到,对于x_patch是从左边界取到右边界(i=-∞到∞),对于卷积核是从右边界取到左边界;对于x_patch是从上边界取到下边界(j=-∞到∞),对于卷积核是从下边界取到上边界;因此我们说卷积核被旋转了180度。

1. 求输出矩阵的大小并对原始array进行pad处理

A:输入图像,B:卷积核。假设输入图像A大小为ma x na,卷积核B大小为mb x nb

1.1 full (tensorflow没有该参数)

(optm,optn):ceil( (ma+mb-1)/mstride ) x ceil( (na+nb-1)/nstride )
需要采取pad操作:宽度上需要pad的总数目是Pm=(optm-1)×mstride+mb-ma,其中左方pad: floor(Pm/2) ;高度上需要pad的总数目是Pn=(optn-1)×nstride+nb-na,其中上方pad: floor(Pn/2)

1.2 same

(optm,optn):ceil( ma / mstride ) x ceil( na / nstride )
需要采取pad操作:宽度上需要pad的总数目是Pm=(optm-1)×mstride+mb-ma,其中左方pad: floor(Pm/2) ;高度上需要pad的总数目是Pn=(optn-1)×nstride+nb-na,其中上方pad: floor(Pn/2)
特殊地,如果stride=1(matlab),则输入、输出大小不变,Pm=mb-1,而我们通常让卷积核的维度是奇数,这样上下左右可以均匀pad
更特殊地,如果mb=mstride=sqrt(ma)或ma/2, nb=nstride=sqrt(na)或na/2,则退化为valid
例子

x = tf.constant([[1., 2., 3.],[4., 5., 6.]])  #两行三列的矩阵,用2x2的kernel,stride=2来pool
x = tf.reshape(x, [1, 2, 3, 1])  # give a shape accepted by tf.nn.max_pool
valid_pad = tf.nn.max_pool(x, [1, 2, 2, 1], [1, 2, 2, 1], padding='VALID')
same_pad = tf.nn.max_pool(x, [1, 2, 2, 1], [1, 2, 2, 1], padding='SAME')
valid_pad.get_shape() == [1, 1, 1, 1]  # valid_pad is [5.] 一行一列
same_pad.get_shape() == [1, 1, 2, 1]   # same_pad is  [5., 6.] 一行两列

解释一下same的结果:高度方向(行方向)na=nb=2, optn=1, pn=0;宽度方向(列方向)ma=3,mb=2, optm=2, pm=1 其中左边pad=0 。最终从原来的2x3变成一个pn x pm =2x4的padded array,pool后的输出结果为optn x optm = 1x2

1.3 valid

(optm,optn): ceil( ( ma- mb +1)/ mstride ) x ceil( ( na- nb +1)/ nstride )
特殊地,如果mb=mstride,nb=nstride,则optm= ma/mb, optn= na /nb
此时不采取pad操作

2. 将卷积核旋转180度

如果是互相关操作,卷积核不用旋转,直接与其笼罩的padded_x各元素做加权和:

注意这里的h才是需要滑动的函数(filter),上式中x[i,j]的i和j取值从-∞到-∞的意义为卷积核的左、右边界index及上、下边界index。对于给定卷积核来说,每次滑动要做加权平均的时候,i、j的边界index取值是固定不变的。不难观察到,对于卷积核是从左边界取到右边界(i=-∞到∞),对于x_patch依然是从左边界取到右边界;对于卷积核是从上边界取到下边界(j=-∞到∞),对于x_patch依然是从上边界取到下边界;因此我们说卷积核不用旋转。

3. 滑动卷积核,将卷积核从padded array的左上角,按照stride依次移动直到右下角

其实不论对于什么情况,我们总的输出图像的宽度m和高度n可以用如下公式计算:

4. 每步移动的时候,将旋转后的卷积核与其笼罩的padded arrayd的元素做加权求和

例子1







这里由于是卷积操作的其中一次滑动步,对于这一步来说,i、j是从0到2
如果是互相关的话,对于每一步滑动,i、j都是取-1到1






例子2
假设有这样一张图,双通道
第一个通道:

第二个通道:

import tensorflow as tf
a=tf.constant([[[1.0,2.0,3.0,4.0],[5.0,6.0,7.0,8.0],[8.0,7.0,6.0,5.0],[4.0,3.0,2.0,1.0]],[[4.0,3.0,2.0,1.0],[8.0,7.0,6.0,5.0],[1.0,2.0,3.0,4.0],[5.0,6.0,7.0,8.0]]])
a=tf.reshape(a,[1,4,4,2])
pooling=tf.nn.max_pool(a,[1,2,2,1],[1,1,1,1],padding='VALID')
with tf.Session() as sess:print("image:")image=sess.run(a)print (image)print("reslut:")result=sess.run(pooling)print (result)

输出image张量的第一列实际上对应了第一张图,第二列对应了第二张图
image:
[[[[ 1. 2.]
[ 3. 4.]
[ 5. 6.]
[ 7. 8.]]

[[ 8. 7.]
[ 6. 5.]
[ 4. 3.]
[ 2. 1.]]

[[ 4. 3.]
[ 2. 1.]
[ 8. 7.]
[ 6. 5.]]

[[ 1. 2.]
[ 3. 4.]
[ 5. 6.]
[ 7. 8.]]]]

输出result张量的第一列实际上对应了第一张图池化的结果,第二列对应了第二张图池化的结果

reslut:
[[[[ 8. 7.]
[ 6. 6.]
[ 7. 8.]]

[[ 8. 7.]
[ 8. 7.]
[ 8. 7.]]

[[ 4. 4.]
[ 8. 7.]
[ 8. 8.]]]]
第一图池化结果:

第二图池化结果:

5. 总结

对于卷积神经网络来说,每个卷积层(l层)的维度变化如下:

tensowflow实现离散卷积运算相关推荐

  1. Python实现二维离散卷积运算

    Python实现二维离散卷积运算 卷积运算是图像处理中的重要操作,它可以对图像进行平滑.增强边缘等处理.在Python中,我们可以使用numpy库来实现二维离散卷积运算. 首先,我们需要定义一个二维滤 ...

  2. 基于MATLAB完成卷积运算,基于Matlab的离散卷积

    基于Matlab 的离散卷积 刘国良 (洛阳理工学院 河南洛阳 471000) 摘 要:卷积运算广泛用于通讯.电子.自动化等领域的线性系统的仿真.分析及数字信号处理等方面.在Matlab 中可以使用线 ...

  3. 怎么解释卷积的两种不同运算结果长度的不同?

    卓大大,打扰一下.我想问下您就是互相关运算和卷积在一定程度上是一样的运算吧,那为什么卷积之后序列长度是2N-1,而互相关运算的结果按照那个频域相乘再求快速傅里叶的逆变换得到的序列长度应该是就是之前的序 ...

  4. c语言离散卷积编程,实验一 离散卷积的C语言编程.ppt

    实验一 离散卷积的C语言编程.ppt 实验一 离散卷积的C语言编程实验 DSP实验室 实验性质 综合设计性实验 实验目的 1 了解和认识常用的各种信号: 2 掌握卷积的定义和计算方法: 3 掌握在计算 ...

  5. 离散卷积的c语言编程实验,数字信号处理实验一离散卷积c语言编程.ppt

    数字信号处理实验一离散卷积c语言编程 实验一 离散卷积的C语言编程实验 DSP实验室 2005 实验性质 综合设计性实验 实验目的 1 了解和认识常用的各种信号: 2 掌握卷积的定义和计算方法: 3 ...

  6. c语言离散卷积编程,数电实验一 离散卷积的C语言编程.ppt

    数电实验一 离散卷积的C语言编程.ppt 实验一 离散卷积的C语言编程实验,DSP实验室,实验性质,综合设计性实验,实验目的,1 了解和认识常用的各种信号: 2 掌握卷积的定义和计算方法: 3 掌握在 ...

  7. 深度学习中的卷积网络简介

    卷积网络(convolutional network)也叫做卷积神经网络(convolutional neural network, CNN),是一种专门用来处理具有类似网格结构的数据的神经网络.例如 ...

  8. 学习笔记CB009:人工神经网络模型、手写数字识别、多层卷积网络、词向量、word2vec...

    人工神经网络,借鉴生物神经网络工作原理数学模型. 由n个输入特征得出与输入特征几乎相同的n个结果,训练隐藏层得到意想不到信息.信息检索领域,模型训练合理排序模型,输入特征,文档质量.文档点击历史.文档 ...

  9. python numpy np.convolve()函数(返回两个一维序列的离散线性卷积)

    文章目录 from numpy.core.numeric() 计算流程 from numpy.core.numeric() def convolve(a, v, mode='full'):" ...

最新文章

  1. 雷军的100亿计划:不服就干,生死看淡
  2. PHP时间戳 strtotime()使用方法和技巧
  3. 【你知道HHTP各种状态代表什么意思吗?】
  4. ASP.NET 学习笔记_13 文章发布管理小系统
  5. Caffe官方教程翻译(7):Fine-tuning for Style Recognition
  6. casio dt-930 条码采集器 盘点软件源程序
  7. 西北工业大学复试上机
  8. Cocos2d-x V3.2+Cocos Studio1.6 实现一个简单的uibutton点击功能
  9. 虚拟主机的301重定向
  10. asp 退出登录修改cookie能进入后台_深入浅出让你理解跨域与SSO单点登录原理与技术...
  11. nginx An attempt was made to access a socket in a way forbidden by its access permissions
  12. C++ 原子操作和内存模型
  13. java 用户、角色、权限数据库设计
  14. Mybatis Sql 大于号小于号不兼容
  15. 【考研数学】函数图像(三角函数、幂函数、指数函数等)
  16. (全程图解)Axure RP8.0安装、破解、汉化教程
  17. maven-maven使用-P参数打包不同环境
  18. 服务器自动启动的原因,服务器经常自动重启是什么原因
  19. 划片机的性能决定了芯片产品的质量
  20. maven 解决Cannot access alimaven以及Process terminated

热门文章

  1. 网页宽度自动适应手机屏幕宽度的实现代码(viewport)
  2. 生信数据库ID总结及转换方法
  3. MAC JDK 卸载方法(彻底卸载)
  4. XDU Problem 1037 - 智破机枪阵
  5. Python——文件(File)操作汇总
  6. 自动驾驶:车辆转弯半径计算
  7. 关于电脑自带的微软拼音输入法变成繁体的操作方法
  8. AudioTrack 播放wav音频文件
  9. java pinyin4j_java实现中文汉字转拼音 Pinyin4j的基本用法
  10. 湖南中医药大学OJ—1170到1179