author:张一极
date:2023年03月27日22:48:02
Padding是卷积神经网络中常用的操作之一,它是为了解决卷积层输出维度小于输入维度的问题而设计的。
在卷积神经网络中,通过卷积运算可以获得图像或特征图的各种特征。在这个过程中,卷积层通常会采用一定的步长和滤波器的大小对输入数据进行滤波处理,得到一个新的特征图。但是,在卷积过程中,特征图的大小会随着滤波器大小和步长的改变而改变,因此,为了保证后续卷积层的输入数据维度一致,需要对特征图进行补充操作,这就是Padding。
Padding的目的是通过在图像边缘周围添加一定数量的像素值(0或其他值),来扩大特征图的大小。常见的Padding方式有两种:一种是zero padding,另一种是edge padding。
其中zero padding就是在图像边缘周围添加0,实现Padding的代码如下:
Matrix edge_padding(Matrix mid1, int shape1, int shape2)
{
Matrix result = CreateMatrix(shape1, shape2);
int mid1_rows = mid1.row;
int mid1_cols = mid1.col;
int top_pad = (shape1 - mid1_rows) / 2;
int bottom_pad = shape1 - mid1_rows - top_pad;
int left_pad = (shape2 - mid1_cols) / 2;
int right_pad = shape2 - mid1_cols - left_pad;
for (int i = 0; i < shape1; i++)
{
for (int j = 0; j < shape2; j++)
{
if (i < top_pad || i >= (mid1_rows + top_pad) || j < left_pad || j >= (mid1_cols + left_pad))
{
// Padding with "edge" or zero
result.matrix[i][j] = 0.0;
}
else
{
result.matrix[i][j] = mid1.matrix[i - top_pad][j - left_pad];
}
}
}
return result;
}
该函数实现了edge padding方式的Padding操作,输入参数mid1是原始矩阵,shape1和shape2是padding后矩阵的行和列数。函数中计算了输入矩阵和padding后矩阵的行和列数之差,根据差值计算出padding的行和列数,然后在原始矩阵周围添加对应的边缘值,最后返回padding后的矩阵。
xint padding_wid = stride - (mid1.wid - kernel_size) % stride;
if (padding_wid==stride){padding_wid = 0;}
int padding_high = stride - (mid1.high - kernel_size) % stride;
if (padding_high==stride){padding_high = 0;}
这段代码用来计算卷积操作中的 padding 大小,以保持卷积后输出的矩阵维度不变。具体来说,对于输入矩阵的宽和高,通过计算其与卷积核大小和步长的关系,来确定需要在矩阵的边缘上添加多少行和列的 padding。如果添加的 padding 大小刚好等于步长,则将 padding 大小设为 0。
S:步长stride
W:图像宽width
H:图像高 height
K:kernel 大小
If
if
以上