转置

一文看懂普通卷积、转置卷积以及空洞卷积

风格不统一 提交于 2019-12-17 18:56:59
一文看懂普通卷积、转置卷积以及空洞卷积 convolution、 transposed convolution、dilated convolution 本文希望尽量以图说话,简明扼要地分享干货。 首先是普通卷积,下图可能是一张比较经典的展示。其计算公式为: 其中f为kernel的尺寸,p为padding的大小,s为步长的大小。 2.接下来介绍转置卷积transposed convolution 又名逆卷积/deconvolution。 这里要sorry一下,忘记了之前是从哪个网页找的一张老外手写的图片。把转置卷积计算过程写的很清楚。把这个计算过程很直观的介绍给了我们,这样我们就不用再很迷茫地考虑什么转置过程啊,之类的。其计算公式:o=s(i−1)+k−2p 下图相当于把上图过程总结了下。 3. Dilated convolution空洞卷积 首先需要清除的是所谓dilated指的是对卷积核的操作。这样可以在参数数量不变的同时,具有更大的感受野。 假设原始特征为 feat0 ,首先使用扩张率为1的空洞卷积生成feat1,feat1上一点相对feat0感受野为3 3(如图a); 然后使用扩张率为2的空洞卷积处理 feat1 生成feat2(如图b),使第一次空洞卷积的卷积核大小等于第二次空洞卷积的一个像素点的感受野,图b即feat1上一个点综合了图a即feat0上3 3区域的信息

反卷积(Deconvolution)、上采样(UnSampling)与上池化(UnPooling)

无人久伴 提交于 2019-12-12 08:28:06
文章目录 前言 1. 图示理解 2. 概念详解 2.1 Upsampling(上采样) 2.2 Unpooling(上池化) 2.3 Deconvolution(反卷积) 2.4 FCN(U-net)中的low-level和high-level特征的融合 2.5 上采样/下采样 3.参考文献 前言 在看图像语义分割方面的论文时,发现在网络解码器结构中有的时候使用反卷积、而有的时候使用 unpooling 或或者 unsampling ,查了下资料,发现三者还是有不同的。这里记录一下。 1. 图示理解 使用三张图进行说明: 图(a)表示 UnPooling 的过程,特点是在 Maxpooling 的时候保留最大值的位置信息,之后在 unPooling 阶段使用该信息扩充 Feature Map ,除最大值位置以外,其余补0。与之相对的是图(b),两者的区别在于 UnSampling 阶段没有使用 MaxPooling 时的位置信息,而是直接将内容复制来扩充 Feature Map 。从图中即可看到两者结果的不同。图©为反卷积的过程,反卷积是卷积的逆过程,又称作转置卷积。最大的区别在于反卷积过程是有参数要进行学习的(类似卷积过程),理论是反卷积可以实现 UnPooling 和 unSampling ,只要卷积核的参数设置的合理。 反卷积与UnPooling的可视化

Python矩阵逆转与转置

本秂侑毒 提交于 2019-12-06 15:12:22
numpy实现 import numpy as np np.transpose([list]) # 矩阵转置 np.transpose([list]).tolist() # 矩阵转list >>> import numpy as np >>> np.transpose([[1, 2, 3], [1, 2, 3], [1, 2, 3]]) array([[1, 1, 1], [2, 2, 2], [3, 3, 3]]) >>> np.transpose([[1, 2, 3], [1, 2, 3], [1, 2, 3]]).tolist() [[1, 1, 1], [2, 2, 2], [3, 3, 3]] 矩阵转置 矩阵的转置就是从行变成列, 列变成行 用zip将一系列可迭代对象中的元素打包为元组,之后将这些元组放置在列表中,两步加起来等价于行列转置。 # 矩阵的转置 def transpose(list1): return [list(row) for row in zip(*list1)] list1 = [[1, 4], [2, 5], [3, 6]] print(transpose(list1)) # [[1, 2, 3], [4, 5, 6]] # 矩阵逆转 def invert(list1): return [row[::-1] for row in list1]

深度之眼PyTorch训练营第二期 ---7、nn网络层--卷积层

