Int*_*his 10 conv-neural-network pytorch
我试图理解一个使用 PyTorch 转置卷积函数的示例片段,这里有文档,作者在文档中写道:
“padding 参数有效地向输入的两种大小添加了扩张 * (kernel_size - 1) - 零填充的填充量。”
考虑下面的代码片段,其中[1, 1, 4, 4]包含所有 1 的形状的示例图像被输入到ConvTranspose2D带有参数stride=2和padding=1形状权重矩阵的操作(1, 1, 4, 4),该矩阵的条目来自1和之间的范围16(在本例中为dilation=1和added_padding = 1*(4-1)-1 = 2)
sample_im = torch.ones(1, 1, 4, 4).cuda()
sample_deconv = nn.ConvTranspose2d(1, 1, 4, 2, 1, bias=False).cuda()
sample_deconv.weight = torch.nn.Parameter(
torch.tensor([[[[ 1., 2., 3., 4.],
[ 5., 6., 7., 8.],
[ 9., 10., 11., 12.],
[13., 14., 15., 16.]]]]).cuda())
Run Code Online (Sandbox Code Playgroud)
其产量:
>>> sample_deconv(sample_im)
tensor([[[[ 6., 12., 14., 12., 14., 12., 14., 7.],
[12., 24., 28., 24., 28., 24., 28., 14.],
[20., 40., 44., 40., 44., 40., 44., 22.],
[12., 24., 28., 24., 28., 24., 28., 14.],
[20., 40., 44., 40., 44., 40., 44., 22.],
[12., 24., 28., 24., 28., 24., 28., 14.],
[20., 40., 44., 40., 44., 40., 44., 22.],
[10., 20., 22., 20., 22., 20., 22., 11.]]]], device='cuda:0',
grad_fn=<CudnnConvolutionTransposeBackward>)
Run Code Online (Sandbox Code Playgroud)
现在我已经看到了没有步幅和填充的转置卷积的简单示例。例如,如果输入是一张2x2图像 [[2, 4], [0, 1]],并且具有一个输出通道的卷积滤波器是[[3, 1], [1, 5]],那么得到的形状张量(1, 1, 3, 3)可以看作是下图中四个彩色矩阵的总和:
问题是我似乎找不到在同一可视化中使用步幅和/或填充的示例。根据我的代码片段,我很难理解如何将填充应用于示例图像,或者如何获取此输出。任何见解都值得赞赏,即使只是了解如何计算结果矩阵的条目或条目也会非常6有(0,0)帮助12。(0,1)
Iva*_*van 10
的输出空间维度nn.ConvTranspose2d由下式给出:
out = (x - 1)s - 2p + d(k - 1) + op + 1
Run Code Online (Sandbox Code Playgroud)
其中x是输入空间维度和out相应的输出大小,s是步幅、d膨胀、p填充、k内核大小和op输出填充。
如果我们保留以下操作数:
对于输入的每个值,我们通过计算与内核的每个元素的乘积来计算(相应颜色的)缓冲区。
s=1, p=0以下是、s=1, p=1、s=2, p=0和的可视化s=2, p=1:
s=1, p=0:输出是3x3对于蓝色缓冲区,我们有 (1) 2*k_top-left = 2*3 = 6;(2) 2*k_top-right = 2*1 = 2; (3) 2*k_bottom-left = 2*1 = 2; (4) 2*k_bottom-right = 2*5 = 10.
s=1, p=1:输出是1x1s=2, p=0:输出是4x4s=2, p=2:输出是2x2我认为让事情变得混乱的是他们对文档中“输入”或“输出”的含义以及术语“跨度”和“填充”的重载不太仔细。
我发现通过问自己更容易理解 PyTorch 中的转置卷积:我会给一个普通的前向卷积层提供什么参数,以便它给出手头的张量,我将其输入转置卷积层?
例如,“stride”应该理解为前向卷积中的“步幅”,即滑动内核的移动步长。
在转置卷积中,“步幅”实际上意味着不同的东西:是转置stride-1卷积层的输入单元之间的交错空槽的数量。这是因为正是前向卷积中大于 1 的“步幅”造成了此类漏洞。请参见下图的说明:
该图还显示,无论“stride”的值如何,转置卷积层中的内核移动步长始终为 1。我发现记住这一点非常重要。
论证类似padding。应该理解为应用于前向卷积的0-padding。由于这种填充,我们在前向转换的输出中获得了一些额外的单位。因此,如果我们随后将这个输出输入到转置卷积中,为了回到原始的、未填充的长度,那些额外的东西应该被删除,因此方程-2p中的项也应该被删除。
请参见下图的说明。
总之,这些被设计为使得法线卷积和转置卷积在张量形状变换的意义上是彼此的“逆”操作。(但我确实认为该文档应该改进。)
记住这一原则,我们也可以相对容易地计算出dilation和output_padding论证。我已经就此写了一篇博客 ,以防有人感兴趣。
| 归档时间: |
|
| 查看次数: |
11257 次 |
| 最近记录: |