TensorFlow中卷积 CNN中的卷积核及TensorFlow中卷积的各种实现

声明:

1. 我和每一个应该看这篇博文的人一样,都是初学者,都是小菜鸟,我发布博文只是希望加深学习印象并与大家讨论。

2. 我不确定的地方用了“应该”二字

首先,通俗说一下,CNN的存在是为了解决两个主要问题:

1. 权值太多。这个随便一篇博文都能解释

2. 语义理解。全连接网络结构处理每一个像素时,其相邻像素与距离很远的像素无差别对待,并没有考虑图像内容的空间结构。换句话说,打乱图像像素的输入顺序,结果不变。

然后,CNN中的卷积核的一个重要特点是它是需要网络自己来学习的。这一点很简单也很重要:一般的卷积核如sobel算子、平滑算子等,都是人们根据数学知识得到的,比如求导,平均等等。所以一般的人工卷积核是不能放进卷积层的,这有悖于“学习”的概念。我们神经网络就是要自己学习卷积核的参数。来提取人们想不到甚至是无法理解的空间结构或特征。其他特征包括全局共享(一个卷积核滑动一整张图像),多核卷积(用一个卷积核只能提取一种空间结构或特征)。

最后,说一说TensorFlow中卷积的各种实现API(经常用到的):

import tensorflow as tf #自己去加,下面用tf代替tensorflow模块

1  tf.nn.conv2d(input, filter, strides, padding, use_cudnn_on_gpu=None, data_format=None, Name=None)

#输入:

# input: 一个张量。数据类型必须是float32或者float64。记住这个张量为四维[batch, in_height, in_width, in_channels],batch应该是指每次feed给网络的数据的个数,和mini-batch gradient descend有关;中间是长宽两项;最后是通道,灰度为1,RGB等为3

# filter: 输入的卷积核,也是四维[filter_height,filter_width,in_channels,channel_multiplier],前两维是尺寸比如3x3,2x2(注意是可以2x2的,这个涉及到非对称卷积核),第三维等于 in_channels,第四维是输出通道数,也就是你要输出的通道数,也就是你要使用的卷积核数

# strides: 一个长度是4的一维整数类型的数组,一般设为[1,1,1,1],注意第一个和第四个"1”固定不变(我试过改了结果不变,并且没有意义)中间的两个1,就是横向步长和纵向步长,意思是卷积核不一定是一步一步的滑动的。

# padding: 有两个值‘SAME’和'VALID',前者使得卷积后图像尺寸不变;后者尺寸变化

# use_cudnn_on_gpu: 在gpu上处理,tensorflow-gpu都默认设为了True

# data_format=None, Name=None 这两项请博友们自己查查,应该问题不大,Name应该与TensorFlow的图结构以及Session(会话)有关系;data_format的默认值应该为'NHWC',及张量维度的顺序应该是batch个数,高度,宽度和通道数。

可以说, tf.nn.conv2d就是处理的典型的卷积,例子和图示如下:

1 input_data =tf.Variable(np.random.rand(10,9,9,3),dtype=np.float32)
2 filter_data = tf.Variable(np.random.rand(2,2,3,2),dtype=np.float32)
3 y = tf.nn.conv2d(input_data,filter_data,strides=[2,5,5,3],padding='SAME') #中间5,5大家自己设置一下,自己感受
4 y.shape

结果是 TensorShape([Dimension(10), Dimension(2), Dimension(2), Dimension(2)]) 

TensorFlow中卷积    CNN中的卷积核及TensorFlow中卷积的各种实现

 

2  tf.nn.depthwise_conv2d(input, filter, strides, padding, rate=None, name=None, data_format=None)

与1的不同有有两点:

1. depthwise_conv2d将不同的卷积核独立地应用在in_channels的每个通道:我们一般对于三通道图像做卷积,都是先加权求和再做卷积(注意先加权求和再卷积与先卷积再加权求和结果一样),形象化描述就是我先把3通道压扁成1通道,在把它用x个卷积核提溜成x通道(或者我先把3通道用x个卷积核提溜成3x个通道,再分别压扁得到x通道); 而depthwise_conv2d就不加权求和了,直接卷积,所以最后输出通道的总数是in_channels*channel_multiplier

