PyTorch 卷积层的使用

本文详细介绍了PyTorch中一维、二维和三维卷积层的结构、输入输出尺寸计算公式,以及卷积运算过程。重点展示了如何使用Conv1d、Conv2d和Conv3d类进行卷积操作,适合深度学习初学者和开发者参考。

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

PyTorch 卷积

1. 一维卷积层

卷积层输入:(N, C, L)
N: batch的样本数量
C: 样本的通道数
L: 样本通道的尺寸大小
⋆\star: 卷积运算

如果卷积层的输入尺寸为:(N, C_in, L_in),则输出尺寸 (N, C_out, L_out) 的计算为:
Lout=⌊Lin+2×padding−dilation×(kernel_size−1)−1stride+1⌋ L_{out} = \left\lfloor\frac{L_{in} + 2 \times \text{padding} - \text{dilation} \times (\text{kernel\_size} - 1) - 1}{\text{stride}} + 1\right\rfloor Lout=strideLin+2×paddingdilation×(kernel_size1)1+1
卷积层运算:
out(Ni,Coutj)=bias(Coutj)+∣∑k=0Cin−1weight(Coutj,k)∣⋆input(Ni,k) \text{out}(N_i, C_{\text{out}_j}) = \text{bias}(C_{\text{out}_j}) + | \sum_{k = 0}^{C_{in} - 1} \text{weight}(C_{\text{out}_j}, k) | \star \text{input}(N_i, k) out(Ni,Coutj)=bias(Coutj)+k=0Cin1weight(Coutj,k)input(Ni,k)

class Conv1d(_ConvNd):
    r"""
    一维卷积层
    
    Method resolution order:
        Conv1d
        _ConvNd
        torch.nn.modules.module.Module
        builtins.object
    """
    
    def __init__(
        self, 
        in_channels, 
        out_channels, 
        kernel_size, 
        stride=1, 
        padding=0, 
        dilation=1, 
        groups=1, 
        bias=True):
        r"""
        parameters:
            in_channels: int, 输入图片的通道数
            out_channels: int, 卷积生成的输出通道数
            kernel_size: int or tuple, 卷积核的大小
            stride: int or tuple, optional, 卷积的步幅
            padding: int or tuple, optional, 添加到输入边缘的填充
            dilation: int or tuple, optional, 核元素之间的间距
            groups: int, optional, 从输入通道到输出通道的blocked连接数
            bias: bool, optional, 如果为True,为输出添加一个可学习的bias
            
        attributes:
            weight: tensor, size(out_channels, in_channels/groups, kernel_size), 卷积的权重
            bias: tensor, size(out_channels), 卷积的偏置系数
        """
        ... ...
        
    def __call__(self, input, output):
        r"""
        parameters:
            input: size(N, C_in, L_in)
            output: size(N, C_out, L_out)
        """

2. 二维卷积层

卷积层输入:(N, C, H, W)
N: batch的样本数量
C: 样本的通道数
H: 输入样本的高(像素单位)
W:输入样本的宽(像素单位)
⋆\star: 卷积运算

