gpt4 book ai didi

python - pytorch 中的自适应池是如何工作的?

转载 作者:行者123 更新时间:2023-12-04 11:01:25 34 4
gpt4 key购买 nike

自适应池是一个很棒的功能,但它是如何工作的呢?它似乎以一种看起来像图案但相当随意的方式插入焊盘或缩小/扩展内核大小。我能找到的 pytorch 文档并不比“在此处放置所需的输出大小”更具描述性。有谁知道这是如何工作的,或者可以指出它的解释位置?

在 1x1x6 张量 (1,2,3,4,5,6) 上的一些测试代码,具有大小为 8 的自适应输出:

import torch
import torch.nn as nn

class TestNet(nn.Module):
def __init__(self):
super(TestNet, self).__init__()
self.avgpool = nn.AdaptiveAvgPool1d(8)

def forward(self,x):
print(x)
x = self.avgpool(x)
print(x)
return x

def test():
x = torch.Tensor([[[1,2,3,4,5,6]]])
net = TestNet()
y = net(x)
return y

test()

输出:
tensor([[[ 1.,  2.,  3.,  4.,  5.,  6.]]])
tensor([[[ 1.0000, 1.5000, 2.5000, 3.0000, 4.0000, 4.5000, 5.5000,
6.0000]]])

如果它在左侧和右侧镜像 pads(在 (1,1,2,3,4,5,6,6) 上操作),并且内核为 2,那么除了 4 和 5 之外的所有位置的输出有道理,当然,输出的大小不正确。它也在内部填充 3 和 4 吗?如果是这样,它在 (1,1,2,3,3,4,4,5,6,6) 上运行,如果使用大小为 2 的内核,则会产生错误的输出大小并且也会错过 3.5 的输出。它会改变内核的大小吗?

我是否遗漏了一些明显的工作方式?

最佳答案

一般来说,池化会减少维度。如果您想增加维度,您可能需要查看 interpolation .

不管怎样,让我们​​来谈谈一般的自适应池。可以看源码here .有人声称自适应池化与标准池化相同,其步幅和内核大小根据输入和输出大小计算。具体使用以下参数:

  • 步幅 = (input_size//output_size)
  • 内核大小 = input_size - (output_size-1)*stride
  • 填充 = 0

  • 这些与池化 formula 反向工作.虽然它们确实产生了所需大小的输出,但其输出不一定与自适应池的输出相同。这是一个测试片段:

    import torch
    import torch.nn as nn

    in_length = 5
    out_length = 3

    x = torch.arange(0, in_length).view(1, 1, -1).float()
    print(x)

    stride = (in_length//out_length)
    avg_pool = nn.AvgPool1d(
    stride=stride,
    kernel_size=(in_length-(out_length-1)*stride),
    padding=0,
    )
    adaptive_pool = nn.AdaptiveAvgPool1d(out_length)

    print(avg_pool.stride, avg_pool.kernel_size)

    y_avg = avg_pool(x)
    y_ada = adaptive_pool(x)

    print(y_avg)
    print(y_ada)

    输出:
    tensor([[[0., 1., 2., 3., 4.]]])
    (1,) (3,)
    tensor([[[1., 2., 3.]]])
    tensor([[[0.5000, 2.0000, 3.5000]]])
    Error: 1.0

    来自元素 (0, 1, 2), (1, 2, 3) 和 (2, 3, 4) 的平均池化池。

    来自元素 (0, 1)、(1, 2, 3) 和 (3, 4) 的自适应池。 (稍微更改代码以查看它不是仅来自(2)的池化)
  • 您可以告诉自适应池尝试减少池中的重叠。
  • 可以使用带有 count_include_pad=True 的填充来减轻差异。 ,但总的来说,我认为对于 2D 或更高版本的所有输入/输出大小,它们不会完全相同。我会想象为左/右使用不同的填充。目前,池化层不支持此功能。
  • 从实际的角度来看,它应该没有太大关系。
  • 检查 code为实际执行。
  • 关于python - pytorch 中的自适应池是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53841509/

    34 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com