gpt4 book ai didi

python - 关于 Pytorch 中的奇数图像尺寸

转载 作者:行者123 更新时间:2023-11-30 08:39:30 25 4
gpt4 key购买 nike

所以我目前正在构建一个 2 channel (也称为双 channel )卷积神经网络,用于测量 2 个(二进制)图像之间的相似性。

我遇到的问题如下:

我的输入图像为 40 x 50,经过 1 个卷积层和 1 个池化层(例如)后,输出大小为 18 x 23。那么如何在不产生非整数输出大小的情况下进行更多池化呢?例如,池化大小为 2 x 2 的 18 x 23 图像,输出大小为 9 x 11.5。

我似乎无法找到任何合适的内核大小来避免这样的问题,在我看来,这是由于原始输入图像尺寸不是 2 的幂。例如,大小为 64 x 64 的输入图像正确的填充大小等不会出现此问题。

非常感谢任何帮助。

最佳答案

关于您的问题:

So how does one do more pooling without ending up with non-integer output sizes?

假设您有:

import torch
from torch import nn
from torch.nn import functional as F

# equivalent to your (18 x 23) activation volume
x = torch.rand(1, 1, 4, 3)

print(x)
# tensor([[[[0.5005, 0.3433, 0.5252],
# [0.4878, 0.5266, 0.0237],
# [0.8600, 0.8092, 0.8912],
# [0.1623, 0.4863, 0.3644]]]])

如果您应用池化(我将在本例中使用 MaxPooling ,并且我假设您的意思是根据您预期的输出形状使用 stride=2 进行 2x2 池化):

p = nn.MaxPool2d(2, stride=2)
y = p(x)

print(y.shape)
# torch.Size([1, 1, 2, 1])

print(y)
# tensor([[[[0.5266],
# [0.8600]]]])

如果您想要[1, 1, 2, 2],您可以设置MaxPoolingceil_mode=True :

p = nn.MaxPool2d(2, stride=2, ceil_mode=True)
y = p(x)

print(y.shape)
# torch.Size([1, 1, 2, 2])

print(y)
# tensor([[[[0.5266, 0.5252],
# [0.8600, 0.8912]]]])

您还可以填充卷以实现相同的效果(这里我假设卷的 min=0 就好像它是在 ReLU 之后一样):

p = nn.MaxPool2d(2, stride=2)
y = p(F.pad(x, (0, 1), "constant", 0))

print(y.shape)
# torch.Size([1, 1, 2, 2])

print(y)
# tensor([[[[0.5266, 0.5252],
# [0.8600, 0.8912]]]])
<小时/>

关于:

I cannot seem to find any suitable kernel sizes to avoid such a problem, which in my opinion is a result of the fact that the original input image dimensions are not powers of 2.

好吧,如果您想使用将输入大小更改一半的池化操作(例如,带有 kernel=2stride=2 的 MaxPooling),那么使用输入 2 的幂形状非常方便(毕竟,您将能够执行许多这样的/2 操作)。然而,这不是必需的。您可以更改池化的步幅,始终可以使用 ceil_mode=True 进行池化,还可以不对称填充,以及许多其他操作。所有这些都是您在构建模型时必须做出的决定:)

关于python - 关于 Pytorch 中的奇数图像尺寸,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56803220/

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