2. rate参数是一个1维向量,of size 2,由两个元素组成,这个参数与atrous convolution(孔卷积)和感受野有关,我下面会给出参考链接。注意, If it is greater than 1, then all values of strides must be 1. 

 

3 tf.nn.separable_conv2d(input, depthwise_filter, pointwise_filter, strides, padding, rate=None, name=None, data_format=None)

#特殊参数:

# depthwise_filter。一个张量,数据维度是四维[filter_height,filter_width,in_channels,channel_multiplier],如1中所述,但是卷积深度是1,如2中所述。

# pointwise_filter。一个张量,数据维度是四维[1,1,in_channels*channel_multiplier,out_channel]

tf.nn.separable_conv2d是利用几个分离的卷积核去做卷积。首先用depthwise_filter做卷积,效果与depthwise_conv2d相同,然后用1x1的卷积核pointwise_filter去做卷积。实例图如下:

TensorFlow中卷积    CNN中的卷积核及TensorFlow中卷积的各种实现

这个理解困难就是最后一步,pointwise_filter是什么?需要说明的是,我只知道原理,我还不知道这样做的目的是什么。最后pointwise原理很简单,就和2中我说过的一样,我先把DM*in_channels(即in_channels*channel_multiplier)个通道压扁成1个通道,再用pointwise_filter这个1*1的卷积核提溜成out_channel个通道,所以pointwise_filter相当于out_channel个scalar。

例子如下:

1 1 input_data = tf.Variable(np.random.rand(10,9,9,3),dtype=np.float32)
2 2 depthwise_filter = tf.Variable(np.random.rand(2,2,3,5),dtype=np.float32)
3 3 pointerwise_filter = tf.Variable(np.random.rand(1,1,15,20),dtype=np.float32)
4 4 #out_channels >= channel_multiplier * in_channels
5 5 y =tf.nn.separable_conv2d(input_data, depthwise_filter, pointerwise_filter, strides = [1,1,1,1], padding='SAME')
6 y.shape

结果是 TensorShape([Dimension(10), Dimension(9), Dimension(9), Dimension(20)])

 

参考资料:

《深度学习原理与Tensorflow实践》
《TensorFlow技术解析与实战》

Tensorflow(API MASTERT),也就是API Documentation

孔卷积或者扩张卷积

图的出处

声明:

1. 我和每一个应该看这篇博文的人一样,都是初学者,都是小菜鸟,我发布博文只是希望加深学习印象并与大家讨论。

2. 我不确定的地方用了“应该”二字

首先,通俗说一下,CNN的存在是为了解决两个主要问题:

1. 权值太多。这个随便一篇博文都能解释

2. 语义理解。全连接网络结构处理每一个像素时,其相邻像素与距离很远的像素无差别对待,并没有考虑图像内容的空间结构。换句话说,打乱图像像素的输入顺序,结果不变。

然后,CNN中的卷积核的一个重要特点是它是需要网络自己来学习的。这一点很简单也很重要:一般的卷积核如sobel算子、平滑算子等,都是人们根据数学知识得到的,比如求导,平均等等。所以一般的人工卷积核是不能放进卷积层的,这有悖于“学习”的概念。我们神经网络就是要自己学习卷积核的参数。来提取人们想不到甚至是无法理解的空间结构或特征。其他特征包括全局共享(一个卷积核滑动一整张图像),多核卷积(用一个卷积核只能提取一种空间结构或特征)。

最后,说一说TensorFlow中卷积的各种实现API(经常用到的):

import tensorflow as tf #自己去加,下面用tf代替tensorflow模块

1  tf.nn.conv2d(input, filter, strides, padding, use_cudnn_on_gpu=None, data_format=None, Name=None)

#输入:

# input: 一个张量。数据类型必须是float32或者float64。记住这个张量为四维[batch, in_height, in_width, in_channels],batch应该是指每次feed给网络的数据的个数,和mini-batch gradient descend有关;中间是长宽两项;最后是通道,灰度为1,RGB等为3

# filter: 输入的卷积核,也是四维[filter_height,filter_width,in_channels,channel_multiplier],前两维是尺寸比如3x3,2x2(注意是可以2x2的,这个涉及到非对称卷积核),第三维等于 in_channels,第四维是输出通道数,也就是你要输出的通道数,也就是你要使用的卷积核数

