========================= 这篇博客主要是讲解 Conv1d =======================
处理一维数据如文本或者语音时,需要用到一维卷积,综合网上各种资料和自己的理解,尽可能傻瓜式的说明Conv1d的过程,从而说明 ConvTranspose1d的运算过程,并且用 Pytorch验证。
Pytorch 的 Conv1d 的官方文档:
https://pytorch.org/docs/stable/generated/torch.nn.Conv1d.html?highlight=conv1d#torch.nn.Conv1d
废话不多说!
import torch import torch.nn as nn
k = 3 conv2 = nn.Conv1d(in_channels=1, out_channels=1, kernel_size=k, stride = 1, padding = 0 , bias = False) conv2.weight.data = torch.ones(1,1,k) x = torch.ones(1, 1, 4)
print('=====conv=====') for name, l in conv2.named_parameters(): print('{}={}'.format(name, l.data))
x4 = conv2(x) print(x4) |
上面是一个输入为 [x1, x2, x3, x4] = [1,1,1,1] 的信号,卷积核是 [w1,w2,w3] = [1,1,1],stride = 1,没有 padding 和 bias。计算流程:
输入 | 1(x1) | 1(x2) | 1(x3) | 1(x4) |
|
卷积核和输入信号的第1次运算 | 1(x1 * w1) | 1(x2 * w2) | 1(x3 * w3) |
| 第1次输出:∑=3 |
卷积核和输入信号的第2次运算 |
| 1(x2 * w1) | 1(x3 * w2) | 1(x4 * w3) | 第2次输出:∑=3 |
所以上述 x4 = [3,3],pytorch 验证结果如下:
- 假设上述其他代码不变,但是 padding = 1,只修改上述一行代码:
conv2 = nn.Conv1d(in_channels=1, out_channels=1, kernel_size=k, stride = 1, padding = 1 , bias = False) |
计算流程如下:
输入 | 0(padding) | 1(x1) | 1(x2) | 1(x3) | 1(x4) | 0(padding) |
|
卷积核和输入信号的第1次运算 | 0 (0 * w1) | 1(x1 * w2) | 1(x2 * w3) |
|
|
| 第1次输出:∑=2 |
卷积核和输入信号的第2次运算 |
| 1(x1 * w1) | 1(x2 * w2) | 1(x3 * w3) |
|
| 第2次输出:∑=3 |
卷积核和输入信号的第3次运算 |
|
| 1(x2 * w1) | 1(x3 * w2) | 1(x4 * w3) |
| 第3次输出:∑=3 |
卷积核和输入信号的第4次运算 |
|
|
| 1(x3 * w1) | 1(x4 * w2) | 0(0 * w3) | 第4次输出:∑=2 |
所以上述 x4 = [2,3,3,2],pytorch 验证结果如下:
- 假设上述代码保持不变,但是 stride = 2 ,只修改上述一行代码:
conv2 = nn.Conv1d(in_channels=1, out_channels=1, kernel_size=k, stride = 2, padding = 1 , bias = False) |
输入 | 0(padding) | 1(x1) | 1(x2) | 1(x3) | 1(x4) | 0(padding) |
|
卷积核和输入信号的第1次运算 | 0 (0 * w1) | 1(x1 * w2) | 1(x2 * w3) |
|
|
| 第1次输出:∑=2 |
卷积核和输入信号的第2次运算 |
|
| 1(x2 * w1) | 1(x3 * w2) | 1(x4 * w3) |
| 第2次输出:∑=3 |
所以上述 x4 = [2,3],pytorch 验证结果如下:
码字儿不易,Buy Me A Coffee(好押韵~~~~~)