作者:diy2099_d94639 | 来源:互联网 | 2023-10-10 21:39
Padding的值Padding是指在向量的每一维前后填充一定大小的边界,其常用于在卷积和池化这种具有“滤波”窗口的运算中,以调整输出大小、防止个别数据的丢弃需要注意的是,Padd
Padding的值
Padding是指在向量的每一维前后填充一定大小的边界,其常用于在卷积和池化这种具有“滤波”窗口的运算中,以调整输出大小、防止个别数据的丢弃
需要注意的是,Padding并不是真的在向量的前后填充了值,而只是标记了padding的位置
卷积和池化在计算时,会先确定滤波窗口的位置,窗口中如果包含了padding,则padding部分并不参与计算
举一个例子来说明这样处理的合理性
假设在做最大池化,向量的形状如上图,末尾有一padding
如果padding有具体的值,比如说0,则这个窗口的输出就为0,padding的值影响了输出的结果,而舍弃了源数据,这与paddding运算的目的相悖
如果padding的值是一个非常小的值,假设是负无穷,在上面的情形下看似不影响结果,但是无法适用于更多的情况,比如卷积,比如平均池化。所以padding不参与计算也有利于实现上的解耦,显然也更节省内存
Padding模式
Padding运算作用于输入向量的每一维,每一维的操作都是一致的,所以理解Padding的操作,只需要理解一维向量的padding过程
假设一个一维向量,输入形状为input_size,经过滤波操作后的输出形状为output_size,滤波窗口为filter_size,需要padding的个数为padding_needed,滤波窗口滑动步长为stride,则之间满足关系:
为了兼容两种框架,需要根据配置对padding的策略进行调整
下面解释CUDNN如何调整padding分配的策略
以池化举例,CUDNN池化kernel的参数有:
handle
Input. Handle to a previously created cuDNN context.
poolingDesc
Input. Handle to a previously initialized pooling descriptor.
alpha, beta
Input. Pointers to scaling factors (in host memory) used to blend the computation result with prior value in the output layer as follows: dstValue = alpha[0]*result + beta[0]*priorDstValue. Please refer to this section for additional details.
xDesc
Input. Handle to the previously initialized input tensor descriptor.
x
Input. Data pointer to GPU memory associated with the tensor descriptor xDesc.
yDesc
Input. Handle to the previously initialized output tensor descriptor.
y
Output. Data pointer to GPU memory associated with the output tensor descriptor yDesc.
CUDNN首先需要先制定输入形状和输出形状,xDesc指定了输入向量的形状,ydesc指定了输出向量的形状
然后CUDNN又通过poolingdesc指定了每一维padding_before的值
所以根据公式可以自然推导padding_after的值