torch.nn.Conv1d及一维卷积详解[通俗易懂]

近日在搞wavenet,期间遇到了一维卷积,在这里对一维卷积以及其pytorch中的API进行总结,方便下次使用之前对二维卷积是比较熟悉的,在初次接触一维卷积的时候,我以为是一个一维的卷积核在一条线上做卷积,但是这种理解是错的,一维卷积不代表卷积核只有一维,也不代表被卷积的feature也是一维。一维的意思是说卷积的方向是一维的。下边首先看一个简单的一维卷积的例子(batchsize是1,也只…

大家好,又见面了,我是你们的朋友全栈君。

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

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

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

输入:

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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aUj1VA0m-1573028650763)(https://ranchofromxgd.github.io/_posts/assets/2019-11-06-16-16-37.png)]

这幅图只说明了只有一个数据的情况,如果将数据打包成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://javaforall.net/129290.html原文链接:https://javaforall.net

(0)
上一篇 2022年4月13日 下午6:00
下一篇 2022年4月13日 下午6:20


相关推荐

  • DataGrid中DropDownList的动态绑定和触发DropDownList事件[通俗易懂]

    DataGrid中DropDownList的动态绑定和触发DropDownList事件[通俗易懂]我在写DataGrid控件中子控件事件时候,DropDownList的事件相比而言麻烦一点,在此,我简单罗列如下(我在此处为了方便这里都用DataGrid中的隐藏列存储我所要的数据):一、DropDownList的动态绑定,只需在DataGrid1_ItemDataBound的事件中,取出数值进行匹配,便可以了,具体代码如下:二、触发DataGrid中DropDownList的事件前台

    2025年10月30日
    5
  • Objective C (iOS) for Qt C++ Developers(iOS开发,Qt开发人员需要了解什么?)

    Objective C (iOS) for Qt C++ Developers(iOS开发,Qt开发人员需要了解什么?)

    2022年1月16日
    48
  • 6.Page对象详解

    6.Page对象详解序就好像用户看到的都是由dom表现出来的,所有的业务处理都是在Page对象中处理的。如果业务越简单,创建的Page对象数量就会越少;如果业务越复杂,那么相对而言Page对象数量就越多(或Page实例对象就会越复杂)。Page对象主要做以下事情:渲染页面,保证dom元素的合理安排,以及事件的处理;数据交互,将数据正确的放在dom元素中,并进行合理的前后端数据交互。无论是在哪个时候,这两点确实是前端开发的重中之重,换一句话说这就是前端核心开发内容。为了让Page对象更加专注于上面所提的两件事情,

    2022年7月11日
    22
  • 新鲜出炉: IE8 beta1 的下载地址以及官方论坛

    新鲜出炉: IE8 beta1 的下载地址以及官方论坛

    2021年7月26日
    96
  • J2EE架构师之路

    J2EE架构师之路不经意的回首,工作进入第五个年头了,发现走过了从Java程序员到J2EE架构师的历程。发现电脑上安装了各种各样的J2EE工具:JBuilder,WSAD,Eclipse,Rose,Together,Weblogic,Jtest,Optimizator,Mysql…发现电脑上保存了各种各样的OpenSource项目:Tomcat,JBoss,Ant,Hibernate,Spr

    2022年6月30日
    25
  • Laravel Eloquent ORM理解[通俗易懂]

    Laravel Eloquent ORM理解[通俗易懂]laravelEloquentORM文档:https://laravel-china.org/docs/laravel/5.5/eloquent/1332首先,什么是EloqentORM  官方手册是如此解释的:“Laravel的EloquentORM提供了漂亮、简洁的ActiveRecord实现来和数据库的互动。每个数据库表会和一个对应的「模型」互动”,好吧问题来了  …

    2025年8月7日
    3

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号