近日在搞wavenet,期间遇到了一维卷积,在这里对一维卷积以及其pytorch中的API进行总结,方便下次使用

之前对二维卷积是比较熟悉的,在初次接触一维卷积的时候,我以为是一个一维的卷积核在一条线上做卷积,但是这种理解是错的,一维卷积不代表卷积核只有一维,也不代表被卷积的feature也是一维。一维的意思是说卷积的方向是一维的。

下边首先看一个简单的一维卷积的例子(batchsize是1,也只有一个kernel):

一个长度为35的序列,序列中的每个元素有256维特征,故输入可以看作(35,256)
卷积核: size = (k,) , (k = 2)

这幅图只说明了只有一个数据的情况,如果将数据打包成batch,可以用代码表示如下:

    from torch.autograd import Variable
    conv1 = nn.Conv1d(in_channels=256,out_channels = 100, kernel_size = 2)
    input = torch.randn(32, 35, 256)
    # batch_size x text_len x embedding_size -> batch_size x embedding_size x text_len
    input = input.permute(0, 2, 1)
    input = Variable(input)
    out = conv1(input)
    print(out.size())

torch.Size([32, 100, 34])

在分析这个结果之前先来看一下nn.Conv1d的官方文档

// 可以理解为特征的维度
in_channels – Number of channels in the input image 
//输出的通道数,可以理解为卷积核的数量
out_channels – Number of channels produced by the convolution
// 卷积核的大小,只需要指定卷积方向的大小(因为是一维的)
kernel_size – Size of the convolving kernel
stride – Stride of the convolution
padding – Zero-padding added to both sides of the input
dilation – Spacing between kernel elements
groups – Number of blocked connections from input channels to output channels
bias – If True, adds a learnable bias to the output


再来看输出:torch.Size([32, 100, 34])

输入数据第一维表示batchsize,后边两维和前边的例子一样,不同的是输出,长度变为了34(卷积核大小为2),由于有100个卷积核,故生成了100个feature map

可能还会有一个疑惑,就是感觉100和34位置反过来了,这是因为nn.Conv1d对输入数据的最后一维进行一维卷积,为了将卷积方向设置正确,我们需要将输入序列长度这一维放到最后,即使用permute函数,这样就可以实现一维卷积。

原文链接:https://blog.csdn.net/qq_36323559/article/details/102937606

原文链接:https://blog.csdn.net/qq_36323559/article/details/102937606 本文结合图例说明Conv1d的基本计算过程。 Conv1d torch.nn.Conv1d(in_channels, out_channels, kernel_size, stride=1, padding=0, dilation=1, groups=1, bias=True, padding_mode='zeros',. 比如说,我的数据是(100,10,50),也就是说:我有100条数据,每条数据都是一个矩阵,维度为10×50 参数:in_channels = 10 这个值需要等于 矩阵的行,也就是10 out_channels = 3 这个值等于卷积核的个数 kernel_size = 4, 这个值是可以自己设置的,但是最大是50 stride = 1, 默认是1, 代表卷积核沿着 矩阵向右移动的步长 conv1d有两个,一个是torch.nn模块中,另一个是torch.nn.functional模块中。 torch.nn.Conv1d(in_channels, out_channels, kernel_size, stride=1, padding=0, dilation=1, groups=1, bias=True, padding_mode=‘zeros’, device=None, dtype=None) in_channels:输入通道数 out_channels 官方文档:https://pytorch.org/docs/stable/generated/torch.nn.Conv1d.html?highlight=nn%20conv1d#torch.nn.Conv1d 作用:对由多个输入平面组成的输入信号应用一维卷积。 在最简单的情况下,输入大小为 (N,Cin,L)(N, C_{\text{in}}, L)(N,Cin​,L) 和输出$ (N, C_{\text{out}}, L_{\text{out}})$可以精确地描述为: out(Ni,Coutj)=bia 右上下图可知,卷积核大小为(in_channel * kernel_size),一般一维信号的卷积核大小就为(1*kernel_size)。一维卷积不代表卷积核只有一维,也不代表被卷积的feature也是一维。一维的意思是说卷积的方向是一维的。可以肯定的是卷积核是在最后一个维度移动的,例如上图的一维信号是卷积核从左往右进行卷积的。从输入到输出的过程中,通道数经常在发生改变,而out_channel是什么呢?补充:卷积层实际上是计算的相关,并没有翻折的操作,不是数学意义上的卷积。一维卷积的是在哪个维度进行? pytorch卷积层的介绍: torch.nn.Conv1d介绍: torch.nn.Conv1d(in_channels, out_channels, kernel_size, stride=1, padding=0, dilation=1, groups=1, bias=True) in_channels(int) – 通道,在文本分类中,即为词向量的维度 out_channels(int) – 卷积产生的通道。有多少个out_channels,就需要多少个1维卷积 kernel_size(int o. 基本函数torch.nn.Conv2d()torch.nn.MaxPool2d()torch.nn.Linear()torch.nn.ReLU() torch.nn.Conv2d() 对由多个输入平面组成的输入信号应用 2D 卷积。 class torch.nn.Conv2d(in_channels, out_channels, kernel_size, stride=1, padding=0, dilation=1, groups=1, bias=True, padding_mode='zeros')¶ 一维卷积是施加于两个数列(一个输入,一个核)的一种计算,过程可简单描述为:首先将两行数字左对齐,上下对应的数字分别相乘然后取和,得到一个新值;接着将核依照步长(stride)向右滑动,再次分别相乘取和得到新值;继续该滑动和计算过程,直到核的右端超出输入数组,此时不再计算,结束。例: a=np.array([i for i in range(7)]).reshape(1,7,1) conv1 = nn.Conv1d(in_channels=1,out_channels=1,kernel_size=2) CONV1D https://pytorch.org/docs/master/generated/torch.nn.Conv1d.html#torch.nn.Conv1d 在由多个输入平面组成的输入信号上应用一维卷积torch.nn.Conv1d(in_channels, out_channels, kernel