牧云@^-^@ 提交于 2019-12-03 22:43:10
   一、1d/2d/3d卷积 卷积运算: 卷积核在输入信号(图像)上滑动,相应位置上进行 乘加 卷积核: 又称为滤波器,过滤器,可认为是某种模式,某种特征。 卷积过程类似于用一个模板去图像上寻找与他相似的区域,与卷积核模式越相似,激活值越高,从而实现特征提取 AlexNet卷积核可视化,发现卷积核学习到的是 边缘 , 条纹 , 色彩 这一些细节模式 卷积维度: 一般情况下 ,卷积核在几个维度上滑动,就是几维卷积 二、卷积-nn.Conv2d nn.Conv2d 功能:对多个二维信号进行二维卷积 主要参数:   in_channels:输入通道数   out_channels:输出通道数,等价于卷积核个数   kernel_size:卷积核尺寸   stride:步长   padding:填充个数   dilation:空调卷积大小   groups:分组卷积设置   bias:偏置 尺寸计算:   简化版:   完整版: 三、转置卷积-nn.ConvTranspose 转置卷积又称反卷积和部分跨越卷积,用于对图像进行上采样。 为什么成为转置卷积?   正常卷积:假设图像尺寸为4*4,卷积核为3*3,padding=0,stride=1            图像:I 16*1 ,卷积核:K 16*4 ,输出:O 16*1 = K 16*4 * I 4*1   转置卷积

关于转置卷积(反卷积)的理解

*爱你&永不变心* 提交于 2019-12-03 14:20:14
转自 https://blog.csdn.net/isMarvellous/article/details/80087705 什么是转置卷积(反卷积)? 转置卷积(Transposed Convolution)又称为反卷积(Deconvolution)。在PyTorch中可以使用torch.nn.ConvTranspose2d()来调用,在Caffe中也有对应的层deconv_layer。 转置卷积常常用于CNN中对特征图进行上采样,比如语义分割和超分辨率任务中。之所以叫转置卷积是因为,它其实是把我们平时所用普通卷积操作中的卷积核做一个转置,然后把普通卷积的输出作为转置卷积的输入,而转置卷积的输出,就是普通卷积的输入。这样说可能有点绕,我们可以参照CNN中的反向传播过程来理解,转置卷积形式上就和一个卷积层的反向梯度计算相同。既然是输入输出对调,那么就有两个很重要的特性: 转置的卷积核变为了普通卷积核的转置; 如果把由输入特征图到输出特征图的计算过程画成一个计算图,那么输入输出元素的连接关系是不变的 关于第二点,也就是说,在普通卷积中,若元素a和元素1有连接(元素1由a计算得到),那么在相应的转置卷积中,元素1和元素a依然是有连接的(元素a由元素1计算得到)。 下面就基于此讨论一下我对转置卷积计算过程的一个理解。这并不是一个严格的推导,只是为了形象地帮助理解为什么要这样计算

关于cifar-10数据集读取问题

杀马特。学长 韩版系。学妹 提交于 2019-12-03 12:24:28
数据集下载后是特定格式,需要编写函数进行读取。读取后是dict格式,有4个键及其对应的若干值,如何准确读取并修改图像维度,使用reshape会发现数据错乱。 每个文件中数据存储格式为dict字典,键值为b’data’的为图片数据,是一个10000 * 3072(32 * 32 * 3)的numpy向量,10000表示图片张数,3072中前1024个表示Red通道数据,中间1024个表示Green通道数据,最后1024个表示Blue通道数据,数据范围是0-255,表示像素点灰度。键值为b’labels’表示对应的标签,是一个长度为10000的 list,数据范围是0-9,分别表示10个类别。 另外要说明的是卷积滤波器卷积的是32 * 32 * 3格式的数据,32 * 32代表图片一个通道格式,3表示RGB 3个通道,然而依据其数据表示格式,在 reshape 3072维度的向量的时候必须首先reshape成3 * 32 * 32格式的向量,否则会破坏图片原本格式,怎么办呢,转置!类似于矩阵的转置,三维向量也有转置,tensorflow提供transpose方法对三维向量作转置。 来源: CSDN 作者: 月夜22 链接: https://blog.csdn.net/weixin_41855385/article/details/84474721

Caffe中如何计算卷积

