Pytorch:一维卷积及其伴随的定义

基础请移步:卷积的数学原理。

  一维卷积运算是信号处理和机器学习中常见的一种运算,它主要用于信号的特征提取和分析。在机器学习,特别是深度学习领域,一维卷积经常被用于处理时间序列数据、语音信号等。

  一维卷积的基本原理是:一个一维的输入信号(通常是一串数字)通过一个滤波器(或称为卷积核),滤波器在输入信号上滑动,每次滑动覆盖信号的一部分,然后将覆盖部分的元素与滤波器的对应元素相乘,并将乘积相加,从而得到输出信号的一个元素。这个过程重复进行,直到滤波器覆盖了输入信号的所有部分。

一、数学表达

如果输入信号为 x [ n ] x[n] x[n] ,卷积核为 h [ k ] h[k] h[k],那么输出 y [ n ] y[n] y[n] 可以用以下卷积公式表示:
y [ n ] = ∑ k = − ∞ ∞ x [ k ] ⋅ h [ n − k ] y[n] = \sum_{k=-\infty}^{\infty} x[k] \cdot h[n-k] y[n]=k=x[k]h[nk]
实际应用中, x [ n ] x[n] x[n] h [ k ] h[k] h[k] 都是有限长度的,所以求和也是在有限的范围内进行。

二、步长

  在卷积运算中,步长Stride)是一个重要的参数,它定义了卷积核在进行卷积操作时在输入信号上每次计算移动的间隔。步长决定了输出信号的尺寸以及卷积操作的覆盖范围和重叠程度

2.1、步长的作用
  1. 控制输出大小步长较大时,卷积核覆盖输入信号的速度更快,因此输出的尺寸会更小;步长较小则输出尺寸更大。 输出尺寸和卷积核大小以及步长有关
  2. 调节覆盖和重叠:步长较小意味着卷积核在信号上的滑动有更多的重叠,这可能会捕捉到更细微的特征,但也会增加计算量;较大的步长可能会遗漏一些特征,但计算更快,特别是对于大尺寸的输入信号。
2.2、步长的示例

考虑一个简单的一维卷积例子,假设我们有以下输入信号和卷积核:

  • 输入信号 x = [ 1 , 2 , 3 , 4 , 5 ] x = [1, 2, 3, 4, 5] x=[1,2,3,4,5]
  • 卷积核 h = [ − 1 , 0 , 1 ] h = [-1, 0, 1] h=[1,0,1]
步长为 1

当步长为 1 时,卷积核从输入信号的第一个元素开始,每次向右移动 1 个元素。计算每个位置的输出如下:

  • 第一个位置: 1 × 1 + 2 × 0 + 3 × − 1 = 1 − 3 = − 2 1 \times 1 + 2 \times 0 + 3 \times -1 = 1 - 3 = -2 1×1+2×0+3×1=13=2
  • 第二个位置: 2 × 1 + 3 × 0 + 4 × − 1 = 2 − 4 = − 2 2 \times 1 + 3 \times 0 + 4 \times -1 = 2 - 4 = -2 2×1+3×0+4×1=24=2
  • 第三个位置: 3 × 1 + 4 × 0 + 5 × − 1 = 3 − 5 = − 2 3 \times 1 + 4 \times 0 + 5 \times -1 = 3 - 5 = -2 3×1+4×0+5×1=35=2

输出信号为 [ − 2 , − 2 , − 2 ] [-2, -2, -2] [2,2,2]

步长为 2

当步长为 2 时,卷积核每次向右移动 2 个元素。计算每个位置的输出如下:

  • 第一个位置: 1 × 1 + 2 × 0 + 3 × − 1 = 1 − 3 = − 2 1 \times 1 + 2 \times 0 + 3 \times -1 = 1 - 3 = -2 1×1+2×0+3×1=13=2
  • 第二个位置: 3 × 1 + 4 × 0 + 5 × − 1 = 3 − 5 = − 2 3 \times 1 + 4 \times 0 + 5 \times -1 = 3 - 5 = -2 3×1+4×0+5×1=35=2

输出信号为 [ − 2 , − 2 ] [-2, -2] [2,2]

2.3、总结

步长的选择依赖于特定的应用需求和所需的输出尺寸。较小的步长可以提供更高的特征分辨率,但增加了计算成本;较大的步长则可以减少计算量和输出尺寸,但可能会牺牲一些特征的捕获。在设计卷积网络或处理信号时,合理选择步长是实现良好性能和效率的关键。

三、零填充

零填充Zero-padding)是在处理信号或图像时常用的一种技术,尤其是在执行卷积操作时。这种技术涉及在输入数据的边界周围添加额外的零值,具体可以是数据的开始、结束、或是两者。

