如何解决Resnet实现:forward接受1个位置参数,但给出了2个
我编写了这段代码,当我运行它时,出现以下错误:forward()接受1个位置参数,但给出了2个。据我所知,我仅将一个参数传递给forward()。
- ResNet是基本的残差块
class ResNet(nn.Module):
def __init__(self,in_channels,mid_channels,mid2_channels,out_channels):
super().__init__()
self.conv1 = nn.Conv2d(in_channels,kernel_size = 3,stride = 1,padding = 1)
self.conv1_bn = nn.BatchNorm2d(mid_channels)
self.conv2 = nn.Conv2d(mid_channels,padding = 1)
self.conv2_bn = nn.BatchNorm2d(mid2_channels)
self.conv3 = nn.Conv2d(mid2_channels,out_channels,padding = 1)
self.conv3_bn = nn.BatchNorm2d(out_channels)
if (in_channels != out_channels):
self.conv_shortcut = nn.Conv2d(in_channels,kernel_size = 1,padding = 0 )
def forward(self,X):
X_shortcut = X
X = F.relu(self.conv1(X))
X = self.conv1_bn(X)
X = F.relu(self.conv2(X))
X = self.conv2_bn(X)
X = F.relu(self.conv2(X))
X = self.conv2_bn(X)
if (in_channels == out_channels):
X = self.conv3(X) + X_shortcut
else:
X = self.conv3(X) + self.conv_shortcut(X_shortcut)
X = self.conv3_bn(F.relu(x))
return X
- 这是使用给定图层生成模型的方法。
class TotalNet(nn.Module):
def __init__(self,Layers):
super().__init__()
self.hidden = nn.ModuleList()
self.hidden.append(nn.BatchNorm2d(1))
for i in range(0,len(Layers)-1,3):
in_channels,out_channels = Layers[i:(i+4)]
self.hidden.append(ResNet(in_channels,out_channels))
self.hidden.append(nn.Flatten())
def forward(self,X):
X = self.hidden(X)
return X
- 以下是我调用该函数的方式:
test = TotalNet([9,2,9,9])
a = torch.rand((1,9),dtype = torch.float32)
test(a)
解决方法
我意识到我正在将X传递给nn.ModuleList。正确的方法是将X应用于nn.ModuleList的元素并更新X的值,这是不正确的。 换句话说,TotalNet的转发功能应为:
for operation in self.hidden:
X = operation(X)
return X
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。