keras中conv2d,conv2dTranspose的Padding详细介绍

本文深入探讨了Keras中conv2D与conv2DTranspose层的Padding参数使用,通过具体代码示例,详细解析了'valid'与'same'模式下输出形状的计算方式及填充策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

背景

conv2d和conv2dTranspose属于最常用的层,但在keras的实现中关于padding的部分有点模糊,周末趁着空闲做了一些尝试,来实验padding的valid和same参数在实际过程中如何操作的.

详细介绍

conv2D演示代码

conv2D部分

v_input = np.ones([1,5,5,1])
kernel = np.ones([3,3])
stride = 1
model = Sequential()
model.add(Conv2D(1, kernel_size=(3, 3),
                 activation='relu',
                 padding="valid" ,  # "same"
                 strides = 1, 
                 # dilation_rate = 1,
                 kernel_initializer = keras.initializers.Ones(),
                 input_shape=v_input.shape[1:]))

其中stride可以尝试多组测试
padding在valid 和 same 间切换测试

Conv2d演示结论

padding 为valid则不进行填充, 根据stride的滑动大小来做平移, 则:
output_shape = ceil( (input_shape - (kernel_size - 1)) / stride )
如果是same模式则 会进行左右上下的补齐, 其中左,上依次补齐 flood (kernel_size -1 ) / 2 , 右下补齐ceil (( kernel_size - 1) /2 ) ,补齐后进行的操作就是类似valid下的滑动卷积
output_shape = ceil (input_shape / stride)

ceil表示上取整 flood表示下取整

CONV2Dtranspose演示代码

v_input = np.ones([1,5,5,1])
kernel = np.ones([3,3])
stride = 1
model = Sequential()
model.add(Conv2DTranspose(1, kernel_size=(3, 3),
                 activation='relu',
                 padding="valid" ,  # "same"
                 strides = 1, 
                 # dilation_rate = 1,
                 kernel_initializer = keras.initializers.Ones(),
                 input_shape=v_input.shape[1:]))

如果padding的设置为valid则,保持最小相交的原则上下左右均填充kernel_size大小,如果stride设置为非1,起实际的作用和dilation_rate一样均是在矩阵中进行填充(实际滑动是永远都是1) 具体填充出来的矩阵大小是 (input_size -1) * stride + 1 + 2 * (kernel_size - 1)
之后就是按照这个矩阵做着类似conv2d valid的卷积 则:
output_shape = (input_size -1) * stride + 1 + 2 * (kernel_size - 1) - (kernel_size -1) = (input_size - 1) * stride + kernel_size
在这里插入图片描述
如果padding为same的话则output_shape = input_shape * stride
其中原始矩阵左上padding = ceil (( kernel_size ) /2 )  右下补齐 flood (( kernel_size ) /2 )  这里conv2d

Keras中,`Conv2D`的`padding`参数可以填写以下两个值之一: - `'valid'`:表示不填充,仅对每个位置的输入进行卷积计算。因此,输出的大小会比输入小,大小减少了卷积核的大小减去1。如果输入的形状为`(batch_size, height, width, channels)`,卷积核的形状为`(kernel_height, kernel_width, input_channels, output_channels)`,则输出的形状将是`(batch_size, new_height, new_width, output_channels)`,其中`new_height = height - kernel_height + 1`,`new_width = width - kernel_width + 1`。 - `'same'`:表示在输入的周围填充足够的0,使得卷积后的输出大小与输入大小相同。如果输入的形状为`(batch_size, height, width, channels)`,卷积核的形状为`(kernel_height, kernel_width, input_channels, output_channels)`,则填充的大小为: ``` pad_along_height = max((height - 1) * stride[0] + kernel_height - height, 0) pad_along_width = max((width - 1) * stride[1] + kernel_width - width, 0) total_vertical_padding = pad_along_height // 2 total_horizontal_padding = pad_along_width // 2 ``` 其中,`stride`表示卷积步长。使用`'same'`填充时,填充的大小可能是奇数或偶数。如果是奇数,则在右侧或下侧填充一个额外的0,以便填充后的大小与输入大小相同。填充后的输入形状为`(batch_size, height + total_vertical_padding * 2, width + total_horizontal_padding * 2, channels)`,卷积后的输出形状与输入相同,即为`(batch_size, height, width, output_channels)`。 除了`'valid'`和`'same'`之外,还可以自定义填充方式,这需要使用`ZeroPadding2D`层来实现自定义填充。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值