如何解决在转发期间使用 BaysianConv2d 时出现运行时错误
使用来自 blitz-bayesian-pytorch 的 BayesianConv2d 层时,我遇到了 RuntimeError: Given groups=1,weight of size [64,1,3,3],expected input[2,64,512,512] to have 1 channels,but got 64 channels instead
。
我理解错误,但我不知道它为什么会发生。
我的网络:
class BayesianNet(SegmentationNetwork):
def __init__(self,config):
super(BayesianNet,self).__init__(config=config)
# down
self.downconv1 = self.contract_block(self.in_channels,self.channels[0],self.kernel[0],self.padding[0])
self.downconv2 = self.contract_block(self.channels[0],self.channels[1],self.kernel[1],self.padding[1])
self.downconv3 = self.contract_block(self.channels[1],self.channels[2],self.kernel[2],self.padding[2])
self.downconv4 = self.contract_block(self.channels[2],self.channels[3],self.kernel[3],self.padding[3])
self.downconv5 = self.contract_block(self.channels[3],self.channels[4],self.kernel[4],self.padding[4])
# up
self.upconv1 = self.expand_block(self.channels[4],self.padding[4])
self.upconv2 = self.expand_block(self.channels[4],self.padding[3])
self.upconv3 = self.expand_block(self.channels[3],self.padding[2])
self.upconv4 = self.expand_block(self.channels[2],self.padding[1])
self.upconv5 = self.expand_block(self.channels[1],self.padding[0])
# out
self.outconv = nn.Conv2d(self.channels[0],self.out_channels,kernel_size=1,stride=1)
def __call__(self,x):
# down
print(x.size())
conv1 = self.downconv1(x)
# print('conv1 '+str(conv1.size()))
conv2 = self.downconv2(conv1)
# print('conv2 ' + str(conv2.size()))
conv3 = self.downconv3(conv2)
# print('conv3 ' + str(conv3.size()))
conv4 = self.downconv4(conv3)
# print('conv4 ' + str(conv4.size()))
conv5 = self.downconv5(conv4)
# print('conv5 '+str(conv5.size()))
# up
uconv1 = self.upconv1(conv5)
# print('uconv1 '+str(uconv1.size()))
uconv2 = self.upconv2(torch.cat([uconv1,conv4],1))
# print('uconv2 ' + str(uconv2.size()))
uconv3 = self.upconv3(torch.cat([uconv2,conv3],1))
# print('uconv3 ' + str(uconv3.size()))
uconv4 = self.upconv4(torch.cat([uconv3,conv2],1))
# print('uconv4 ' + str(uconv4.size()))
uconv5 = self.upconv5(torch.cat([uconv4,conv1],1))
# print('uconv5 ' + str(uconv5.size()))
# out
self.out = self.outconv(uconv5)
# print('out ' + str(self.out.size()))
return self.out
def contract_block(self,in_channels,out_channels,kernel_size,padding):
contract = nn.Sequential(
BayesianConv2d(in_channels=in_channels,out_channels=out_channels,kernel_size=(kernel_size,kernel_size),stride=1,padding=padding),nn.Batchnorm2d(out_channels),nn.ReLU(),BayesianConv2d(in_channels=in_channels,nn.MaxPool2d(kernel_size=2,stride=2,padding=0) #
)
return contract
def expand_block(self,padding):
expand = nn.Sequential(
BayesianConv2d(in_channels=in_channels,nn.Upsample(mode='nearest',scale_factor=2),self.conv1x1(out_channels,out_channels)
)
return expand
def conv1x1(self,groups=1):
return nn.Conv2d(in_channels,groups=groups,stride=1)
SegmentationNetwork 类仅用于分配所使用的值(通道、...)。 当我将数据从数据加载器转发到网络时发生错误。 数据加载器发送一个张量 (2,512)。我检查了多次。 当我使用常规 nn.Conv2d 时一切正常。
我没有对权重进行特殊初始化,这可能是问题所在吗? 如果是这样,我该怎么做?
非常感谢
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。