欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

验证torch中卷积和反卷积的计算

程序员文章站 2023-12-31 17:18:58
...

1、卷积运算和代码示例

一个简单的例子,我们给一个等待这被卷积的矩阵
[123456789]\begin{bmatrix} 1 & 2 & 3\\ 4& 5 & 6\\ 7 & 8 & 9\\ \end{bmatrix}
再给一个简单的卷积核为
[1111]\begin{bmatrix} 1 & 1\\ 1& 1\\ \end{bmatrix}
不设置padding,并且stride=1,我们可以简单的计算得到
[12162428]\begin{bmatrix} 12 & 16\\ 24& 28\\ \end{bmatrix}

在torch中就是如此计算的

model = nn.Conv2d(in_channels=1, out_channels=1, kernel_size=2,stride=1,padding=0)
x = torch.tensor([[[1,2,3],[4,5,6],[7,8,9]]]).unsqueeze(0)
model.weight.data = torch.tensor([[[[1,1],[1,1]]]])
model.bias.data = torch.zeros(1)

model(x)

结果可以看见为

tensor([[[[12, 16],
          [24, 28]]]], grad_fn=<ThnnConv2DBackward>)

2、反卷积运算和代码示例

假设我们对[12162428]\begin{bmatrix} 12 & 16\\ 24& 28\\ \end{bmatrix}
进行反卷积,padding=0,stride=1,卷积核为
[111111111]\begin{bmatrix} 1 & 1 & 1\\ 1& 1 & 1\\ 1& 1 & 1\\ \end{bmatrix}
这等价于对(见下面解释)
[0000000000000012160000242800000000000000](1)\begin{bmatrix} 0 &0 &0 & 0 &0 &0 \\ 0 &0 &0 & 0 &0 &0 \\ 0 &0 &12 & 16 &0 &0\\ 0 &0 & 24& 28 &0 &0\\ 0 &0 &0 & 0 &0 &0 \\ 0 &0 &0 & 0 &0 &0 \\ \end{bmatrix}\tag{1}进行卷积操作。结果应该为
[12282816368080443680804424525228]\begin{bmatrix} 12 & 28 & 28 & 16\\ 36& 80 & 80 &44\\ 36& 80 & 80 &44\\ 24& 52 & 52 &28\\ \end{bmatrix}

看下pytorch计算结果

model = nn.ConvTranspose2d(in_channels=1, out_channels=1, kernel_size=3,stride=1,padding=0)
x = torch.tensor([[[12,16],[24,28]]], dtype=torch.float32).unsqueeze(0)
model.weight.data = torch.tensor([[[[1,1,1],[1,1,1],[1,1,1]]]], dtype=torch.float32)
model.bias.data = torch.zeros(1)

print(model(x))

结果为

tensor([[[[12., 28., 28., 16.],
          [36., 80., 80., 44.],
          [36., 80., 80., 44.],
          [24., 52., 52., 28.]]]], grad_fn=<SlowConvTranspose2DBackward>)

提一下计算方式
{i+2pks+1=oi+2pks+1=o\begin{cases} \frac{i +2p -k}{s} + 1=o \\ \frac{i' +2p' -k}{s} + 1=o' \end{cases}
第一行是4->2的卷积过程,第二行是6->4的卷积过程。

反卷积是2->4的的过程

所以这里,有i=o,o=ii=o',o=i'。我们的输入x 就是第一行的o, 也就是第二行的ii',为2

通过消去i,oi,o',我们可以得到p=kp1=301=2p'=k-p-1=3-0-1=2

所以才有的矩阵(1)

相关标签: 卷积

上一篇:

下一篇: