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

1、卷积运算和代码示例

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

在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]]], dtype=torch.float32).unsqueeze(0)
model.weight.data = torch.tensor([[[[1,1],[1,1]]]], dtype=torch.float32)
model.bias.data = torch.zeros(1)

model(x)

结果可以看见为

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

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

假设我们对 [ 12 16 24 28 ] \begin{bmatrix} 12 & 16\\ 24& 28\\ \end{bmatrix} [12241628]
进行反卷积,padding=0,stride=1,卷积核为
[ 1 1 1 1 1 1 1 1 1 ] \begin{bmatrix} 1 & 1 & 1\\ 1& 1 & 1\\ 1& 1 & 1\\ \end{bmatrix} 111111111
这等价于对(见下面解释)
[ 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 ] (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} 0000000000000012240000162800000000000000 (1)进行卷积操作。结果应该为
[ 12 28 28 16 36 80 80 44 36 80 80 44 24 52 52 28 ] \begin{bmatrix} 12 & 28 & 28 & 16\\ 36& 80 & 80 &44\\ 36& 80 & 80 &44\\ 24& 52 & 52 &28\\ \end{bmatrix} 12363624288080522880805216444428

看下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 + 2 p − k s + 1 = o i ′ + 2 p ′ − k s + 1 = o ′ \begin{cases} \frac{i +2p -k}{s} + 1=o \\ \frac{i' +2p' -k}{s} + 1=o' \end{cases} {si+2pk+1=osi+2pk+1=o
第一行是4->2的卷积过程,第二行是6->4的卷积过程。

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

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

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

所以才有的矩阵(1)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值