本文共 3336 字,大约阅读时间需要 11 分钟。
一维卷积(nn.Conv1d)是一种专门用于处理序列数据的卷积层,常用于自然语言处理任务。它的核心作用是对输入序列进行局部感受,提取序列中的特征信息。与二维卷积(如nn.Conv2d)不同,一维卷积仅在时间或序列的维度上进行卷积操作,而不改变空间维度。
nn.Conv1d的定义如下:
class torch.nn.Conv1d(in_channels, out_channels, kernel_size, stride=1, padding=0, dilation=1, groups=1, bias=True)
主要参数包括:
kernel_size决定。假设输入数据为批量大小32,句子最大长度35,词向量维度为256,目标是进行句子分类,类别数为2。以下是一个典型的使用示例:
import torchimport torch.nn as nnconv1 = nn.Conv1d(in_channels=256, out_channels=100, kernel_size=2)input = torch.randn(32, 35, 256) # 输入形状:(batch_size, max_length, in_channels)input = input.permute(0, 2, 1) # 调整维度顺序,使其为 (batch_size, in_channels, max_length)output = conv1(input) # 输出形状:(batch_size, out_channels, max_length - kernel_size + 1)
需要注意的是,permute(0, 2, 1)操作是为了将时间维度移动到第二个位置,使其与卷积操作的顺序一致。这样可以确保卷积核在正确的维度上滑动。
如果需要使用多个卷积核,可以通过nn.ModuleList和循环来实现。例如:
import torchimport torch.nn as nnwindow_sizes = [2, 3, 4]convs = nn.ModuleList([ nn.Sequential( nn.Conv1d(in_channels=8, out_channels=4, kernel_size=h), nn.ReLU() ) for h in window_sizes])embed = torch.randn(2, 16, 8) # 输入形状:(batch_size, seq_length, in_channels)embed = embed.transpose(1, 2) # 调整维度顺序为 (batch_size, in_channels, seq_length)output = [conv(embed) for conv in convs]# 输出形状为:[(2, 4, 15), (2, 4, 14), (2, 4, 13)]for x in output: print(x.size())
一维卷积广泛应用于自然语言处理任务中,尤其是需要捕捉序列局部关系的场景。例如:
二维卷积(nn.Conv2d)是一种经典的卷积层,主要用于处理二维图像数据。它同时沿着高度和宽度方向进行卷积操作,通常用于图像分类、目标检测等任务。
nn.Conv2d的定义如下:
class torch.nn.Conv2d(in_channels, out_channels, kernel_size, stride=1, padding=0, dilation=1, groups=1, bias=True)
主要参数包括:
假设输入数据为一个32x32的图片,通道数为1(灰度图像),类别数为10。以下是一个简单的卷积层网络结构:
class CNN(nn.Module): def __init__(self): super().__init__() self.conv1 = nn.Conv2d(in_channels=1, out_channels=6, kernel_size=5) self.conv2 = nn.Conv2d(in_channels=6, out_channels=16, kernel_size=5) self.fc1 = nn.Linear(5 * 5 * 16, 120) self.fc2 = nn.Linear(120, 84) self.fc3 = nn.Linear(84, 10) def forward(self, x): x = self.conv1(x) # (32, 32, 1) → (28, 28, 6) x = F.relu(x) x = F.max_pool2d(x, 2) # (28, 28, 6) → (14, 14, 6) x = self.conv2(x) # (14, 14, 6) → (10, 10, 16) x = F.relu(x) x = F.max_pool2d(x, 2) # (10, 10, 16) → (5, 5, 16) x = x.view(x.size()[0], -1) # 将5x5x16展平成400维向量 x = F.relu(self.fc1(x)) # 400 → 120 x = F.relu(self.fc2(x)) # 120 → 84 x = self.fc3(x) # 84 → 10 return x
二维卷积广泛应用于图像处理任务中,尤其是需要捕捉局部特征和纹理信息的场景。常见的应用包括:
一维卷积和二维卷积是深度学习中核心的卷积类型,分别适用于序列数据和图像数据的处理。通过选择合适的卷积类型和参数,可以有效地提取不同维度上的特征信息,从而实现各种复杂的学习任务。
转载地址:http://qwrn.baihongyu.com/