在卷积神经网络中,为了避免因为卷积运算导致输出图像缩小和图像边缘信息丢失,常常采用图像边缘填充技术,即在图像四周边缘填充0,使得卷积运算后图像大小不会缩小,同时也不会丢失边缘和角落的信息。在Python的numpy库中,常常采用numpy.pad()进行填充操作,具体分析如下:
1. np.pad()函数
1)语法结构
pad(array, pad_width, mode, **kwargs)
返回值:数组
2)参数解释
array——表示需要填充的数组;
pad_width——表示每个轴(axis)边缘需要填充的数值数目。
参数输入方式为:((before_1, after_1), … (before_N, after_N)),其中(before_1, after_1)表示第1轴两边缘分别填充before_1个和after_1个数值。取值为:{sequence, array_like, int}
mode——表示填充的方式(取值:str字符串或用户提供的函数),总共有11种填充模式;
3) 填充方式
‘constant’——表示连续填充相同的值,每个轴可以分别指定填充值,constant_values=(x, y)时前面用x填充,后面用y填充,缺省值填充0
‘edge’——表示用边缘值填充
‘linear_ramp’——表示用边缘递减的方式填充
‘maximum’——表示最大值填充
‘mean’——表示均值填充
‘median’——表示中位数填充
‘minimum’——表示最小值填充
‘reflect’——表示对称填充
‘symmetric’——表示对称填充
‘wrap’——表示用原数组后面的值填充前面,前面的值填充后面
import numpy as np
1.1 常数填充模式——’constant’
在卷积神经网络中,通常采用constant填充方式!!
A = np.arange(95,99).reshape(2,2)
A
array([[95, 96],
[97, 98]])
1.1.1 用例1
np.pad(A,((3,2),(2,3)),'constant',constant_values = (0,0))
array([[ 0, 0, 0, 0, 0, 0, 0],
[ 0, 0, 0, 0, 0, 0, 0],
[ 0, 0, 0, 0, 0, 0, 0],
[ 0, 0, 95, 96, 0, 0, 0],
[ 0, 0, 97, 98, 0, 0, 0],
[ 0, 0, 0, 0, 0, 0, 0],
[ 0, 0, 0, 0, 0, 0, 0]])
np.pad(A,((3,2),(2,3)),'constant',constant_values = (-2,2))
array([[-2, -2, -2, -2, 2, 2, 2],
[-2, -2, -2, -2, 2, 2, 2],
[-2, -2, -2, -2, 2, 2, 2],
[-2, -2, 95, 96, 2, 2, 2],
[-2, -2, 97, 98, 2, 2, 2],
[-2, -2, 2, 2, 2, 2, 2],
[-2, -2, 2, 2, 2, 2, 2]])
np.pad(A,((3,2),(2,3)),'constant',constant_values = ((0,0),(1,2)))
array([[ 1, 1, 0, 0, 2, 2, 2],
[ 1, 1, 0, 0, 2, 2, 2],
[ 1, 1, 0, 0, 2, 2, 2],
[ 1, 1, 95, 96, 2, 2, 2],
[ 1, 1, 97, 98, 2, 2, 2],
[ 1, 1, 0, 0, 2, 2, 2],
[ 1, 1, 0, 0, 2, 2, 2]])
np.pad(A,((3,2),(2,3)),'constant')
array([[ 0, 0, 0, 0, 0, 0, 0],
[ 0, 0, 0, 0, 0, 0, 0],
[ 0, 0, 0, 0, 0, 0, 0],
[ 0, 0, 95, 96, 0, 0, 0],
[ 0, 0, 97, 98, 0, 0, 0],
[ 0, 0, 0, 0, 0, 0, 0],
[ 0, 0, 0, 0, 0, 0, 0]])
1.2 边缘值填充模式——’edge’
B = np.arange(1,5).reshape(2,2)
B
array([[1, 2],
[3, 4]])
np.pad(B,((1,2),(2,1)),'edge')
array([[1, 1, 1, 2, 2],
[1, 1, 1, 2, 2],
[3, 3, 3, 4, 4],
[3, 3, 3, 4, 4],
[3, 3, 3, 4, 4]])
1.3 边缘最大值填充模式——’maximum’
B = np.arange(1,5).reshape(2,2)
B
array([[1, 2],
[3, 4]])
np.pad(B,((1,2),(2,1)),'maximum')
array([[4, 4, 3, 4, 4],
[2, 2, 1, 2, 2],
[4, 4, 3, 4, 4],
[4, 4, 3, 4, 4],
[4, 4, 3, 4, 4]])
C = np.arange(0,9).reshape(3,3)
C
array([[0, 1, 2],
[3, 4, 5],
[6, 7, 8]])
np.pad(C,((3,2),(2,1)),'maximum')
array([[8, 8, 6, 7, 8, 8],
[8, 8, 6, 7, 8, 8],
[8, 8, 6, 7, 8, 8],
[2, 2, 0, 1, 2, 2],
[5, 5, 3, 4, 5, 5],
[8, 8, 6, 7, 8, 8],
[8, 8, 6, 7, 8, 8],
[8, 8, 6, 7, 8, 8]])
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)