本文共 3192 字,大约阅读时间需要 10 分钟。
在卷积神经网络(CNN)中,为了避免卷积运算导致的输出图像缩小以及图像边缘信息丢失,开发者通常采用图像边缘填充技术。这种技术的核心在于在图像的四周边缘填充0,从而确保卷积运算后图像尺寸不会发生变化,同时保留边缘和角落的信息。在Python中,numpy库提供了一个强大的工具 --- 序列操作库numpy,特别是numpy.pad()函数,可以用来实现图像的边缘填充。
numpy.pad()是一种极其强大的工具,常用于数据预处理,特别是在深度学习中。它可以将numpy数组按照指定的模式充填到指定的形状。这种填充操作对于图片数据的预处理特别重要,因为它能够确保图片数据在卷积运算前后尺寸保持一致。
numpy.pad()的函数调用语法如下:
ndarray = numpy.pad(array, pad_width, mode, **kwargs)
根据不同的填充需求,numpy.pad() 提供了11种填充模式:
让我们通过一维数组的填充操作来理解不同填充模式的效果:
import numpy as nparr1D = np.array([1, 1, 2, 2, 3, 3, 4, 4])"""不同填充模式"""print('constant: ', np.pad(arr1D, (1, 2), 'constant'))print('edge: ', np.pad(arr1D, (1, 2), 'edge'))print('linear_ramp: ', np.pad(arr1D, (1, 2), 'linear_ramp'))print('maximum: ', np.pad(arr1D, (1, 2), 'maximum'))print('mean: ', np.pad(arr1D, (1, 2), 'mean'))print('median: ', np.pad(arr1D, (1, 2), 'median'))print('minimum: ', np.pad(arr1D, (1, 2), 'minimum'))print('reflect: ', np.pad(arr1D, (1, 2), 'reflect'))print('symmetric: ', np.pad(arr1D, (1, 2), 'symmetric'))print('wrap: ', np.pad(arr1D, (1, 2), 'wrap')) 对于多维数组,填充操作的实现方式与一维数组类似,不过需要指定每个维度的填充宽度和填充模式:
import numpy as nparr3D = np.array([[[1, 1, 2, 2, 3, 4], [1, 1, 2, 2, 3, 4], [1, 1, 2, 2, 3, 4]], [[0, 1, 2, 3, 4, 5], [0, 1, 2, 3, 4, 5], [0, 1, 2, 3, 4, 5]], [[1, 1, 2, 2, 3, 4], [1, 1, 2, 2, 3, 4], [1, 1, 2, 2, 3, 4]]])"""不同填充模式"""print('constant: \n' + str(np.pad(arr3D, ((0, 0), (1, 1), (2, 2)), 'constant')))print('edge: \n' + str(np.pad(arr3D, ((0, 0), (1, 1), (2, 2)), 'edge')))print('linear_ramp: \n' + str(np.pad(arr3D, ((0, 0), (1, 1), (2, 2)), 'linear_ramp')))print('maximum: \n' + str(np.pad(arr3D, ((0, 0), (1, 1), (2, 2)), 'maximum')))print('mean: \n' + str(np.pad(arr3D, ((0, 0), (1, 1), (2, 2)), 'mean')))print('median: \n' + str(np.pad(arr3D, ((0, 0), (1, 1), (2, 2)), 'median')))print('minimum: \n' + str(np.pad(arr3D, ((0, 0), (1, 1), (2, 2)), 'minimum')))print('reflect: \n' + str(np.pad(arr3D, ((0, 0), (1, 1), (2, 2)), 'reflect')))print('symmetric: \n' + str(np.pad(arr3D, ((0, 0), (1, 1), (2, 2)), 'symmetric')))print('wrap: \n' + str(np.pad(arr3D, ((0, 0), (1, 1), (2, 2)), 'wrap'))) constant填充模式是在数组边缘填充相同的常数值,默认填充0。多维数组的填充值可以在各维度上单独指定。在以下示例中,我们可以看到constant填充模式在不同维度上的实际效果。
constant:[ [0 0 0 0 0 0 0 0 0 0] [0 0 1 1 2 2 3 3 0 0] [0 0 1 1 2 2 3 3 0 0] [0 0 1 1 2 2 3 3 0 0] [0 0 0 0 0 0 0 0 0 0]]
对于多维数组,复合填充值的使用可以自定义不同维度的填充值。在以下示例中,每行前后填充不同的常数值:
arr2D = np.array([[1, 1], [2, 2]])ndarray = np.pad(arr2D, ((1,1), (2,2)), 'constant', constant_values=(0, 3))
运行以上代码后,我们可以看到不同的填充模式在实际操作中的表现。
转载地址:http://omfvz.baihongyu.com/