pytorch之nn.Conv1d和nn.Conv2d超详解

Conv1d

一般用于文本

nn.Conv1d(in_channels, out_channels, kernel_size, stride=1, padding=0, dilation=1, groups=1, bias=True)

参数解读:

  • in_channels: 输入通道。在文本分类中,即为词向量的维度
  • out_channels: 卷积产生的通道。有多少个out_channels,就需要多少个1维卷积
  • kernel_size:卷积核的尺寸(k, in_channels)
  • stride: 卷积步长
  • padding: 输入的每一条边补充0的层数
  • dilation:卷积核元素之间的间距
  • groups:输入通道到输出通道的阻塞连接数
  • bias: 如果bias=True,添加偏置
看下面这张图已经够了,来自TextCNN那篇论文。

Conv1d顾名思义只对一个维度操作,在文本中只需要从上往下进行卷积扫描即可。

下图左边输入维度[max_len, embedding_dim], 分别表示句子长度和每个词的词向量维度,图中对应的是7 * 5。
filter_size包括[2, 3, 4]三种类型,其维度分别是2 * 5,3 * 5,4 * 5,每个filter_size都有两个。
在纵向需要卷积的方向,卷积后变为n+2p-f/s+1,这里的n:max_len, p:padding, f: filter_size, s: stride。
接着分别进行最大池化并拼接,然后将所有filter_size的结果再拼接,最终一个全连接层输出2个类别的概率。

在这里插入图片描述

用一个例子来解释Conv1d操作
conv1 = nn.Conv1d(in_channels=256, out_channels=100, kernel_size=3, stride=1, padding=0)
input = torch.randn(32, 35, 256)  # [batch_size, max_len, embedding_dim]
input = input.permute(0, 2, 1)    # 交换维度:[batch_size, embedding_dim, max_len]
out = conv1(input)                # [batch_size, out_channels, n+2p-f/s+1]
print(out.shape)      			  # torch.Size([32, 100, 33])

input的的维度是[batch_size, max_len, embedding_dim],在开始Conv1d前需要将max_len换到最后一个维度用来做一维卷积。卷积后的结果[batch_size, out_channels, n+2p-f/s+1],在纵向维度上(35 + 2*0 - 3)/1 + 1=33。

Conv2d

一般用于图像,给定一个4维的input和filter,计算一个二维卷积就是横向和纵向均卷积。

nn.Conv2d(in_channels, out_channels, kernel_size, stride=1, padding=0, dilation=1, groups=1, bias=True)

在这里插入图片描述

一个例子来解释

来自https://blog.csdn.net/Elva_23/article/details/83826587
输入和核如下,padding=0,stride=1
在这里插入图片描述
卷积完的结果:
在这里插入图片描述

  • 14 = 4 * 1 + 3 * 0 + 1 * 1 + 2 * 2 + 1 * 1 + 0 * 0 + 1 * 0 + 2 * 0 + 4 * 1
  • 6 = 3 * 1 + 1 * 0 + 0 * 1 + 1 * 2 + 0 * 1 + 1 * 0 + 2 * 0 + 4 * 0 + 1 * 1
  • 6 = 2 * 1 + 1 * 0 + 0 * 1 + 1 * 2 + 2 * 1 + 4 * 0 + 3 * 0 + 1 * 0 + 0 * 1
  • 12 = 1 * 1 + 0 * 0 + 1 * 1 + 2 * 2 + 4 * 1 + 1 * 0 + 1 * 0 + 0 * 0 + 2 * 1

猜你喜欢

转载自blog.csdn.net/lyj223061/article/details/108709447