卷积网络(conv)中步长、填充、卷积核大小与输入输出大小的关系

目录

1、stride =1

1)没有padding :o = (i - k) + 1

2)有padding

半填充:输入输出一样大 o = i(卷积核是基数)

全填充 :o = i + (k - 1)

2、stride ≠1:  o = [( i + 2p -k) / s] + 1

1)没有padding 

2)有padding 

3、统一的公式:o = [( i + 2p - k) / s] + 1


在设计深度学习网络的时候,需要计算输入尺寸和输出尺寸,那么就要设计卷积层的的各种参数。这里有一些设计时候的计算公式,方便得到各层的参数。

具体可以参考这篇文章:A guide to convolution arithmetic for deep learning

这里简化下,约定:

  • i:输入尺寸input
  • o:输出output
  • s:步长sride、
  • p:填充padding(一般都是零)
  • k:卷积核(kernel)大小

先按照步长来区分,然后按照padding区分

1、stride =1

1)没有padding :o = (i - k) + 1

2)有padding

统一公式

  • 半填充:输入输出一样大 o = i(卷积核是基数)

也就是说,padding的大小是kernel的“小”一半,5*5的核半填充padding就是5/2 = 2.5 = 2(向下取整),让原图像边缘当填充后卷积图像的中心

这里要注意的是2p实际是不等于k的,实际是2p = 2n ≠ 2n+1,所以,上式不等于i+1

  • 全填充 :o = i + (k - 1)

也就是说,padding的大小是kernel-1

2、stride ≠1:  o = [( i + 2p -k) / s] + 1

1)没有padding 

2)有padding 

3、统一的公式:o = [( i + 2p - k) / s] + 1

### 关于Conv1d中卷积核大小的含义及用法 #### 一、PyTorch中的`Conv1d` 在PyTorch中,`Conv1d`用于处理一维数据(通常是时间序列或信号)。其核心参数之一是卷积核大小(kernel size),它决定了滑动窗口的宽度。 - **卷积核大小的意义** `kernel_size`定义了卷积操作所覆盖的时间步长数量。例如,在语音信号或NLP任务中,如果`kernel_size=3`,则每次卷积会作用于连续三个输入单元[^1]。 - **参数设置计算逻辑** 假设输入张量形状为 `[batch_size, channels_in, length_in]`,其中: - `channels_in`: 输入通道数; - `length_in`: 时间维度长度。 如果设定`kernel_size=k`,那么输出长度可以通过以下公式计算得出: \[ \text{output\_length} = \left\lfloor \frac{\text{input\_length} + 2 \times \text{padding} - (\text{dilation} \times (\text{kernel\_size} - 1) + 1)}{\text{stride}} \right\rfloor + 1 \] 这里的`padding`, `stride`, `dilation` 是其他重要参数,分别控制填充方式、步幅以及膨胀率[^4]。 - **代码示例** 下面是一个简单的例子展示如何使用`Conv1d`并调整卷积核大小的影响: ```python import torch import torch.nn as nn # 定义模型 conv_layer = nn.Conv1d(in_channels=1, out_channels=1, kernel_size=3, stride=1, padding=0) # 创建随机输入 (批量大小为1,单个通道,长度为5) input_tensor = torch.tensor([[[1., 2., 3., 4., 5.]]]) # 执行前向传播 output_tensor = conv_layer(input_tensor) print(output_tensor.shape) # 输出应为 [1, 1, 3] ``` --- #### 二、TensorFlow/Keras中的`Conv1D` 在TensorFlow/Keras中,`Conv1D`同样适用于一维数据。它的行为类似于PyTorch中的`Conv1d`,但在某些细节上有所不同。 - **卷积核大小的意义** 类似地,`kernel_size`表示卷积窗沿时间轴移动的距离。然而需要注意的是,默认情况下TensorFlow会对整个批次应用卷积运算,并且支持额外的选项如“depth_multiplier”,该参数允许扩展深度可分离卷积的效果[^2]。 - **参数设置计算逻辑** TensorFlow遵循类似的尺寸变换规则,但具体实现可能会因框架内部差异略有不同。例如,当指定`strides=2`时,每两次采样才执行一次卷积;而`padding='same'`可以保持输出输入具有相同的长度。 - **代码示例** 下列片段展示了如何配置一个基本的一维卷积层及其运行效果: ```python from tensorflow.keras.layers import Conv1D import numpy as np # 初始化卷积conv_layer_tf = Conv1D(filters=1, kernel_size=3, strides=1, padding="valid", depth_multiplier=1) # 构造测试输入 input_data = np.array([[range(1, 6)]], dtype=np.float32).transpose() # 计算结果 result = conv_layer_tf(input_data[np.newaxis,...]) # 添加批处理维度 print(result.numpy().shape) # 应打印出 (1, 3, 1) ``` --- #### 总结对比 尽管两者都提供了灵活的方式来定制化卷积过程,但仍存在细微差别需注意。比如,PyTorch倾向于更直观的操作接口设计,而TensorFlow通过引入更多高级特性增强了灵活性[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值