gpt4 book ai didi

for-loop - 在 pytorch 类的前向函数中使用 for 循环为 Residual block 创建一堆卷积层

转载 作者:行者123 更新时间:2023-12-04 17:29:12 29 4
gpt4 key购买 nike

我在 pytorch 中为 ResNet 定义了一个残差 block ,您可以在其中输入您想要的卷积层数量,不一定是两个。这是通过名为 nc(Convs 的数量)的参数完成的。第一层得到 ni 作为输入 nf 个过滤器的数量。但是从第二层开始,我把它们放在一个 for 循环中。这是我的代码:

class ResBlock(nn.Module):
def __init__(self, ni, nf,nc=2):
super().__init__()
self.conv1 = nn.Conv2d(ni,nf, kernel_size=3, stride=2, padding=0)
self.conv2 = nn.Conv2d(nf,nf, kernel_size=3, stride=1, padding=0)
self.conv1x1 = nn.Conv2d(ni, nf, kernel_size=1, stride=1, padding=0)
self.nc = nc
def forward(self, x):
y = self.conv1(x)
for i in range(self.nc-1):
y = self.conv2(y)
print(torch.mean(y))
return self.conv1x1(x) + y

但无论我给 nc 赋予什么值,它总是返回 2 个内核大小为 3 的 convs。我不确定 for 循环是否真的可以在 pytorch 中完成这项工作,但当我在 Keras 中使用函数式 API 时它是有效的。谁能帮助我了解发生了什么?

最佳答案

是的,打印一个 nn.Module 对象通常会产生误导。打印时,您会得到:

# for ni=3, nf=16
ResBlock(
(conv1): Conv2d(3, 16, kernel_size=(3, 3), stride=(2, 2))
(conv2): Conv2d(16, 16, kernel_size=(3, 3), stride=(1, 1))
(conv1x1): Conv2d(3, 16, kernel_size=(1, 1), stride=(1, 1))
)

因为这些是您在 ResBlock__init__ 中注册的仅有的 3 个 Module

实际的前锋可以(在你的情况下)做一些完全不同的事情。

关于for-loop - 在 pytorch 类的前向函数中使用 for 循环为 Residual block 创建一堆卷积层,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61164539/

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