通读了从论文中找的代码,终于找到这个痛点了!
以下详解nn.Conv1d方法
1 参数说明
in_channels(int) – 输入信号的通道。
out_channels(int) – 卷积产生的通道。
kernel_size(int or tuple) - 卷积核的尺寸,经测试后卷积核的大小应为in_channels(行)*kernel_size(列)
stride(int or tuple, optional) - 卷积步长
padding(int or tuple, optional) - 输入的每一条边补充0的层数
dilation(int or tuple, `optional`) – 卷积核元素之间的间距
groups(int, optional) – 从输入通道到输出通道的阻塞连接数
bias(bool, optional) - 如果bias = True,添加偏置
2、具体例子
import torch
import torch.nn as nn
# 创建输入张量
# 可以看作三维数组,举个例子,65个句子
# 每个句子有9个字,每个字生成了144维的词向量
x = torch.randn(65, 9, 144)
# 创建卷积
conv = nn.Conv1d(in_channels=9, out_channels=64, kernel_size=16,stride=8)
out = conv(x)
print(out.shape)
输出结果:torch.Size([65, 64, 17])
解释:卷积操作后的参数分别表示batch数量(与in_channels相关)、卷积核数量(与out_channels相关)、卷积结果的数量(与kernel_size和stride相关)。
前两个参数好理解,最后一个参数再详细说一下:在计算时可以直接忽略第一个参数直接当做一个9x144的二维数组和一个9x16的卷积核做卷积运算,卷积核移动步长为8:
如上图所示,这是其中一个卷积核在数据上的前两步计算过程。