详解torch.nn.conv1d

首先明白一个概念:
一维卷积不代表卷积核只有一维,也不代表被卷积的feature也是一维。一维的意思是说卷积的方向是一维的。

补充:卷积层实际上是计算的相关,并没有翻折的操作,不是数学意义上的卷积。

1. 几个问题:
一维卷积的是在哪个维度进行?

一维卷积核的大小?

out_channel是指什么?怎么变换的?

2. conv1d定义
在这里插入图片描述
参数:

  • in_channels(int) – 输入信号的通道。在文本分类中,即为词向量的维度C_in
  • out_channels(int) – 卷积产生的通道。有多少个out_channels,就需要多少个1维卷积,即用多少个卷积核。
  • kernel_size(int or tuple) - 卷积核的尺寸,卷积核的大小为(k,),第二个维度是由in_channels来决定的,所以实际上卷积大小为kernel_size*in_channels
  • stride(int or tuple, optional) - 卷积步长
  • padding (int or tuple, optional)- 输入的每一条边补充0的层数
  • dilation(int or tuple, `optional``) – 卷积核元素之间的间距
  • groups(int, optional) – 从输入通道到输出通道的阻塞连接数
  • bias(bool, optional) - 如果bias=True,添加偏置

维度:
在这里插入图片描述
3.在哪个维度移动的
在这里插入图片描述
定义输入的大小为(batch_size,in_channel,length)

可以肯定的是卷积核是在最后一个维度移动的,例如上图的一维信号是卷积核从左往右进行卷积的。

然而卷积核的大小为多少呢?右上下图可知,卷积核大小为(in_channel * kernel_size),一般一维信号的卷积核大小就为(1*kernel_size)。

一维卷积不是指卷积核是一维的,而是在一个维度进行卷积。

4.out_channel

从输入到输出的过程中,通道数经常在发生改变,而out_channel是什么呢?

out_channel就是同时用多少个卷积核去卷同一个区域。

5.代码示例
示例1:

input1 = torch.randn(20, 16, 50) # torch.Size([20, 16, 50])
m = nn.Conv1d(16, 33, 3, stride=2) # Conv1d(16, 33, kernel_size=(3,), stride=(2,))
output = m(input1) # torch.Size([20, 33, 24])
 

验证Shape中conv1d 关于输出Lout的公式:Lout =⌊50+20 - 1(3-1) -1⌋/2 + 1 = 24

示例2:

import torch
import torch.nn as nn
 
# 卷积大小为kernel_size*in_channels, 此处也即 3 * 4, 每个卷积核产生一维的输出数据,长度与输入数据的长度和stride有关,根据ouotput可知是3,第二个参数2也就卷积核的数量
m = nn.Conv1d(4, 2, 3, stride=2)
 
# 第一个参数理解为batch的大小,输入是4 * 9格式 
input = torch.randn(1, 4, 9)
print(input)
output = m(input)
print(output)
print(output.size())

输出如下:

tensor([[[-0.2105, -1.0958, 0.7299, 1.1003, 2.3175, 0.8186, -1.7510, -0.1925, 0.8591],
[ 1.0991, -0.3016, 1.5633, 0.6162, 0.3150, 1.0413, 1.0571, -0.7014, 0.2239],
[-0.0658, 0.4755, -0.6653, -0.0696, 0.3483, -0.0360, -0.4665, 1.2606, 1.3365],
[-0.0186, -1.1802, -0.8835, -1.1813, -0.5145, -0.0534, -1.2568, 0.3211, -2.4793]]])

tensor([[[-0.8012, 0.0589, 0.1576, -0.8222],
[-0.8231, -0.4233, 0.7178, -0.6621]]], grad_fn=)

torch.Size([1, 2, 4])

第一个卷积核进行如下操作:
在这里插入图片描述
得到输出1*4的输出:

[-0.8012, 0.0589, 0.1576, -0.8222]

第二个卷积核进行类似操作:
在这里插入图片描述
得到输出1*4的输出:

[-0.8231, -0.4233, 0.7178, -0.6621]

合并得到最后的2*4的结果:
在这里插入图片描述
输入的input为 4 * 9 ,输出为 2 * 4。

验证Shape中conv1d 关于输出Lout的公式:Lout =⌊ 9+20 - 1(3-1) -1⌋/2 + 1 = 4

参考:
pytorch之nn.Conv1d详解
torch.nn.Conv1d详解

  • 23
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值