1. 函数定义
torch.nn.Conv1d
是 PyTorch 中用于一维卷积操作的类。定义如下:
官方文档:https://pytorch.ac.cn/docs/stable/generated/torch.nn.Conv1d.html#torch.nn.Conv1d
torch.nn.Conv1d(in_channels, out_channels, kernel_size, stride=1,padding=0, dilation=1, groups=1, bias=True, padding_mode='zeros',device=None, dtype=None
)
2. 计算原理
对由多个输入平面组成的输入信号应用一维卷积。在最简单的情况下,输入大小为 ( N , C in , L ) ( N, C_{\text{in}}, L ) (N,Cin,L)且输出大小为 ( N , C out , L out ) (N, C_{\text{out}}, L_{\text{out}}) (N,Cout,Lout) 的层的输出值可以精确地描述为:
out ( N i , C out j ) = bias ( C out j ) + ∑ k = 0 C in − 1 weight ( C out j , k ) ⋆ input ( N i , k ) \text{out}(N_i, C_{\text{out}_j}) = \text{bias}(C_{\text{out}_j}) + \sum_{k=0}^{C_{\text{in}} - 1} \text{weight}(C_{\text{out}_j}, k) \star \text{input}(N_i, k) out(Ni,Coutj)=bias(Coutj)+k=0∑Cin−1weight(Coutj,k)⋆input(Ni,k)
其中:
C out j C_{\text{out}_j} Coutj: 表示输出通道(output channel)的索引 j j j,它对应的是卷积操作中的第 j j j个通道输出。
⋆ ⋆ ⋆: 表示卷积
N N N:表示批次大小
C C C:表示通道数量
L L L:表示信号序列的长度
总结:
卷积层的输出是通过对输入张量与卷积核进行卷积计算,得到每个输出通道上的特征图。每个输出通道 C out j C_{\text{out}_j} Coutj对应一个卷积核,它与输入的每个通道进行卷积,并将这些结果加权求和后加上偏置,最终形成输出张量的每个值。
3. 参数说明
in_channels:
输入信号的通道数。
out_channels:
输出信号的通道数。
kernel_size:
卷积核的大小,可以是单个整数或整数元组。
stride:
步幅,控制卷积核在输入上移动的步长,默认为 1。
padding:
填充,控制应用于输入的填充量。它可以是字符串{‘valid’, ‘same’},也可以是元组,表示在两侧应用的隐式填充量。
dilation:
空洞卷积的膨胀系数,默认为 1。
groups:
控制输入和输出之间的连接方式,默认为 1,意味着每个输入通道都与每个输出通道相连。in_channels 和 out_channels 都必须能被 groups 整除
bias:
是否使用偏置项,默认为 True。
padding_mode:
填充模式,支持zeros’、‘reflect’、‘replicate’ 或 ‘circular’。默认值:‘zeros’
4. 关于groups参数详解:
在卷积神经网络中,groups 参数控制输入通道和输出通道之间的连接方式。它在分组卷积(Grouped Convolution)中尤为重要。以下是具体的解释:
1. 当 groups=1 时:
说明: 所有输入通道与所有输出通道进行卷积。也就是说,每个输入通道都与每个输出通道对应的卷积核进行卷积操作。这是标准的卷积操作,其中每个输入通道与所有输出通道之间都有连接。
举例: 如果 in_channels=4 和 out_channels=6,并且 groups=1,则每个输入通道都会与卷积核中的每个输出通道进行卷积操作,最终得到一个包含 6 个输出通道的输出
2. 当 groups=2 时:
说明: 卷积操作被分成两个组,每个组独立地处理一部分输入通道并产生一部分输出通道。具体来说,每个组的输入通道数量是 in_channels / groups,输出通道数量是 out_channels / groups。
举例: 如果 in_channels=4 和 out_channels=6,并且 groups=2,那么就会有两个卷积层,每个卷积层分别处理两个输入通道并生成三个输出通道。这两个卷积操作的结果会被拼接起来,最终得到 6 个输出通道。
第一个卷积层:输入通道 1 和 2,输出通道 1, 2, 3
第二个卷积层:输入通道 3 和 4,输出通道 4, 5, 6
输出:包含 6 个通道的输出
3. 当 groups = in_channels 时:
说明: 每个输入通道与其对应的卷积核集进行卷积,也就是说,每个输入通道都有一个独立的卷积操作,只与其自身的卷积核进行卷积。此时每个输入通道只会生成一个输出通道。
举例: 如果 in_channels=4 和 out_channels=4,并且 groups=4,每个输入通道将与其自己的卷积核进行卷积操作,最终得到一个 4 通道的输出:
输入通道 1 使用自己的卷积核得到输出通道 1
输入通道 2 使用自己的卷积核得到输出通道 2
输入通道 3 使用自己的卷积核得到输出通道 3
输入通道 4 使用自己的卷积核得到输出通道 4
注意:
当 groups == in_channels
且 out_channels == K * in_channels
(其中 K 是正整数)时,此操作也称为深度卷积
。
padding='valid'
等同于不填充。 padding='same'
对输入进行填充,以便输出具有与输入相同的形状。但是,此模式不支持除 1 之外的任何步长值。
5. 使用示例
自定义一个只有Conv1d
卷积层的网络:
import torch
from torch import nnclass Model(nn.Module):def __init__(self, in_channels, out_channels, kernal_size,*args, **kwargs):super().__init__(*args, **kwargs)self.conv1d = nn.Conv1d(in_channels, out_channels, kernal_size, padding=1)def forward(self, x):out = self.conv1d(x)return out