如果卷积层的输入尺寸为:(N, C_in, H_in, W_in),则输出尺寸 (N, C_out, H_out, W_out) 的计算为:
Hout=⌊Hin+2×padding[0]−dilation[0]×(kernel_size[0]−1)−1stride[0]+1⌋ H_{out} = \left\lfloor\frac{H_{in} + 2 \times \text{padding}[0] - \text{dilation}[0] \times (\text{kernel\_size}[0] - 1) - 1}{\text{stride}[0]} + 1\right\rfloor Hout=stride[0]Hin+2×padding[0]dilation[0]×(kernel_size[0]1)1+1
Wout=⌊Win+2×padding[1]−dilation[1]×(kernel_size[1]−1)−1stride[1]+1⌋ W_{out} = \left\lfloor\frac{W_{in} + 2 \times \text{padding}[1] - \text{dilation}[1] \times (\text{kernel\_size}[1] - 1) - 1}{\text{stride}[1]} + 1\right\rfloor Wout=stride[1]Win+2×padding[1]dilation[1]×(kernel_size[1]1)1+1
卷积层运算:
out(Ni,Coutj)=bias(Coutj)+∑k=0Cin−1weight(Coutj,k)⋆input(Ni,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=0Cin1weight(Coutj,k)input(Ni,k)

class Conv2d(_ConvNd):
    r"""
    二维卷积层
    
    Method resolution order:
        Conv2d
        _ConvNd
        torch.nn.modules.module.Module
        builtins.object
    """
    
    def __init__(
        self, 
        in_channels, 
        out_channels, 
        kernel_size, 
        stride=1, 
        padding=0, 
        dilation=1, 
        groups=1, 
        bias=True):
        r"""
        parameters:
            in_channels: int, 输入图片的通道数
            out_channels: int, 卷积生成的输出通道数
            kernel_size: int or tuple, 卷积核的大小
            stride: int or tuple, optional, 卷积的步幅
            padding: int or tuple, optional, 添加到输入边缘的填充
            dilation: int or tuple, optional, 核元素之间的间距
            groups: int, optional, 从输入通道到输出通道的blocked连接数
            bias: bool, optional, 如果为True,为输出添加一个可学习的bias
            
        attributes:
            weight: tensor, size(out_channels, in_channels/groups, kernel_size), 卷积的权重
            bias: tensor, size(out_channels), 卷积的偏置系数
        """
        ... ...
        
    def __call__(self, input, output):
        r"""
        parameters:
            input: size(N, C_in, H_in, W_in)
            output: size(N, C_out, H_out, W_out)
        """

3. 三维卷积层

卷积层输入:(N, C, D, H, W)
N: batch的样本数量
C: 样本的通道数
D: 输入样本的深度
H: 输入样本的高(像素单位)
W:输入样本的宽(像素单位)
⋆\star: 卷积运算

如果卷积层的输入尺寸为:(N, C_in, D_in, H_in, W_in),则输出尺寸 (N, C_out, D_out, H_out, W_out) 的计算为:
Dout=⌊Din+2×padding[0]−dilation[0]×(kernel_size[0]−1)−1stride[0]+1⌋ D_{out} = \left\lfloor\frac{D_{in} + 2 \times \text{padding}[0] - \text{dilation}[0] \times (\text{kernel\_size}[0] - 1) - 1}{\text{stride}[0]} + 1\right\rfloor Dout=stride[0]Din+2×padding[0]dilation[0]×(kernel_size[0]1)1+1
Hout=⌊Hin+2×padding[1]−dilation[1]×(kernel_size[1]−1)−1stride[1]+1⌋ H_{out} = \left\lfloor\frac{H_{in} + 2 \times \text{padding}[1] - \text{dilation}[1] \times (\text{kernel\_size}[1] - 1) - 1}{\text{stride}[1]} + 1\right\rfloor Hout=stride[1]Hin+2×padding[1]dilation[1]×(kernel_size[1]1)1+1
Wout=⌊Win+2×padding[2]−dilation[2]×(kernel_size[2]−1)−1stride[2]+1⌋ W_{out} = \left\lfloor\frac{W_{in} + 2 \times \text{padding}[2] - \text{dilation}[2] \times (\text{kernel\_size}[2] - 1) - 1}{\text{stride}[2]} + 1\right\rfloor Wout=stride[2]Win+2×padding[2]dilation[2]×(kernel_size[2]1)1+1
卷积层运算:
out(Ni,Coutj)=bias(Coutj)+∑k=0Cin−1weight(Coutj,k)⋆input(Ni,k) out(N_i, C_{out_j}) = bias(C_{out_j}) + \sum_{k = 0}^{C_{in} - 1} weight(C_{out_j}, k) \star input(N_i, k) out(Ni,Coutj)=bias(Coutj)+k=0Cin1weight(Coutj,k)input(Ni,k)

class Conv3d(_ConvNd):
    r"""
    三维卷积层
    
    Method resolution order:
        Conv3d
        _ConvNd
        torch.nn.modules.module.Module
        builtins.object
    """
    
    def __init__(
        self, 
        in_channels, 
        out_channels, 
        kernel_size, 
        stride=1, 
        padding=0, 
        dilation=1, 
        groups=1, 
        bias=True):
        r"""
        parameters:
            in_channels: int, 输入图片的通道数
            out_channels: int, 卷积生成的输出通道数
            kernel_size: int or tuple, 卷积核的大小
            stride: int or tuple, optional, 卷积的步幅
            padding: int or tuple, optional, 添加到输入边缘的填充
            dilation: int or tuple, optional, 核元素之间的间距
            groups: int, optional, 从输入通道到输出通道的blocked连接数
            bias: bool, optional, 如果为True,为输出添加一个可学习的bias
            
        attributes:
            weight: tensor, size(out_channels, in_channels/groups, kernel_size), 卷积的权重
            bias: tensor, size(out_channels), 卷积的偏置系数
        """
        ... ...
        
    def __call__(self, input, output):
        r"""
        parameters:
            input: size(N, C_in, D_in, H_in, W_in)
            output: size(N, C_out, D_out, H_out, W_out)
        """

PyTorch中的卷积层是神经网络中常用的一种层类型,用于处理图像和其他多维数据。卷积层通过对输入数据进行卷积操作来提取特征,并生成输出特征图。卷积操作是指将一个滤波器(也称为卷积核)与输入数据进行逐元素相乘,并将结果相加得到输出特征图的过程。[1] 在PyTorch中,卷积层的相关参数包括输入通道数、输出通道数、卷积核大小、步长和边缘填充等。输入通道数指的是输入数据的通道数,例如RGB图像的通道数为3。输出通道数指的是卷积层输出的特征图的通道数,通常可以理解为卷积核的个数。卷积核大小指的是卷积核的尺寸,例如3x3的卷积核。步长指的是卷积操作在输入数据上滑动的步长,用于控制输出特征图的尺寸。边缘填充是指在输入数据的边缘周围填充额外的像素,以保持输出特征图的尺寸与输入数据相同。[2] 在使用PyTorch卷积层时,可以通过定义一个继承自`nn.Module`的神经网络类,并在其中定义卷积层的相关参数来创建卷积层。例如,可以使用`nn.Conv2d`类来定义一个二维卷积层,并指定输入通道数、输出通道数、卷积核大小、步长和边缘填充等参数。然后,在神经网络的前向传播方法中,可以通过调用卷积层的`forward`方法来进行卷积操作,并返回输出特征图。[3] 总结起来,PyTorch中的卷积层是用于处理图像和其他多维数据的一种神经网络层类型。它通过卷积操作来提取特征,并生成输出特征图。在使用PyTorch卷积层时,需要定义相关参数,并在神经网络的前向传播方法中调用卷积层进行卷积操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值