cnn中的卷积核及tensorflow中卷积的各种实现

hans_209 hans_209     2022-09-06     168

关键词:

声明:

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)]) 

 

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去做卷积。实例图如下:

这个理解困难就是最后一步,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中的卷积和池化层(代码片段)

在官方tutorial的帮助下,我们已经使用了最简单的CNN用于Mnist的问题,而其实在这个过程中,主要的问题在于如何设置CNN网络,这和Caffe等框架的原理是一样的,但是tf的设置似乎更加简洁、方便,这其实完全类似于Caffe的python接... 查看详情

tensorflow一文弄懂cnn中的padding参数(代码片段)

...使用卷积神经网络CNN来对图像进行特征提取,当我们使用TensorFlow搭建自己的CNN时,一般会使用TensorFlow中的卷积函数和池化函数来对图像进行卷积和池化操作,而这两种函数中都存在参数padding,该参数的设置很容易引起错误,所... 查看详情

tensorflow中使用cnn实现mnist手写体识别

  本文参考YannLeCun的LeNet5经典架构,稍加ps得到下面适用于本手写识别的cnn结构,构造一个两层卷积神经网络,神经网络的结构如下图所示:  输入-卷积-pooling-卷积-pooling-全连接层-Dropout-Softmax输出    第一层卷积利用5*... 查看详情

思考卷积神经网络(cnn)中各种意义

原文:https://blog.csdn.net/aimreant/article/details/53145063思考卷积神经网络(CNN)中各种意义只是知道CNN是不够,我们需要对其进行解剖,继而分析不同部件存在的意义CNN的目的简单来说,CNN的目的是以一定的模型对事物进行特征提取... 查看详情

tensorflow实战-tensorflow实现卷积神经网络cnn-第5章

第5章-TensorFlow实现卷积神经网络CNN5.1卷积神经网络简介卷积神经网络CNN最初是为了解决图像识别等问题设计的,当然现在的应用已经不限于图像和视频,也可以用于时间序列信号,比如音频信号、文本数据等。在深度学习出现之... 查看详情

计算CNN实现中的卷积层

】计算CNN实现中的卷积层【英文标题】:CalculateconvolutionallayerinCNNimplementation【发布时间】:2015-07-2312:21:28【问题描述】:我正在尝试使用稀疏自动编码器训练卷积神经网络,以便计算卷积层的过滤器。我正在使用UFLDL代码来构建... 查看详情

卷积神经网络cnn原理以及tensorflow实现

      在知乎上看到一段介绍卷积神经网络的文章,感觉讲的特别直观明了,我整理了一下。首先介绍原理部分。      通过一个图像分类问题介绍卷积神经网络是如何工作的。下面是卷... 查看详情

tensorflow卷积神经网络实战手写卷积&&池化(代码片段)

目录一、获取并绘制图像二、手写卷积1、设置卷积核及权重2、卷积2-1、卷积实现2-2、限值2-3、图像赋值2-4、显示 卷积代码三、手写池化1、创建图像2、遍历池化3、显示图像池化代码总代码一、获取并绘制图像importcv2importnumpyasn... 查看详情

卷积神经网络-疑点解析

...但是我忽然发现,基本没人提到卷积层的神经元,而且在tensorflow编程中,也无需设置卷积层的神经元,这使得我们更加忽略了卷积层的神经元到底是啥样的。权值共享,那么是不是只要一个神经元就够了呢?于是我开始思考...1.... 查看详情

pytorch实现卷积神经网络cnn

Pytorch是torch的Python版本,对TensorFlow造成很大的冲击,TensorFlow无疑是最流行的,但是Pytorch号称在诸多性能上要优于TensorFlow,比如在RNN的训练上,所以Pytorch也吸引了很多人的关注。之前有一篇关于TensorFlow实现的CNN可以用来做对比... 查看详情

深度学习之tensorflow:卷积神经网络

基础概念:  卷积神经网络(CNN):属于人工神经网络的一种,它的权值共享的网络结构显著降低了模型的复杂度,减少了权值的数量。卷积神经网络不像传统的识别算法一样,需要对数据进行特征提取和数据重建,可以直接... 查看详情

深度学习--tensorflow(项目)识别自己的手写数字(基于cnn卷积神经网络)(代码片段)

目录基础理论 一、训练CNN卷积神经网络1、载入数据2、改变数据维度3、归一化4、独热编码5、搭建CNN卷积神经网络 5-1、第一层:第一个卷积层5-2、第二层:第二个卷积层5-3、扁平化5-4、第三层:第一个全连接层5-5、... 查看详情

tensorflow学习笔记五:mnist实例--卷积神经网络(cnn)

...我就分成几个部分来叙述。首先,下载并加载数据:importtensorflowastfimporttensorflow.examples.tutorials.mnist.input_dataasinput_datamnist=input_data.read_data 查看详情

如何理解graphconvolutionalnetwork(gcn)

...图卷积神经网络)之前,必须对离散卷积(具体说就是CNN中的卷积)有个清楚的认识。如何通俗易懂地解释卷积?,离散卷积本质就是一种加权求和。如图1所示,CNN中的卷积本质上就是利用一个共享参数的卷积核,通过计算中... 查看详情

tensorflow卷积神经网络[转]

...机视觉等领域被广泛应用.本文将简单介绍其原理并分析Tensorflow官方提供的示例.关于神经网络与误差反向传播的原理可以参考作者的另一篇博文BP神经网络与Python实现.工作原理卷积是图像处理中一种基本方法.卷积核是一个nxn的... 查看详情

深度学习之卷积神经网络cnn及tensorflow代码实现示例

一、CNN的引入在人工的全连接神经网络中,每相邻两层之间的每个神经元之间都是有边相连的。当输入层的特征维度变得很高时,这时全连接网络需要训练的参数就会增大很多,计算速度就会变得很慢,例如一张黑白的28×2828×28... 查看详情

cnn卷积神经网络

...波器去获得观测数据的最显著的特征。  卷积神经网络中的每一个特征提取层(卷积层)都紧跟着一个用来 查看详情

基于cnn卷积神经网络的tensorflow+keras深度学习的人脸识别(代码片段)

基于CNN卷积神经网络的TensorFlow+Keras深度学习的人脸识别前言项目实现效果补充模型数据嵌入模型CNN神经网络模型项目概述项目运行流程核心环境配置项目核心代码详解目录核心代码设置数据集目录收集人脸识别数据——UUID格... 查看详情