在转发期间使用 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 (将#修改为@)