3.1、零填充的作用:
  • 调整输出尺寸

    • 在不使用零填充的情况下,卷积操作通常会缩小输出的尺寸,因为卷积核可能无法完全覆盖输入数据的边缘部分。通过添加零填充,可以人为地扩大输入数据的尺寸,使得卷积核能够在输入的实际边缘也进行操作,从而保持输出数据的尺寸不变或按预定方式改变。
  • 提升边缘处理性能

    • 在许多情况下,数据的边缘包含重要信息。如果不使用零填充,这些信息在卷积过程中可能会被忽略或不足够重视,因为卷积核只能在数据的中间区域完全展开。零填充确保了边缘区域能够得到与中心区域相似的处理,从而允许网络更好地学习和利用这些边缘信息。
  • 保持空间一致性

    • 在特定的应用,如图像处理和特征检测中,保持输出的空间尺寸与输入一致是很重要的,因为这样可以保留位置信息,使得每个输出单元与输入数据中的相应位置对应。这对于进行图像分割、物体检测等任务尤其关键。
3.2、类型和大小

零填充可以有不同的类型和大小:

  • Valid Padding:不添加任何零,仅在原始数据内部进行卷积。这通常会缩小输出尺寸。
  • Same Padding:添加足够的零以使输出大小等于输入大小。这通常需要在输入数据的周围均匀添加零。
  • Full Padding:添加足够的零以让卷积核可以完全覆盖每个数据点,包括所有边缘。这会导致输出大小大于输入大小。

按照输出长度不同,卷积可分为三类:

  • 窄卷积
    • 使用这种卷积方式时,输出尺寸会小于输入尺寸。具体来说,如果输入大小是 n n n,卷积核大小是 k k k,则输出尺寸是 n − k + 1 n−k+1 nk+1
  • 宽卷积
    • 使用这种卷积方式时,输出尺寸会大于输入尺寸。具体来说,如果输入大小是 n n n,卷积核大小是 k k k,则输出尺寸是 n + k + 1 n+k+1 n+k+1
  • 等宽卷积:输出长度和输入长度相同。
3.3、 应用示例

假设我们有一个一维信号 [3, 1, 2, 5] 和一个卷积核 [1, 0, -1],且我们希望输出大小与输入相同。

  • 无填充:卷积操作将缩减输出长度。
  • 使用Same Padding:我们可以在序列开始和结束各添加一个零:[0, 3, 1, 2, 5, 0]。这样,卷积操作可以在每个原始数据点上进行,输出长度保持不变。

通过这种方式,零填充不仅可以控制输出尺寸,还可以影响模型学习到的特征类型,尤其是在处理边界区域时。这使得它在深度学习和信号处理中成为一项非常重要的技术。


下面将先介绍通道数、batch_size的含义。

四、通道数

在处理多维数据如图像、音频或其他形式的输入时,"通道数"这一概念非常关键。在深度学习和信号处理中,通道数通常指的是数据的一个特定维度,用来区分不同类型的信息。

4.1、通道数的定义
  • 对于图像数据,通道数可以是指颜色通道。例如,常见的彩色图像通常有三个颜色通道:红色、绿色和蓝色(RGB)。灰度图像只有一个通道。
  • 对于音频数据,通道数可以指立体声中的左右声道,单声道音频只有一个通道,而立体声音频有两个。
  • 在深度学习模型中,通道数还可以指特征映射的数量,这通常是在通过卷积网络的各层后产生的。例如,一层可能会生成多个特征映射,每个映射都可以视为一个独立的"通道"。