# strides: 一个长度是4的一维整数类型的数组,一般设为[1,1,1,1],注意第一个和第四个"1”固定不变(我试过改了结果不变,并且没有意义)中间的两个1,就是横向步长和纵向步长,意思是卷积核不一定是一步一步的滑动的。

# padding: 有两个值‘SAME’和'VALID',前者使得卷积后图像尺寸不变;后者尺寸变化

# use_cudnn_on_gpu: 在gpu上处理,tensorflow-gpu都默认设为了True

# data_format=None, Name=None 这两项请博友们自己查查,应该问题不大,Name应该与TensorFlow的图结构以及Session(会话)有关系;data_format的默认值应该为'NHWC',及张量维度的顺序应该是batch个数,高度,宽度和通道数。

可以说, tf.nn.conv2d就是处理的典型的卷积,例子和图示如下:

1 input_data =tf.Variable(np.random.rand(10,9,9,3),dtype=np.float32)
2 filter_data = tf.Variable(np.random.rand(2,2,3,2),dtype=np.float32)
3 y = tf.nn.conv2d(input_data,filter_data,strides=[2,5,5,3],padding='SAME') #中间5,5大家自己设置一下,自己感受
4 y.shape

结果是 TensorShape([Dimension(10), Dimension(2), Dimension(2), Dimension(2)]) 

TensorFlow中卷积    CNN中的卷积核及TensorFlow中卷积的各种实现

 

2  tf.nn.depthwise_conv2d(input, filter, strides, padding, rate=None, name=None, data_format=None)

与1的不同有有两点:

1. depthwise_conv2d将不同的卷积核独立地应用在in_channels的每个通道:我们一般对于三通道图像做卷积,都是先加权求和再做卷积(注意先加权求和再卷积与先卷积再加权求和结果一样),形象化描述就是我先把3通道压扁成1通道,在把它用x个卷积核提溜成x通道(或者我先把3通道用x个卷积核提溜成3x个通道,再分别压扁得到x通道); 而depthwise_conv2d就不加权求和了,直接卷积,所以最后输出通道的总数是in_channels*channel_multiplier

2. rate参数是一个1维向量,of size 2,由两个元素组成,这个参数与atrous convolution(孔卷积)和感受野有关,我下面会给出参考链接。注意, If it is greater than 1, then all values of strides must be 1. 

 

3 tf.nn.separable_conv2d(input, depthwise_filter, pointwise_filter, strides, padding, rate=None, name=None, data_format=None)

#特殊参数:

# depthwise_filter。一个张量,数据维度是四维[filter_height,filter_width,in_channels,channel_multiplier],如1中所述,但是卷积深度是1,如2中所述。

# pointwise_filter。一个张量,数据维度是四维[1,1,in_channels*channel_multiplier,out_channel]

tf.nn.separable_conv2d是利用几个分离的卷积核去做卷积。首先用depthwise_filter做卷积,效果与depthwise_conv2d相同,然后用1x1的卷积核pointwise_filter去做卷积。实例图如下:

TensorFlow中卷积    CNN中的卷积核及TensorFlow中卷积的各种实现

这个理解困难就是最后一步,pointwise_filter是什么?需要说明的是,我只知道原理,我还不知道这样做的目的是什么。最后pointwise原理很简单,就和2中我说过的一样,我先把DM*in_channels(即in_channels*channel_multiplier)个通道压扁成1个通道,再用pointwise_filter这个1*1的卷积核提溜成out_channel个通道,所以pointwise_filter相当于out_channel个scalar。

例子如下:

1 1 input_data = tf.Variable(np.random.rand(10,9,9,3),dtype=np.float32)
2 2 depthwise_filter = tf.Variable(np.random.rand(2,2,3,5),dtype=np.float32)
3 3 pointerwise_filter = tf.Variable(np.random.rand(1,1,15,20),dtype=np.float32)
4 4 #out_channels >= channel_multiplier * in_channels
5 5 y =tf.nn.separable_conv2d(input_data, depthwise_filter, pointerwise_filter, strides = [1,1,1,1], padding='SAME')
6 y.shape

结果是 TensorShape([Dimension(10), Dimension(9), Dimension(9), Dimension(20)])

 

参考资料:

