精华内容
下载资源
问答
  • 卷积的原理

    2021-04-07 10:42:24
    隐藏层(W)每个节点都要与经过扁平化后...卷积神经网络(CNN)中全连接层(FC layer)作用 卷积代替全连接,防止过拟合 ...

    隐藏层(W)的每个节点都要与经过扁平化后的节点相连接

    卷积神经网络(CNN)中全连接层(FC layer)的作用

    卷积代替全连接,防止过拟合

     

     

     

     

     

     

     

    展开全文
  • 转载了这篇文章 博主写非常明白 https://blog.csdn.net/LoseInVain/article/details/81098502 https://blog.csdn.net/LoseInVain/article/details/81098502 ... ...

    转载了这篇文章 博主写的非常明白

    https://blog.csdn.net/LoseInVain/article/details/81098502

    https://blog.csdn.net/LoseInVain/article/details/81098502

    https://blog.csdn.net/LoseInVain/article/details/81098502

     

    一文搞懂反卷积,转置卷积

    前言

    本文翻译自《Up-sampling with Transposed Convolution》,这篇文章对转置卷积和反卷积有着很好的解释,这里将其翻译为中文,以飨国人。

    如有谬误,请联系指正。转载请注明出处。

    联系方式: 
    e-mail: FesianXu@163.com 
    QQ: 973926198 
    github: https://github.com/FesianXu


    用转置卷积进行上采样

    对于上采用的需求

    当我们用神经网络生成图片的时候,经常需要将一些低分辨率的图片转换为高分辨率的图片。 
    lowtohigh

    对于这种上采样(up-sampling)操作,目前有着一些插值方法进行处理:

    1. 最近邻插值(Nearest neighbor interpolation)
    2. 双线性插值(Bi-Linear interpolation)
    3. 双立方插值(Bi-Cubic interpolation)

    以上的这些方法都是一些插值方法,需要我们在决定网络结构的时候进行挑选。这些方法就像是人工特征工程一样,并没有给神经网络学习的余地,神经网络不能自己学习如何更好地进行插值,这个显然是不够理想的。

    为什么是转置卷积

    转置卷积(Transposed Convolution)常常在一些文献中也称之为反卷积(Deconvolution)和部分跨越卷积(Fractionally-strided Convolution),因为称之为反卷积容易让人以为和数字信号处理中反卷积混起来,造成不必要的误解,因此下文都将称为转置卷积,并且建议各位不要采用反卷积这个称呼。

    如果我们想要我们的网络可以学习到最好地上采样的方法,我们这个时候就可以采用转置卷积。这个方法不会使用预先定义的插值方法,它具有可以学习的参数。理解转置卷积这个概念是很重要的,因为它在若干重要的文献中都有所应用,如:

    1. DCGAN中的生成器将会用随机值转变为一个全尺寸(full-size)的图片,这个时候就需要用到转置卷积。
    2. 在语义分割中,会使用卷积层在编码器中进行特征提取,然后在解码层中进行恢复为原先的尺寸,这样才可以对原来图像的每个像素都进行分类。这个过程同样需要用到转置卷积。

    卷积操作

    让我们回顾下卷积操作是怎么工作的,并且我们将会从一个小例子中直观的感受卷积操作。假设我们有一个4×44×4的矩阵,我们将在这个矩阵上应用3×33×3的卷积核,并且不添加任何填充(padding),步进参数(stride)设置为1,就像下图所示,输出为一个2×22×2的矩阵。 
    这里写图片描述

    这个卷积操作在输入矩阵和卷积核中,对每个元素的乘积进行相加。因为我们没有任何填充和使用1为步进,因此我们只能对这个操作进行4次,因此我们的输出矩阵尺寸为2×22×2。 
    这里写图片描述 
    这种卷积操作使得输入值和输出值之间存在有位置上的连接关系,举例来说,输入矩阵左上方的值将会影响到输出矩阵的左上方的值。更具体而言,3×33×3的卷积核是用来连接输入矩阵中的9个值,并且将其转变为输出矩阵的一个值的。一个卷积操作是一个多对一(many-to-one)的映射关系。让我们记住这个,我们接下来将会用得着。

    反过来操作吧

    现在,假设我们想要反过来操作。我们想要将输入矩阵中的一个值映射到输出矩阵的9个值,这将是一个一对多(one-to-many)的映射关系。这个就像是卷积操作的反操作,其核心观点就是用转置卷积。举个例子,我们对一个2×22×2的矩阵进行上采样为4×44×4的矩阵。这个操作将会维护一个1对应9的映射关系。 
    这里写图片描述 
    但是我们将如何具体操作呢?为了接下来的讨论,我们需要定义一个卷积矩阵(convolution matrix)和相应的转置卷积矩阵(transposed convolution matrix)。

    卷积矩阵

    我们可以将一个卷积操作用一个矩阵表示。这个表示很简单,无非就是将卷积核重新排列到我们可以用普通的矩阵乘法进行矩阵卷积操作。如下图就是原始的卷积核: 
    这里写图片描述 
    我们对这个3×33×3的卷积核进行重新排列,得到了下面这个4×164×16的卷积矩阵: 
    这里写图片描述

    这个便是卷积矩阵了,这个矩阵的每一行都定义了一个卷积操作。下图将会更加直观地告诉你这个重排列是怎么进行的。每一个卷积矩阵的行都是通过重新排列卷积核的元素,并且添加0补充(zero padding)进行的。 
    这里写图片描述 
    为了将卷积操作表示为卷积矩阵和输入矩阵的向量乘法,我们将输入矩阵4×44×4摊平(flatten)为一个列向量,形状为16×116×1,如下图所示。 
    这里写图片描述

    我们可以将这个4×164×16的卷积矩阵和1×161×16的输入列向量进行矩阵乘法,这样我们就得到了输出列向量。 
    这里写图片描述

    这个输出的4×14×1的矩阵可以重新塑性为一个2×22×2的矩阵,而这个矩阵正是和我们一开始通过传统的卷积操作得到的一模一样。 
    这里写图片描述

    简单来说,这个卷积矩阵除了重新排列卷积核的权重之外就没有啥了,然后卷积操作可以通过表示为卷积矩阵和输入矩阵的列向量形式的矩阵乘积形式进行表达。

    所以各位发现了吗,关键点就在于这个卷积矩阵,你可以从16(4×44×4)到4(2×22×2)因为这个卷积矩阵尺寸正是4×164×16的,然后呢,如果你有一个16×416×4的矩阵,你就可以从4(2×22×2)到16(4×44×4)了,这不就是一个上采样的操作吗?啊哈!让我们继续吧!

    转置卷积矩阵

    我们想要从4(2×22×2)到16(4×44×4),因此我们使用了一个16×416×4的矩阵,但是还有一件事情需要注意,我们是想要维护一个1到9的映射关系。

    假设我们转置这个卷积矩阵C  (4×16)C  (4×16)变为CT  (16×4)CT  (16×4)。我们可以对CTCT和列向量(4×1)(4×1)进行矩阵乘法,从而生成一个16×116×1的输出矩阵。这个转置矩阵正是将一个元素映射到了9个元素。 
    这里写图片描述

    这个输出可以塑形为(4×4)(4×4)的矩阵: 
    这里写图片描述

    我们只是对小矩阵(2×2)(2×2)进行上采样为一个更大尺寸的矩阵(4×4)(4×4)。这个转置卷积矩阵维护了一个1个元素到9个元素的映射关系,因为这个关系正表现在了其转置卷积元素上。

    需要注意的是:这里的转置卷积矩阵的参数,不一定从原始的卷积矩阵中简单转置得到的,转置这个操作只是提供了转置卷积矩阵的形状而已。

    总结

    转置卷积操作构建了和普通的卷积操作一样的连接关系,只不过这个是从反向方向开始连接的。我们可以用它进行上采样。另外,这个转置卷积矩阵的参数是可以学习的,因此我们不需要一些人为预先定义的方法。即使它被称为转置卷积,它并不是意味着我们将一些现存的卷积矩阵简单转置并且使用其转置后的值。

    从本质来说,转置卷积不是一个卷积,但是我们可以将其看成卷积,并且当成卷积这样去用。我们通过在输入矩阵中的元素之间插入0进行补充,从而实现尺寸上采样,然后通过普通的卷积操作就可以产生和转置卷积相同的效果了。你在一些文章中将会发现他们都是这样解释转置卷积的,但是这个因为在卷积操作之前需要通过添加0进行上采样,因此是比较低效率的。

    注意:转置卷积会导致生成图像中出现棋盘效应(checkerboard artifacts),这篇文章《Deconvolution and Checkerboard Artifacts》推荐了一种上采样的操作(也就是插值操作),这个操作接在一个卷积操作后面以减少这种现象。如果你的主要目的是生成尽可能少棋盘效应的图像,那么这篇文章就值得你去阅读。

    引用

      1. A guide to convolution arithmetic for deep learning.(Vincent Dumoulin, Francesco Visin).[https://arxiv.org/abs/1603.07285]

      2. Unsupervised Representation Learning with Deep Convolutional Generative Adversarial Networks.(Alec Radford, Luke Metz, Soumith Chintala) 
        [https://arxiv.org/pdf/1511.06434v2.pdf]

      3. Fully Convolutional Networks for Semantic Segmentation.(Jonathan Long, Evan Shelhamer, Trevor Darrell) 
        [https://people.eecs.berkeley.edu/~jonlong/long_shelhamer_fcn.pdf]

      4. Deconvolution and Checkerboard Artifacts.(Augustus Odena, Vincent Dumoulin, Chris Olah) 
        [https://distill.pub/2016/deconv-checkerboard/]

    展开全文
  • 前言二维卷积的使用非常广泛,不论是出现处理还是深度学习都有涉及。但是目前网上大多罗列公式,把其实简单的二维卷积操作搞的很复杂。本文用在不使用任何的公式情况下,明白二维卷积的使用方法,并能够用Matlab编程...

    前言

    二维卷积的使用非常广泛,不论是出现处理还是深度学习都有涉及。但是目前网上大多罗列公式,把其实简单的二维卷积操作搞的很复杂。本文用在不使用任何的公式情况下,明白二维卷积的使用方法,并能够用Matlab编程实现。

    二维卷积实现

    二维卷积实现可以分为两大步。一是预处理:将卷积核翻转180°,将原始数据扩边;二是滑动卷积计算。下面按这两个步骤分别说明:

    预处理

    如图1所示即看的很明白。对卷积核翻转180°就是"上下翻转+左右翻转";对原始数据的扩边其实就是为了"补0"好算,扩边括多大呢?就看原始数据"左上角"那个点,卷积核是3x3,那么左顶点一周也就要扩成3x3(卷积核中心和左顶点对齐后可以做"点乘"),也就是上、下各括边"fix(3/2) = 1"。

    acf95d01fefa

    图1:二维卷积操作预处理

    滑动卷积计算

    滑动卷积计算,其实就是对应的"两个小矩阵"的"点乘并求和"。"滑动"是指:卷积核沿着"扩边后的原始数据"从左到右,从上到下进行。如图2所示:

    acf95d01fefa

    图2:滑动卷积计算

    完成上面两步,二维卷积就做完了!是不是很简单?根本不需要看复杂的公式~

    既然清楚了理论基础,那就用Matlab实践一下。

    clc; clear;

    x = [-1 -2 -1;0 0 0;1 2 1]; % 卷积核——必须是方阵且为奇数行/列

    data = [1 2 3 4 5;6 7 8 9 10;11 12 13 14 15;16 17 18 19 20;21 22 23 24 25]; % 原始数据

    zidai = conv2(data,x,'same'); % matlab自带的二维卷积函数

    x = rot90(rot90(x)); % 新的卷积核

    % 核的尺寸

    size_x = size(x);

    row_x = size_x(1); % 核的行数

    col_x = size_x(2); % 核的列数

    % 数据的尺寸

    size_data = size(data);

    row_data = size_data(1); % 数据的行数

    col_data = size_data(2); % 数据的列数

    % 核的中心元素:

    centerx_row = round(row_x/2);

    centerx_col = round(col_x/2);

    centerx = x(centerx_row,centerx_col);

    % 对原始数据扩边:

    data_tmp = zeros(row_data+row_x-1,col_data+row_x-1);

    data_tmp(centerx_row:centerx_row+row_data-1,centerx_row:centerx_row+col_data-1) = data;

    data_k = data_tmp;

    % 扩边后新数据矩阵尺寸:

    size_data_k = size(data_k);

    row_data_k = size_data_k(1);

    col_data_k = size_data_k(2);

    % m = centerx_row:row_data+row_x-2

    % 开始卷积计算: m n 是新数据矩阵的正常索引

    result = zeros(row_data_k,col_data_k);

    % m n一般卷积步长都是1

    for m = centerx_row:centerx_row+row_data-1

    for n = centerx_row:centerx_row+col_data-1

    % tt是临时与卷积核大小相同的数据中的部分矩阵:

    tt = data_k(m-(centerx_row-1):m+(centerx_row-1),n-(centerx_row-1):n+(centerx_row-1));

    % juan是中间每一次卷积计算求和的中间量:

    juan = sum(x.*tt);

    result(m,n) = sum(juan(:));

    end

    end

    % 求掉之前扩边的0:

    result = result(centerx_row:centerx_row+row_data-1,centerx_row:centerx_row+col_data-1)

    说明:手动实现的matlab程序其实很简单很好理解,可直接运行。

    展开全文
  • 依次经过一层卷积(kernel size 5×5,padding 1,stride 2),pooling(kernel size 3×3,padding 0,stride 1),又一层卷积(kernel size 3×3,padding 1,stride 1)之后,最终输出特征图大小为:97。...

    1 卷积尺寸变化

    =filter+2paddingstride+1\bm{输出尺寸=\dfrac{输入尺寸-filter尺寸+2*padding} {stride+1}}

    • 宽和高都是这么计算的

    举个例子说明卷积是如何计算的:
    输入图片大小为200×200,依次经过一层卷积(kernel size 5×5,padding 1,stride 2),pooling(kernel size 3×3,padding 0,stride 1),又一层卷积(kernel size 3×3,padding 1,stride 1)之后,最终输出的特征图大小为:97。

    计算尺寸不被整除只在GoogLeNet中遇到过。卷积向下取整,池化向上取整。

    • (200-5+21)/2+1 为99.5,取99
    • (99-3)/1+1 为97
    • (97-3+21)/1+1 为97

    2 常见的卷积尺寸不变的情况:

    • stride为1,kernel为 3 ,padding为1 卷积前后尺寸不变
    • stride为1,kernel为 5 ,padding为2 卷积前后尺寸不变
    • tips:当步长为1时,只要在卷积操作中维持住 padding×2+1=kernel size\bm{padding×2+1=kernel\ size} 即可保持输入的输入卷积前后尺寸不改变
    展开全文
  • 深度学习 CNN卷积神经网络 LeNet-5详解 https://blog.csdn.net/happyorg/article/details/78274066 卷积神经网络之NiN(2013) ... 【机器学习】关于CNN中1×1卷积核和Network in Network理解 ht...
  • 当我们将5x5x1图像填充为6x6x1图像,然后在其上应用3x3x1核,我们发现卷积矩阵变成了5x5x1尺寸。因此,我们将其命名为--相同填充(Same Padding)。 另一方面,如果我们在没有填充情况下执行同样操作,...
  • 在深度学习的过程中,很多神经网络都会用到各种卷积核来进行操作,那么我们就简单讲一下卷积的原理和实现过程。 那么卷积在神经网络中的作用是什么呢?一开始的传统神经网络是没有卷积层的,都是隐藏层加生全连接层...
  • 卷积的实现原理

    万次阅读 2020-03-09 11:53:15
    卷积的实现原理   我前面的一篇文章中,卷积操作的计算量分析中,引用了矩阵相乘来概括卷积的计算量,这样做确实是有道理的,因为在卷积的实现中的确是通过矩阵相乘来加速卷积的计算。但是我在那篇文章只是简单的...
  • 本文以通俗易懂的方式讲述卷积,并辅以图片解释,能快速理解卷积的实现原理。最后手写python代码实现卷积过程,让Tensorflow卷积在我们面前不再是黑箱子! 注意: 本文只针对batch_size=1,padding=’SAME’,stride=...
  • 那么一般操作就是用32个3×3的卷积核来分别同输入数据卷积,这样每个卷积核需要3×3×16个参数,得到输出是只有一个通道数据。之所以会得到一通道数据,是因为刚开始3×3×16的卷积每个通道会在输入...
  • 本文以通俗易懂的方式讲述卷积,并辅以图片解释,能快速理解卷积的实现原理。最后手写python代码实现卷积过程,让Tensorflow卷积在我们面前不再是黑箱子!注意:本文只针对batch_size=1,padding='SAME',stride=[1,1...
  • 卷积运算原理

    千次阅读 2019-12-26 22:08:56
    首先是垂直边缘检测,对左边一个6×6灰度图像进行卷积运算,中间3×3即为我们通常说核或者过滤器。从左边矩阵左上角开始,利用过滤器在该矩阵上进行计算,对应元素相乘后求和,得到一个数值,例如左上角第...
  • 卷积原理

    2020-03-03 22:59:10
    卷积原理 池化-特征降维 最大池化层 平均池化层 1X1卷积 池化是对每个feature map的卷积,没有对通道交互,1X1卷积对通道进行线性组合 对于单通道feature map和单个卷积核之间的卷积来说,题主理解...
  • Tensorflow卷积实现原理+手写python代码实现卷积

    万次阅读 多人点赞 2018-01-21 17:30:50
    本文以通俗易懂的方式讲述卷积,并辅以图片解释,能快速理解卷积的实现原理。最后手写python代码实现卷积过程,让Tensorflow卷积在我们面前不再是黑箱子! 注意: 本文只针对batch_size=1,padding='SAME',...
  • Caffe的卷积原理

    万次阅读 多人点赞 2016-03-03 10:11:34
    Caffe的卷积原理
  •  在深度学习的过程中,很多神经网络都会用到各种卷积核来进行操作,那么我们就简单讲一下卷积的原理和实现过程。 那么卷积在神经网络中的作用是什么呢?一开始的传统神经网络是没有卷积层的,都是隐藏层加生全连接...
  • 卷积神经网络概念与原理

    万次阅读 多人点赞 2016-09-05 10:00:27
    一、卷积神经网络基本概念 受Hubel和Wiesel对猫视觉皮层电生理研究启发,有人提出卷积神经网络(CNN),Yann Lecun 最早将CNN用于手写数字识别并一直保持了其在该问题霸主地位。近年来卷积神经网络在多个方向...
  • 这个就是普通的卷积计算原理,输入有3个通道,输出有2个通道,没加激活函数等。 如上图所示,输入有3个通道,输出有2个通道,也就是有2个卷积核(一个卷积核就是322)。对于每个卷积核,先在输入3个通道分别作卷积...
  • 盲去卷积原理及在图像复原应用

    万次阅读 多人点赞 2017-03-28 21:01:57
    盲去卷积的原理及在图像复原的应用
  • 5*5卷积的特征图尺寸: kernel=5*5,stride=1,padding=0 M=(64-5+2*0)/1+1=60 计算量:5*5*channels=25*channels 2个3*3卷积的特征图尺寸(这里指进行两次3*3卷积); kernel=3*3,stride=1,padding=0 第一...
  • caffe 卷积计算原理

    2016-11-03 22:07:15
    1.输入图像矩阵I(简单设为二维矩阵), ...将图像矩阵I转化为矩阵B(size = (k^2)*n),卷积核每次移动所截取I元素按行排列为B一列,B列数即为卷积核在图像上滑动次数。 (ps: n=((image_h + 2*pad_h –

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 4,727
精华内容 1,890
关键字:

卷积的原理