-
深度之眼Pytorch打卡(十六):Pytorch卷积神经网络部件——池化、反池化与其他层
2020-08-18 12:53:07前面两篇笔记写了卷积神经网络的两个部件,即卷积层与反卷积层,这篇笔记写池化层与反池化层。池化是一种很重要的下采样方法,它像水池一样汇集一个小区域加粗样式内的值,并总结浓缩成一个值输出,常用的有最大...前言
前面两篇笔记写了卷积神经网络的两个部件,即卷积层与反卷积层,这篇笔记写池化层与反池化层。池化是一种很重要的下采样方法,它像水池一样汇集一个小区域内的值,并总结浓缩成一个值输出,常用的有最大池化
Maxpooling
——选择最大值输出,和平均池化Avepooling
——取平均值作为输出。反池化,是一种和转置卷积类似的上采样方法,在分割任务中会用到。分组卷积是一种使模型轻量化的方法,本笔记也将浅浅的记录。本笔记的知识框架主要来源于深度之眼,并依此作了内容的丰富拓展,拓展内容主要源自对torch文档的翻译,对孙玉林等著的PyTorch深度学习入门与实战的参考和自己的粗浅理解,所用数据来源于网络。发现有人在其他平台照搬笔者笔记,不仅不注明出处,有甚者更将其作为收费文章,因此笔者将在文中任意位置插入识别标志。笔记是笔者根据自己理解一字一字打上去的,还要到处找合适的图片,有时为了便于理解还要修图,原创不易,转载请注明出处,文中笔者哪怕是引图也注明了出处的
结果可视化见:深度之眼Pytorch打卡(十):Pytorch数据预处理——数据统一与数据增强(上)
卷积操作见:深度之眼Pytorch打卡(十四):Pytorch卷积神经网络部件——卷积操作与卷积层、转置卷积操作与转置卷积层(反卷积)(对卷积转置卷积细致动图分析)
转置卷积操作见:深度之眼Pytorch打卡(十五):Pytorch卷积神经网络部件——转置卷积操作与转置卷积层(对转置卷积操作全网最细致分析,转置卷积的stride与padding,转置与反卷积名称论证)
池化与池化层
池化(pooling)是一种下采样方法,其能在保持数据空间特征的同时减少数据大小1,进而减少冗余信息,降低训练时的运算量。最常用的主要包括最大池化和平均池化,即对区域内的值进行总结的方法是取最大值和取平均值。池化没有参数,故一般不算入卷积神经网络层数,它常常放在连续的卷积操作中间,卷积-池化-卷积-池化是较为典型的结构。
最大池化:
用区域内的最大值(响应)来代表该区域的所有值(响应),移位过程有点像卷积,但它是非线性运算,并且相邻两次移动到的区域一般不重叠,即
stride=kernel_size
,操作过程如图1所示,其摘自国外的文章:Convolution Neural Network。kernel_size=2,stride=2
是最常用的池化超参数。图1.Maxpooling过程 平均池化:
用区域内的平均值(响应)来代表该区域的所有值(响应),操作过程如图2所示,其摘自国外的文章:Convolution Neural Network。平均池化是线性运算。
图2.Avgpooling过程 最大池化层:
Pytorch的最大池化层有三个,即nn.MaxPool1d()、nn.MaxPool2d()、nn.MaxPool2d()。这里只单独学习最最常用的
nn.MaxPool2d()
,其他的都类似或者相同。CLASS torch.nn.MaxPool2d(kernel_size: Union[int, Tuple[int, ...]], stride: Union[int, Tuple[int, ...], None] = None, padding: Union[int, Tuple[int, ...]] = 0, dilation: Union[int, Tuple[int, ...]] = 1, return_indices: bool = False, ceil_mode: bool = False) # (CSDN意疏原创笔记:https://blog.csdn.net/sinat_35907936/article/details/107833112)
return_indices: 如果为
True
,该函数类除了返回池化结果外,还会返回输入中每个最大值所在位置的索引(indices
)。 在用MaxUnpool2d
做上采样(反池化)时需要该参数。ceil_mode: 输出尺寸取整方式,默认向下取整(
floor
),当ceil_mode
为True
时向上取整。如输入尺寸5x5,取stride=2,kernel_size=2
,则默认情况下输出尺寸为2x2
,ceil_mode
为True
时输出尺寸为3x3
。平均池化层:
Pytorch的平均池化层也有三个,即nn.AvgPool1d()、nn.AvgPool2d()、nn.AvgPool2d()。这里也只单独学习最最常用的
nn.AvgPool2d()
,其他的都类似或者相同。CLASS torch.nn.AvgPool2d(kernel_size: Union[int, Tuple[int, int]], stride: Union[int, Tuple[int, int], None] = None, padding: Union[int, Tuple[int, int]] = 0, ceil_mode: bool = False, count_include_pad: bool = True, divisor_override: bool = None) #(CSDN意疏原创笔记:https://blog.csdn.net/sinat_35907936/article/details/107833112)
count_include_pad: 计算均值时是否把padding的像素值算在内。
divisor_override: 除法因子更改,如果设置了该值,则在求均值时不再除以kernel
覆盖的像素个数,而是除以该值。池化层使用
代码:
transform_inverse()
函数定义见此文,池化过程不改变通道数。import torch from PIL import Image import torch.nn as nn import matplotlib.pyplot as plt import torchvision.transforms as transforms from tools.transform_inverse import transform_inverse MaxPool_layer = nn.MaxPool2d((2, 2), 2) AvgPool_layer = nn.AvgPool2d((2, 2), 2) # 4个元素,除法因子应该为4,此处改为8,输出会黯淡一倍 AvgPool_layer1 = nn.AvgPool2d((2, 2), 2, divisor_override=8) pil_img = Image.open('data/lenna.jpg').convert('RGB') img = transforms.ToTensor()(pil_img) print(img.size()) c = img.size()[0] h = img.size()[1] w = img.size()[2] img = torch.reshape(img, [1, c, h, w]) MaxPool_out = MaxPool_layer(img) AvgPool_out = AvgPool_layer(img) AvgPool_out1 = AvgPool_layer1(img) MaxPool_out = torch.squeeze(MaxPool_out) AvgPool_out = torch.squeeze(AvgPool_out) AvgPool_out1 = torch.squeeze(AvgPool_out1) print(MaxPool_out.size()) MaxPool_pil = transform_inverse(MaxPool_out, None) AvgPool_pil = transform_inverse(AvgPool_out, None) AvgPool_pil1 = transform_inverse(AvgPool_out1, None) plt.figure(0) ax = plt.subplot(2, 2, 1) ax.set_title('input img') ax.imshow(pil_img) ax = plt.subplot(2, 2, 2) ax.set_title('MaxPool_out img') ax.imshow(MaxPool_pil) ax = plt.subplot(2, 2, 3) ax.set_title('Avgpool_out img') ax.imshow(AvgPool_pil) ax = plt.subplot(2, 2, 4) ax.set_title('AvgPool_out with divisor_override=8') ax.imshow(AvgPool_pil1) plt.show() #(CSDN意疏原创笔记:https://blog.csdn.net/sinat_35907936/article/details/107833112)
结果:用
kernel_size = 2,stride = 2
的池化层,可以将输入尺寸缩减一半,但是大部分的信息都没有丢失,如图3所示。所以池化操作可以减少冗余,进而减小后续的计算量。平均池化,可以通过修改除法因子来修改池化结果,除法因子是根据实际情况的需要的修改的,一般保持默认值。torch.Size([3, 440, 440]) torch.Size([3, 220, 220])
图3.最大池化与平均池化作用结果
反池化与反池化层
反池化是一种上采样技术,常用在图像分割任务中。如图4,就是反池化在经典的编码-解码图像分割网络中,与转置卷积共同作用,进行上采样的图示,图源。
图4.反池化在图像分割任务中的应用 最大池化的反池化。在进行最大池化时,记录下输入的最大值所在位置的索引。在进行反池化时,将输入值根据其所在位置分别放到索引指示的地方,其他位置补零,流程如图5所示,图源。可以看出,两者是一个对称的过程,即池化输入尺寸等于反池化输出尺寸,池化输出尺寸等于反池化输入尺寸,正是应为这样,索引才能对应上。
图5.最大池化与最大反池化过程 CLASS torch.nn.MaxUnpool2d(kernel_size: Union[int, Tuple[int, int]], stride: Union[int, Tuple[int, int], None] = None, padding: Union[int, Tuple[int, int]] = 0)
stride: 笔者觉得官方文档的解释有问题,以下是笔者理解:输入的一个元素在输出中对应区域的宽高,如
stride=2
,则表示MaxUnpool2d
输入的一个元素,在输出中对应2*2
的一个区域。一般取stride=kernel_size
。
padding: 笔者觉得官方文档的解释有问题,以下是笔者理解:输入计算尺寸被缩减的值。如输入尺寸是3*3
,若padding=1
,则表示输入计算尺寸被缩减到(3-1)*(3-1)
,即2*2
,若此时stride=2
,则可得输出尺寸是4*4
。因为并且索引必须与输入同尺寸,即3*3
,所以最后输出就是4*4的张量中有9个点有值,其他均为零。如下代码所示。代码:
import torch import torch.nn as nn MaxUnpool_layer = nn.MaxUnpool2d((2, 2), 2, padding=0) MaxUnpool_layer1 = nn.MaxUnpool2d((2, 2), 2, padding=1) In = torch.randn(1, 1, 3, 3) print(In) idx = torch.tensor([[0, 5, 3], [8, 6, 11], [12, 13, 14]]) # 4*4的张量被拉成一维张量后的序号 print(idx) idx = torch.reshape(idx, [1, 1, 3, 3]) MaxunPool_out = MaxUnpool_layer(In, indices=idx) MaxunPool_out1 = MaxUnpool_layer1(In, indices=idx) print(MaxunPool_out) print(MaxunPool_out1)
结果:
# input tensor([[[[ 2.0394, -0.0362, 0.0612], [-0.3057, -0.3779, 0.2984], [-0.4500, 1.2419, 0.1124]]]]) # indices tensor([[ 0, 5, 3], [ 8, 6, 11], [12, 13, 14]]) # padding=0,输出6*6的张量 tensor([[[[ 2.0394, 0.0000, 0.0000, 0.0612, 0.0000, -0.0362], [-0.3779, 0.0000, -0.3057, 0.0000, 0.0000, 0.2984], [-0.4500, 1.2419, 0.1124, 0.0000, 0.0000, 0.0000], [ 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000], [ 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000], [ 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000]]]]) # padding=1,输出4*4的张量 tensor([[[[ 2.0394, 0.0000, 0.0000, 0.0612], [ 0.0000, -0.0362, -0.3779, 0.0000], [-0.3057, 0.0000, 0.0000, 0.2984], [-0.4500, 1.2419, 0.1124, 0.0000]]]])
MaxPool
与MaxUnPool
配合使用,此时MaxUnPool
不要用Padding,否则会报如下错误:RuntimeError: Found an invalid max index。MaxPool_out, idx1 = MaxPool_layer(In) MaxunPool_out = MaxUnpool_layer(MaxPool_out, indices=idx1)
其他层
很多非线性激活函数在这篇笔记中已经梳理,此处不赘述。
参考
https://yjjo.tistory.com/8 ↩︎
-
Pytorch池化层、线性层、激活函数层
2020-02-05 21:49:16层池化层最大池化、平均池化pytorch实现池化(下采样)最大池化平均池化pytorch实现反池化(上采样)最大值反池化线性层激活函数层sigmoidtanhrelu 池化层 最大池化、平均池化 pytorch实现池化(下采样) 最大池化 ...池化层
最大池化、平均池化
pytorch实现池化(下采样)
最大池化
冗余信息剔除、减小运算量平均池化
相对于最大池池化的图像亮度较小pytorch实现反池化(上采样)
最大值反池化
img_reconstruct = torch.randn_like(img_pool, dtype=torch.float) maxunpool_layer = nn.MaxUnpool2d((2, 2), stride=(2, 2)) img_unpool = maxunpool_layer(img_reconstruct, indices)
线性层
激活函数层
非线性变换
sigmoid
tanh
relu
-
演示反池化的操作
2018-05-13 16:46:50对于最大池化层,也不支持输出最大激活值得位置,但是同样有个池化的反向传播函数tf.nn.max_pool_with_argmax()。该函数可以找出位置,需要开发者利用这个函数做一些改动,自己封装一个最大池化操作,然后再根据mask...TensorFlow中目前还没有反池化操作的函数。对于最大池化层,也不支持输出最大激活值得位置,但是同样有个池化的反向传播函数tf.nn.max_pool_with_argmax()。该函数可以找出位置,需要开发者利用这个函数做一些改动,自己封装一个最大池化操作,然后再根据mask写出反池化函数。def max_pool_with_argmax(net,stride): ''' 重定义一个最大池化函数,返回最大池化结果以及每个最大值的位置(是个索引,形状和池化结果一致) args: net:输入数据 形状为[batch,in_height,in_width,in_channels] stride:步长,是一个int32类型,注意在最大池化操作中我们设置窗口大小和步长大小是一样的 ''' #使用mask保存每个最大值的位置 这个函数只支持GPU操作 _, mask = tf.nn.max_pool_with_argmax( net,ksize=[1, stride, stride, 1], strides=[1, stride, stride, 1],padding='SAME') #将反向传播的mask梯度计算停止 mask = tf.stop_gradient(mask) #计算最大池化操作 net = tf.nn.max_pool(net, ksize=[1, stride, stride, 1],strides=[1, stride, stride, 1], padding='SAME') #将池化结果和mask返回 return net,mask def un_max_pool(net,mask,stride): ''' 定义一个反最大池化的函数,找到mask最大的索引,将max的值填到指定位置 args: net:最大池化后的输出,形状为[batch, height, width, in_channels] mask:位置索引组数组,形状和net一样 stride:步长,是一个int32类型,这里就是max_pool_with_argmax传入的stride参数 ''' ksize = [1, stride, stride, 1] input_shape = net.get_shape().as_list() # calculation new shape output_shape = (input_shape[0], input_shape[1] * ksize[1], input_shape[2] * ksize[2], input_shape[3]) # calculation indices for batch, height, width and feature maps one_like_mask = tf.ones_like(mask) batch_range = tf.reshape(tf.range(output_shape[0], dtype=tf.int64), shape=[input_shape[0], 1, 1, 1]) b = one_like_mask * batch_range y = mask // (output_shape[2] * output_shape[3]) x = mask % (output_shape[2] * output_shape[3]) // output_shape[3] feature_range = tf.range(output_shape[3], dtype=tf.int64) f = one_like_mask * feature_range # transpose indices & reshape update values to one dimension updates_size = tf.size(net) indices = tf.transpose(tf.reshape(tf.stack([b, y, x, f]), [4, updates_size])) values = tf.reshape(net, [updates_size]) ret = tf.scatter_nd(indices, values, output_shape) return ret #定义一个形状为4x4x2的张量 img = tf.constant([ [[0.0,4.0],[0.0,4.0],[0.0,4.0],[0.0,4.0]], [[1.0,5.0],[1.0,5.0],[1.0,5.0],[1.0,5.0]], [[2.0,6.0],[2.0,6.0],[2.0,6.0],[2.0,6.0]], [[3.0,7.0],[3.0,7.0],[3.0,7.0],[3.0,7.0]], ]) img = tf.reshape(img,[1,4,4,2]) #最大池化操作 pooling1 = tf.nn.max_pool(img,ksize=[1,2,2,1],strides=[1,2,2,1],padding='SAME') #带有最大值位置的最大池化操作 pooling2,mask = max_pool_with_argmax(img,2) #反最大池化 img2 = un_max_pool(pooling2,mask,2) with tf.Session() as sess: print('image:') image = sess.run(img) print(image) #默认的最大池化输出 result = sess.run(pooling1) print('max_pool:\n',result) #带有最大值位置的最大池化输出 result,mask2 = sess.run([pooling2,mask]) print('max_pool_with_argmax:\n',result,mask2) #反最大池化输出 result = sess.run(img2) print('un_max_pool',result)
这里我们自己定义了两个函数,一个是带有最大值位置的最大池化函数,一个反最大池化函数,程序运行后,我们应该可以看到自己定义的最大池化与原来的版本输出是一样的,由于tf.nn.max_pool_with_argmax()函数只支持GPU操作,不能在CPU机器上运行,所以我没法运行这段程序。mask的值是将整个数组flat后的索引,并保持与池化结果一致的shape。参考 -
卷积层 池化层 反卷积 上池化 扩展卷积 门卷积
2020-04-05 23:13:10文章目录卷积层定义特点池化层特点上采样反卷积/转置卷积 卷积层 定义 首先需要了解图像是个什么东西? 通道 常用于表示图像的某种组成。一个标准数字相机拍摄的图像会有三通道 - 红、绿和蓝;你可以把它们看作是...文章目录
卷积层
定义
首先需要了解图像是个什么东西?
通道 常用于表示图像的某种组成。一个标准数字相机拍摄的图像会有三通道 - 红、绿和蓝;你可以把它们看作是互相堆叠在一起的二维矩阵(每一个通道代表一个颜色),每个通道的像素值在 0 到 255 的范围内。
灰度图像,仅仅只有一个通道。在本篇文章中,我们仅考虑灰度图像,这样我们就只有一个二维的矩阵来表示图像。矩阵中各个像素的值在 0 到 255 的范围内——零表示黑色,255 表示白色。卷积的主要目的是为了从输入图像中提取特征。卷积可以通过从输入的一小块数据中学到图像的特征,并可以保留像素间的空间关系。我在这里并不会详细讲解卷积的数学细节,因为我也不会,但我会试着理解卷积是如何处理图像的。
每张图像都可以看作是像素值的矩阵。考虑一下一个 5 x 5 的图像,它的像素值仅为 0 或者 1(注意对于灰度图像而言,像素值的范围是 0 到 255,下面像素值为 0 和 1 的绿色矩阵仅为特例):
那还有一个 3 x 3 的矩阵,如下所示:
他们结合在了一起,得到了如下的结果,操作的方式可以理解成每个黄色的值都和绿色的值相乘,结果相加:
在 CNN 的术语中,3x3 的矩阵叫做“滤波器(filter)”或者“核(kernel)”或者“特征检测器(feature detector)”,通过在图像上滑动滤波器并计算点乘得到矩阵叫做“卷积特征(Convolved Feature)”或者“激活图(Activation Map)”或者“特征图(Feature Map)”。记住滤波器在原始输入图像上的作用是特征检测器。
特点
- 局部感知:人的大脑识别图片的过程中,并不是一下子整张图同时识别,而是对于图片中的每一个特征首先局部感知,然后更高层次对局部进行综合操作,从而得到全局信息。第一层卷积层可能只能提取一些低级的特征如边缘、线条和角等层级,更多层的网络能从低级特征中迭代提取更复杂的特征。
- 参数共享
五个小朋友对应五个神经元,也叫filter,每个小盆友视野有限,每次只看一小块,慢慢滑动直到看完,那么左图中的小块叫感受野(receptive field)。
每个小朋友看完一张图得到一张图,五个人得出五张,即depth是5,即神经元个数。
小盆友1视野很小,每个感受野对应一些参数,假设为w1w2w3w4,每滑动一次,另一个感受野又对应四个w,因为每个小朋友都有自己处事原则(不管看什么,参数不变),所以一个小盆友只要学习四个参数。一幅图只要4*5=20个参数。
池化层
池化(Pooling)是卷积神经网络中另一个重要的概念,它实际上是一种形式的降采样。有多种不同形式的非线性池化函数,而其中“最大池化(Max pooling)”是最为常见的。它是将输入的图像划分为若干个矩形区域,对每个子区域输出最大值。直觉上,这种机制能够有效地原因在于,在发现一个特征之后,它的精确位置远不及它和其他特征的相对位置的关系重要。池化层会不断地减小数据的空间大小,因此参数的数量和计算量也会下降,这在一定程度上也控制了过拟合。通常来说,CNN的卷积层之间都会周期性地插入池化层。
特点
- 特征不变形:池化操作是模型更加关注是否存在某些特征而不是特征具体的位置。
- 特征降维:池化相当于在空间范围内做了维度约减,从而使模型可以抽取更加广范围的特征。同时减小了下一层的输入大小,进而减少计算量和参数个数。
- 在一定程度上防止过拟合,更方便优化。
上采样
在应用在计算机视觉的深度学习领域,由于输入图像通过卷积神经网络(CNN)提取特征后,输出的尺寸往往会变小,而有时我们需要将图像恢复到原来的尺寸以便进行进一步的计算(e.g.:图像的语义分割),这个采用扩大图像尺寸,实现图像由小分辨率到大分辨率的映射的操作,叫做上采样(Upsample)。
上采样有3种常见的方法:双线性插值(bilinear),反卷积(Transposed Convolution),反池化(Unpooling)。反卷积/转置卷积
反卷积也被称为转置卷积,反卷积其实就是卷积的逆过程。大家可能对于反卷积的认识有一个误区,以为通过反卷积就可以获取到经过卷积之前的图片,实际上通过反卷积操作并不能还原出卷积之前的图片,只能还原出卷积之前图片的尺寸。
http://www.360doc.com/content/19/0507/12/57110788_834069126.shtml上采样
池化也叫下采样(down-sampling), 操作与普通卷积基本相同, 不过根据取最大值或平均值可分为最大池化和平均池化, 同时无反向传播过程(无需学习参数).
上池化保留位置信息补0, 上采样不保留位置信息直接复制. 但二者均无反向传播过程(无需学习参数), 也就是对中间地带不采取过渡值只是简单处理.
- 图(a)表示上池化UnPooling的过程,特点是在池化Maxpooling的时候保留最大值的位置信息,之后在上池化UnPooling阶段使用该信息扩充Feature Map,除最大值位置以外,其余补0。
- 与之相对的是图(b),两者的区别在于上采样UnSampling阶段没有使用MaxPooling时的位置信息,而是直接将内容复制来扩充Feature Map。从图中即可看到两者结果的不同。
- 图(c)为反卷积的过程,反卷积是卷积的逆过程,又称作转置卷积(Transposed Convolution)。最大的区别在于反卷积过程是有参数要进行学习的(类似卷积过程),而上池化和上采样是无反向传播过程的. 理论上反卷积可以实现UnPooling和unSampling,只要卷积核的参数设置的合理。
扩展卷积 dilated convolution
区别
扩张卷积和普通卷积的区别在于,卷积核的大小是一样的,在神经网络中即参数数量不变,区别在于扩张卷积具有更大的感受野。感受野是卷积核在图像上看到的大小。
相比原来的标准卷积,扩张卷积(dilated convolution) 多了一个hyper-parameter(超参数)称之为dilation rate(扩张率),指的是kernel各点之前的间隔数量,正常的convolution 的 dilatation rate为 1。
(a)图对应3x3的1-dilated conv,和普通的卷积操作一样。(b)图对应3x3的2-dilated conv,实际的卷积kernel size还是3x3,但是空洞为1,需要注意的是空洞的位置全填进去0,填入0之后再卷积即可。
比如上图中(a),dilated=1,F(dilated) = 3×3;图(b)中,dilated=2,F(dilated)=7×7;图(c)中,dilated=4, F(dilated)=15×15。
dilated=2时具体的操作,即按照下图在空洞位置填入0之后,然后直接卷积就可以了。
空洞卷积的动态过程
上图是一个扩张率为2的3×3卷积核,感受野与5×5的卷积核相同,而且仅需要9个参数。你可以把它想象成一个5×5的卷积核,每隔一行或一列删除一行或一列。
在相同的计算条件下,空洞卷积提供了更大的感受野。空洞卷积经常用在实时图像分割中。当网络层需要较大的感受野,但计算资源有限而无法提高卷积核数量或大小时,可以考虑空洞卷积。Dilated Convolution感受野指数级增长
对于标准卷积核情况,比如用3×3卷积核连续卷积2次,在第3层中得到1个Feature点,那么第3层这个Feature点换算回第1层覆盖了多少个Feature点呢?
第一层的一个5×5大小的区域经过2次3×3的标准卷积之后,变成了一个点。也就是说从size上来讲,2层33卷积转换相当于1层55卷积。即,一个5×5的卷积核是可以由2次连续的3×3的卷积代替。
但对于dilated=2,3*3的扩张卷积核呢?
可以看到第一层13×13的区域,经过2次3×3的扩张卷积之后,变成了一个点。即从size上来讲,连续2层的3×3空洞卷积转换相当于1层13×13卷积Gated Convolution
Why
- vanilla convolution(普通卷积)认为所有通道的输入像素都是有效的,但gated convolution可以通过对每个channel应用参数可学的特征选择机制,将所有层响应空间位置的像素融合到一起,达到对partial convolution(部分卷积)进行泛化的目的。
- 针对规则的矩形mask设计出来的GANs无法处理free-form masks,已经有文章论证了vanilla convolution无法解决free-form image inpainting任务。
How
partial conv可以被认为是hard-gating single-channel un-learnable layer再跟input feature map逐像素点乘。
gated conv抛弃通过固定规则进行更新的hard mask,而是从数据中自动学习soft mask,公式如下:
其中,σsigmaσ表示对0~1的output gating values使用sigmoid激活函数,ϕ可以是任意激活函数(ReLU or LeakyReLU) -
深度学习(一)神经网络中的池化与反池化原理
2018-09-03 16:13:00原文作者:aircraft 原文链接:https://www.cnblogs.com/DOMLX/p/9579108.html ... 一.... 大家学过神经网络的都知道,在神经网络中有一层是pooling层也就是池化层,通过池化对特征进行提取并且... -
深度篇—— CNN 卷积神经网络(二) 细说 池化(pooling) 与 反池化(unpooling)
2020-02-09 21:29:30返回主目录 返回 CNN 卷积神经网络目录 上一章:深度篇—— CNN 卷积神经网络(一)细说 cnn 卷积神经...本小节,细说 池化 与 反池化,下一小节细说 关于 ROI 与 插值 二. 池化层 (pooling layer) 1. 池化... -
PyTorch框架学习十——基础网络层(卷积、转置卷积、池化、反池化、线性、激活函数)
2020-08-16 15:43:04PyTorch框架学习十——基础网络层(卷积、转置卷积、池化、线性、激活函数)一、卷积层二、转置卷积层三、池化层 上次笔记介绍了PyTorch中如何进行网络搭建,是从宏观上来学习,这次笔记介绍一个网络内部的具体网络... -
[深度学习] 池化层
2018-07-15 22:17:50池化层的输入一般来源于上一个卷积层,主要的作用是提供了很强的鲁棒性。(例如max-pooling是取一小块区域中的最大值,此时若此区域中的其他值略有变化,或者图像稍有平移,pooling后...池化层一般没有参数,所以反... -
【深度之眼】【Pytorch打卡第6天】:学习网络层中的卷积层,池化层,全连接层和激活函数层
2020-07-14 11:56:34任务名称:学习网络层中的卷积层,池化层,全连接层和激活函数层 ...本节第二部分学习池化层,全连接层和激活函数层,在池化层中有正常的最大值池化,均值池化,还有图像分割任务中常用的反池化——M -
【深度之眼PyTorch框架班第五期】作业打卡09:学习网络层中的卷积层,池化层,全连接层和激活函数层
2020-08-07 22:58:06任务名称:学习网络层中的卷积层,池化层,全连接层和激活函数层 ...本节第二部分学习池化层,全连接层和激活函数层,在池化层中有正常的最大值池化,均值池化,还有图像分割任务中常用的反池化——MaxUn