《深度学习原理与Tensorflow实践》
《TensorFlow技术解析与实战》

Tensorflow(API MASTERT),也就是API Documentation

孔卷积或者扩张卷积

图的出处

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:TensorFlow中卷积 CNN中的卷积核及TensorFlow中卷积的各种实现 - Python技术站

(0)
上一篇 2023年4月8日
下一篇 2023年4月8日

相关文章

  • 深度学习13—RNN循环神经网络原理

    为什么需要RNN(循环神经网络) 传统的神经网络的不足:传统的神经网络已经非常强大了,但有一个 特点是:他们都只能单独的取处理一个个的输入,前一个输入和后一个输入是完全没有关系的。但是,某些任务需要能够更好的处理序列的信息,即前面的输入和后面的输入是有关系的。比如时间序列数据、文字序列等。比如,当我们在理解一句话意思时,孤立的理解这句话的每个词是不够的,我们…

    2023年4月8日
    00
  • 机器学习(六):回归分析——鸢尾花多变量回归、逻辑回归三分类只用numpy,sigmoid、实现RANSAC 线性拟合

    [实验1 回归分析] 一、 预备知识 使用梯度下降法求解多变量回归问题 数据集 Iris 鸢尾花数据集是一个经典数据集,在统计学习和机器学习领域都经常被用作示例。数据集内包含 3 类共 150 条记录,每类各 50 个数据,每条记录都有 4 项特征:花萼长度、花萼宽度、花瓣长度、花瓣宽度,可以通过这4个特征预测鸢尾花卉属于(iris-setosa, iris…

    机器学习 2023年4月14日
    00
  • pytorch 图片处理.md

    本篇所有代码位置链接???? pytorch 图片处理,主要用到 torchvision 模块的 datasets 和 transforms。 例如:本地图片资源目录结构如下 ➜ torch_test tree animal_data animal_data ├── train │   ├── ants │   │   ├── 0013035.jpg │  …

    2023年4月8日
    00
  • Google开发者大会:你不得不知的Tensorflow小技巧

    同步滚动:开   Google Development Days China 2018近日在中国召开了。非常遗憾,小编因为不可抗性因素滞留在合肥,没办法去参加。但是小编的朋友有幸参加了会议,带来了关于tensorlfow的一手资料。这里跟随小编来关注tensorflow在生产环境下的最佳应用情况。 Google Brain软件工程师冯亦菲为我们带来了题为“用…

    tensorflow 2023年4月8日
    00
  • Ubuntu16.04 +cuda8.0+cudnn+opencv+caffe+theano+tensorflow配置明细

    安装英伟达显卡驱动 首先去官网上查看适合你GPU的驱动 (http://www.nvidia.com/Download/index.aspx?lang=en-us) [python] view plain copy sudo add-apt-repository ppa:graphics-drivers/ppa   sudo apt-get update  …

    2023年4月8日
    00
  • pip install keras==1.2.1

    【该方法仅适用于压缩包中含有setup.py的情况】 先从GitHub上找到想要下载的历史版本,右键复制链接地址。 然后执行命令: pip install https://github.com/keras-team/keras/archive/1.2.1.tar.gz 相类似的:如果想要安装 tensorflow 0.12.1 pip install ten…

    Keras 2023年4月6日
    00
  • 显著性目标检测(综述)

    《Salient Object Detection: A Survey》 url:https://arxiv.org/abs/1411.5878 笔记思路: 1.显著性检测的用途:根据显著性特征(空间域、频域等 ),快速有效地提取场景中有用的区域(目标区域等)进行进一步分析(显著性目标检测),如object proposal generation, gene…

    2023年4月8日
    00
  • 图数据挖掘:网络中的级联行为

    我们现在来研究网络中的传播。事实上,在网络中存在许多从节点到节点级联的行为,就像传染病一样。这在不同领域中都有所体现,比如生物中的传染性疾病;信息技术中的级联故障与信息的传播;社会学中的谣言、新闻、新技术的传播以及虚拟市场。其中在信息技术中信息就会经由媒体来进行扩散(diffusion)。接下来我们看如何基于网络构建传播模型。以传染病为例,传染病会沿着网络的…

    机器学习 2023年4月11日
    00
合作推广
合作推广
分享本页
返回顶部