4.2、示例说明
  1. 图像示例
    • RGB 图像tensor([[[255, 0, 0], [0, 255, 0], [0, 0, 255]], ...])
      这里,最外层的维度可能有多个元素,每个元素代表一个像素的RGB值,所以这个图像的通道数是3。
    • 灰度图像tensor([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
      这里,整个数据只有一个颜色层次,因此是单通道图像。
      简单解释一下灰度图像是个啥:RGB图像中每个像素点对应于三个通道中的一个RGB值,而灰度图像中每个像素点对应于灰度图像单通道上的一个值,这个值是灰度值,0表示黑色,255/65535表示白色,在此之间的灰度值就是黑白的程度。
  2. 音频示例
    • 单声道音频tensor([0.1, 0.2, 0.3, ...])
      这个张量表示音频波形,且只有一个通道。
    • 立体声音频tensor([[0.1, 0.2], [0.1, 0.2], [0.1, 0.2], ...])
      这个张量中,每个内部数组包含两个元素,分别表示左声道和右声道的样本,因此是双通道音频。

由以上例子可以观察到,同一个维度的张量可能会有不同的通道数。数据的形状并不总能直接告诉我们哪一个维度是通道维度,特别是在处理高维数据时。 显式指明通道数有助于明确数据的组织方式,确保数据在处理过程中被正确解释。

4.3、深度学习中的应用

在使用例如PyTorch的深度学习框架中,数据的形状通常是 (batch_size, channels, ...其他维度...)。例如,一批大小为10的RGB图像可能具有形状 (10, 3, 224, 224),其中 3 表示RGB三个颜色通道。

通道数的概念在设计和训练神经网络模型时非常重要,因为不同的输入和处理层可能需要调整以适应不同的通道数,特别是在构建卷积神经网络时。

五、batch_size

在机器学习和深度学习中,batch_size是一个基本且重要的概念,它指的是每次迭代(每个训练步骤)中用于训练模型的数据样本数量batch_size 直接影响模型训练的效率、速度和稳定性,是超参数调整过程中的关键因素之一。

5.1、batch_size和数据形状

在构建深度学习模型时,输入数据通常需要具有固定的形状,以便模型可以正确地处理数据。数据形状中的batch_size通常是形状的第一个维度,表示每次传递给网络的样本数。

  • 例如
    • 假设处理的是图像数据,每张图像的大小为 28x28 像素,且是灰度图。如果你设置batch_size=64,那么每次喂给模型的数据形状将是 (64, 28, 28),其中 64 是批量大小,表示有 64 张图像。
    • 对于彩色图像,如果每张图像是 28x28 像素且有3个颜色通道,则数据形状将是 (64, 3, 28, 28),其中 64 依然是批量大小。
5.2、举例解释

我们在conv1d函数中,需要指定`batch_size``和通道数,我们举例来说明一下为什么。

import torch

# 设定 batch_size
batch_size = 4

# 创建一个随机数据张量来模拟批量图像输入
# 形状 [batch_size, channels, height, width]
# 这里 channels=1 表示灰度图像,height=width=28 对应于图像的尺寸
images = torch.randn(batch_size, 1, 28, 28)

通过上述代码,我们可以发现形状 [batch_size, channels, height, width],实际上表示的是一个4维张量。张量的最高维是batch_size,意义是:每个批次训练数据是一个batch_size数量的 三维张量[channels, height, width]

  1. 第一维度 (batch_size)

    • 这一维度表示每个批次包含的独立数据项(通常是图像)的数量。在训练过程中,这允许模型同时处理多个数据项,从而提高计算效率和优化梯度下降。
  2. 第二维度 (channels)

    • 对于图像数据,这一维度通常表示图像的颜色通道。例如,彩色图像的RGB通道会有三个通道(红、绿、蓝),灰度图像则只有一个通道。在更复杂的应用中,如多光谱成像或特定类型的数据特征图,通道数可以更多。
  3. 第三维度和第四维度 (heightwidth)

    • 这两个维度表示每个图像的空间维度,即图像的高度和宽度。

六、nn.Conv1d函数

由于这里只是一维卷积运算,而函数不得不指明batch_size和输入通道数导致问题复杂起来,所以为了方便,你只需要把它们都认为是1,照着最开始卷积计算时只需要看输入信号长度和卷积核长度去理解即可。

因为一维卷积只是一维向量的卷积,批次和通道并不是计算的本质。所以理解这里为什么是一维卷积却需要输入三维张量很关键的在于计算卷积的到底是什么。

在PyTorch中,使用nn.Conv1d计算一维卷积,其期望的输入是一个三维张量,具有以下维度:[batch_size, in_channels, input_length]。同样,卷积核也需要转换成合适的维度。一般来说,卷积操作期望输入信号和卷积核的维度满足这种规范。

  • batch_size表示一次输入的样本数量,通常情况下使用1。
  • in_channels表示输入信号的通道数。
  • input_length表示输入信号的长度。

可以使用张量的.view()方法,修改为指定张量维度,最后一个参数为-1,可以自动计算最后一个维度的大小,比如:

import torch
x=torch.tensor([[1,2,1],[3,4,1]])
x=x.view(1,2,-1)
print(x)
tensor([[[1, 2, 1],
         [3, 4, 1]]])
6.1、功能和使用

nn.Conv1d 用于执行一维输入数据的卷积操作,这是通过滑动一个或多个卷积核(filters)来实现的,卷积核在输入数据的一个维度上移动(通常是时间或空间),用于提取特征。

6.2、参数详解

以下是创建 nn.Conv1d 的主要初始化参数

  • in_channels (int):输入信号的通道数。例如,对于单声道音频,此值为1;对于立体声音频,此值为2。
  • out_channels (int):卷积产生的输出通道数。这等于卷积核的数量。
  • kernel_size (int 或 tuple):卷积核的大小。如果是整数,则所有卷积核将有相同的大小;如果是元组,则指定每个维度的大小。
  • stride (int 或 tuple, 可选):卷积时卷积核的移动步长。默认为1。
  • padding (int 或 tuple, 可选):输入数据两端添加的零的层数。用于控制输出的空间维度。默认为0(无填充)。
  • dilation (int 或 tuple, 可选):卷积核中元素之间的间距。这被用来实现扩张卷积(dilated convolution),有助于增加感受野。默认为1。
  • groups (int, 可选):将输入分组,每个组使用不同的卷积核。这有助于减少参数数量。默认为1,表示不分组。
  • bias (bool, 可选):是否添加偏置项(b)。默认为True。

之后输入输入信号,输出的输出信号的维度它们的batch_size是一样的,因此最高维相同。输出信号的通道数由你指定,输出信号的长度根据卷积核变换。

6.3、pytorch中的卷积核
  • 卷积核的具体数据可以自己指定,也可以默认随机初始化。以下说的是卷积核的形状,不过在实际训练的时候不太需要考虑。
  • 卷积核的通道数和输入信号的通道数相同
  • 卷积核的“数量”和输出信号的通道数相同,即“每一个”卷积核会对输入信号进行一次计算得到输出信号的一个通道。
  • 卷积核形状=[output_channel,input_channel,卷积核大小] (二维也是如此)
  • 注意这里卷积核最高维的意义并不是batch_size
  • 最终输出信号的每个通道的长度还是得看每个卷积计算了之后的长度,输出信号的通道数只是看卷了多少次
    • 输入batch_size == 输出batch_size,相当于一次需要计算多少批,这并不影响卷积计算,而只是指明有多个堆需要计算样本,每一堆是一个整体。
    • 输入通道数 == 卷积核通道数,相当于每次卷积计算约束的条件(一维卷积通道数为1)
    • 输入通道数 == 卷积核通道数,相当于每次卷积计算约束的条件(一维卷积通道数为1)
    • 输出通道数 ==卷积核个数,相当于每个卷积核卷积计算输入信号之后得到输出信号的一个通道。
    • 卷积核大小+步长+填充影响了每个通道输出信号的长度。
6.4、示例代码

下面是一个简单的示例,展示如何在PyTorch中使用 nn.Conv1d

import torch
import torch.nn as nn

# 创建输入数据:批大小为1,通道数为1,长度为10
input = torch.randn(1, 1, 10)

# 创建Conv1d层
# 输入通道数为1,输出通道数为16,卷积核大小为3,步长为2,无填充
conv1d = nn.Conv1d(in_channels=1, out_channels=16, kernel_size=3, stride=2)

# 应用卷积层到输入数据
output = conv1d(input)

print("Input shape:", input.shape)
print("Output shape:", output.shape)

这个例子创建了一个 nn.Conv1d 层,它接受一个长度为10的一维信号,使用16个长度为3的卷积核进行卷积,步长为2,没有填充。输出结果的形状将根据输入参数而变化,可以通过输出的形状看到经过卷积层处理后的结果的维度。
这里默认随机初始化的一维卷积核:

  • 16个卷积核:输出通道数
  • 长度为3:kernel_size=3
  • 卷积核通道数:in_channels
  • 卷积核形状:[out_channels,in_channels,kernel_size]

也可以指定nn.Conv1d.weight.data,来指定卷积核(数据,形状等等)。

相关推荐

  1. Pytorch及其伴随定义

    2024-04-13 14:06:04       16 阅读
  2. Pytorch:二及其伴随定义

    2024-04-13 14:06:04       40 阅读
  3. 利用pytorch实现形式ResNet

    2024-04-13 14:06:04       33 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-04-13 14:06:04       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-04-13 14:06:04       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-04-13 14:06:04       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-04-13 14:06:04       18 阅读

热门阅读

  1. Bilstm双向长短期神经网络多输入单输出回归分析

    2024-04-13 14:06:04       13 阅读
  2. C#:成绩等级转换

    2024-04-13 14:06:04       38 阅读
  3. 供应NVP6324芯片现货

    2024-04-13 14:06:04       17 阅读
  4. 区块链、web3.0、元宇宙的基本概念

    2024-04-13 14:06:04       32 阅读
  5. 基于单片机的激光测距系统设计

    2024-04-13 14:06:04       13 阅读
  6. GO语言协程调度原理和使用方法

    2024-04-13 14:06:04       17 阅读
  7. MybatisPlus——常见配置

    2024-04-13 14:06:04       14 阅读
  8. windows服务器应急溯源提取日志

    2024-04-13 14:06:04       13 阅读
  9. C#:求三个整数的最大值

    2024-04-13 14:06:04       14 阅读
  10. 什么是塔式服务器?

    2024-04-13 14:06:04       11 阅读
  11. vb.net textbox滚动显示到最后一行

    2024-04-13 14:06:04       12 阅读