匿名 (未验证) 提交于 2019-12-03 00:37:01
1.caffe中通过构造两个矩阵实现: Caffe中的卷积计算是将卷积核矩阵和输入图像矩阵变换为两个大的矩阵A与B,然后A与B进行矩阵相乘得到结果C(利用GPU进行矩阵相乘的高效性),三个矩阵的说明如下: (1)在矩阵A中 M为卷积核个数,K=k*k,等于卷积核大小,即第一个矩阵每行为一个卷积核向量(是将二维的卷积核转化为一维),总共有M行,表示有M个卷积核。 (2)在矩阵B中 image_h:输入图像的高度 image_w:输入图像的宽度 pad_h:在输入图像的高度方向两边各增加pad_h个单位长度(因为有两边,所以乘以2) pad_w:在输入图像的宽度方向两边各增加pad_w个单位长度(因为有两边,所以乘以2) kernel_h:卷积核的高度 kernel_w:卷积核的宽度 stride_h:高度方向的滑动步长; stride_w:宽度方向的滑动步长。 因此,N为输出图像大小的长宽乘积,也是卷积核在输入图像上滑动可截取的最大特征数。 K=k*k,表示利用卷积核大小的框在输入图像上滑动所截取的数据大小,与卷积核大小一样大。 (3)在矩阵C中 矩阵C为矩阵A和矩阵B相乘的结果,得到一个M*N的矩阵,其中每行表示一个输出图像即feature map,共有M个输出图像(输出图像数目等于卷积核数目) (在Caffe中是使用src/caffe/util/im2col

caffe中的矩阵运算函数caffe_cpu_gemm,cblas_sgemm等解析

匿名 (未验证) 提交于 2019-12-03 00:22:01
caffe中最典型且常用的卷积运算,是通过将卷积操作转化成矩阵乘法来实现的,因此,卷积层的一系列程序实际上就是在为矩阵的卷积式展开和矩阵乘法函数做准备,caffe_cpu_gemm也就是在调用矩阵乘法函数cblas_sgemm。 1.矩阵间乘法: 这里我们先来看一下这些矩阵乘法函数有输入需求,以单精度矩阵乘法函数cblas_sgemm为例: cblas_sgemm(CblasRowMajor, CblasNoTrans, CblasNoTrans, M, N, K, alpha, A, A的列数, B, B的列数, beta, C, C的列数) 比如base_conv_layer.cpp中的forward_cpu_gemm: caffe_cpu_gemm<Dtype>(CblasNoTrans, CblasNoTrans, conv_out_channels_ /group_, conv_out_spatial_dim_, kernel_dim_, (Dtype)1. , weights + weight_offset_ * g , col_buff + col_offset_ * g , (Dtype)0. , output + output_offset_ * g ); caffe中caffe_cpu_gemm为: template<> void caffe_cpu_gemm

Numpy学习三:数组运算

匿名 (未验证) 提交于 2019-12-02 23:05:13
1、转置 # reshape (shape)函数改变数组形状,shape是一个元组,表示数组的形状 创建一个包含15个元素的一维数组,通过reshape函数调整数组形状为3行5列的二维数组 arr = np.arange(15). reshape ((3,5)) print(arr) #转置,数组转置可以使用 transpose 方法或者 T属性, 转置返回的是源数组的视图,不会进行任何复制操作 #将3行5列的二维数组arr转置为5行3列的二维数组 arr. transpose () #使用 T属性 实现转置 arr .T 2、算数运算 #注意:两个数组做算数法要求两个数组的结构要相同 #数组加法, 两个数组对应位置的元素相加 arr1 = np.array([[1,2,3],[4,5,6]]) arr2 = np.ones((2,3)) #2行3列的全1数组 arr1 + arr2 #相当于给数组arr1中的每个元素加1 #数组减法, 两个数组对应位置的元素相减 arr1 - arr2 #数组乘法, 两个数组对应位置的元素相乘 arr3 = np.array([[2,2,2],[2,2,2]]) arr1 * arr3 #使用tile函数构造数组 ,上一个arr3构造具有相同元素的数组非常麻烦,使用tile函数非常简洁 #第一个参数表示需要复制的数组