Python RuntimeError:Generator在加载状态下的错误:使用Pyrotch的权重和偏差大小不匹配

Python RuntimeError:Generator在加载状态下的错误:使用Pyrotch的权重和偏差大小不匹配,python,pytorch,generative-adversarial-network,Python,Pytorch,Generative Adversarial Network,我正在训练一个3D-GAN来生成MRI体积。我将我的模型定义如下: ###### Definition of the generator ###### class Generator(nn.Module): def __init__(self, ngpu): #super() makes Generator a subclass of nn.Module, so that it inherites all the methods of nn.Module super(Gen

我正在训练一个3D-GAN来生成MRI体积。我将我的模型定义如下:

###### Definition of the generator ######

class Generator(nn.Module):
  def __init__(self, ngpu):
    #super() makes Generator a subclass of nn.Module, so that it inherites all the methods of nn.Module
    super(Generator, self).__init__()
    self.ngpu = ngpu
    #we can use Sequential() since the output of one layer is the input of the next one
    self.main = nn.Sequential(   
        # input is latent vector z, going into a convolution 
        nn.ConvTranspose3d(nz, ngf * 8, 4, stride=2, padding=0, bias=True), # try to put kernel = (batch_size,4,4,4,512)
        nn.BatchNorm3d(ngf * 8),
        nn.ReLU(True), #True means that it does the operation inplace, default is False

        nn.ConvTranspose3d(ngf * 8, ngf * 4, 4, stride=2, padding=1, bias=True), # try to put kernel = (batch_size,8,8,8,256)
        nn.BatchNorm3d(ngf * 4),
        nn.ReLU(True),

        nn.ConvTranspose3d(ngf * 4, ngf * 2, 4, stride=2, padding=1, bias=True), # try to put kernel = (batch_size,16,16,16,128)
        nn.BatchNorm3d(ngf * 2),
        nn.ReLU(True),

        nn.ConvTranspose3d( ngf * 2, ngf, 4, stride=2, padding=1, bias=True), # try to put kernel = (batch_size,32,32,32,64)
        nn.BatchNorm3d(ngf),
        nn.ReLU(True),

        nn.ConvTranspose3d(ngf, nc, 4, stride=2, padding=1, bias=True), # try to put kernel = (batch_size,64,64,64,1)
        nn.Sigmoid()

        )

  def forward(self, x):
    return self.main(x)


###### Definition of the Discriminator ######

class Discriminator(nn.Module):
    def __init__(self, ngpu):
        super(Discriminator, self).__init__()
        self.ngpu = ngpu
        self.main = nn.Sequential(
            nn.Conv3d(nc, ndf, 4, stride=2, padding=1, bias=True),
            nn.BatchNorm3d(ndf),
            nn.LeakyReLU(leak_value, inplace=True),

            nn.Conv3d(ndf, ndf * 2, 4, stride=2, padding=1, bias=True),
            nn.BatchNorm3d(ndf * 2),
            nn.LeakyReLU(leak_value, inplace=True),

            nn.Conv3d(ndf * 2, ndf * 4, 4, stride=2, padding=1, bias=True),
            nn.BatchNorm3d(ndf * 4),
            nn.LeakyReLU(leak_value, inplace=True),

            nn.Conv3d(ndf * 4, ndf * 8, 4, stride=2, padding=1, bias=True),
            nn.BatchNorm3d(ndf * 8),
            nn.LeakyReLU(leak_value, inplace=True),

            nn.Conv3d(ndf * 8, nc, 4, stride=1, padding=0, bias=True),
            nn.Sigmoid()
        )

    def forward(self, x):
        return self.main(x)
然后我训练模型并保存它。在加载模型进行评估和测试时,我得到以下错误:

RuntimeError:生成器处于加载状态时出错\u dict: main.0.weight的大小不匹配:从检查点复制带有形状torch.size([64,1,4,4,4])的参数,当前模型中的形状为torch.size([200,512,4,4,4])。 main.0.bias的大小不匹配:从检查点复制具有形状torch.size([64])的参数,当前模型中的形状为torch.size([512])。 main.1.weight的大小不匹配:从检查点复制具有形状torch.size([64])的参数,当前模型中的形状为torch.size([512])。 main.1.running_mean的大小不匹配:从检查点复制具有形状torch.size([64])的参数,当前模型中的形状为torch.size([512])。 main.1.bias的大小不匹配:从检查点复制带有形状torch.size([64])的参数,当前模型中的形状为torch.size([512])。 main.1.running_var的大小不匹配:从检查点复制具有形状torch.size([64])的参数,当前模型中的形状为torch.size([512])。 main.3.weight的大小不匹配:从检查点复制带有形状torch.size([128,64,4,4,4])的参数,当前模型中的形状为torch.size([512,256,4,4,4])。 main.3.bias的大小不匹配:从检查点复制带有形状torch.size([128])的参数,当前模型中的形状为torch.size([256])。 main.4.weight的大小不匹配:从检查点复制带有形状torch.size([128])的参数,当前模型中的形状为torch.size([256])。 main.4.running_mean的大小不匹配:从检查点复制带有形状torch.size([128])的参数,当前模型中的形状为torch.size([256])。 main.4.bias的大小不匹配:从检查点复制带有形状torch.size([128])的参数,当前模型中的形状为torch.size([256])。 main.4.running_var的大小不匹配:从检查点复制具有形状torch.size([128])的参数,当前模型中的形状为torch.size([256])。 main.6.bias的大小不匹配:从检查点复制带有形状torch.size([256])的参数,当前模型中的形状为torch.size([128])。 main.7.weight的大小不匹配:从检查点复制带有形状torch.size([256])的参数,当前模型中的形状为torch.size([128])。 main.7.running_mean的大小不匹配:从检查点复制具有形状torch.size([256])的参数,当前模型中的形状为torch.size([128])。 main.7.bias的大小不匹配:从检查点复制带有形状torch.size([256])的参数,当前模型中的形状为torch.size([128])。 main.7.running_var的大小不匹配:从检查点复制具有形状torch.size([256])的参数,当前模型中的形状为torch.size([128])。 main.9.weight的大小不匹配:从检查点复制带有形状torch.size([512,256,4,4,4])的参数,当前模型中的形状为torch.size([128,64,4,4,4])。 main.9.bias的大小不匹配:从检查点复制带有形状torch.size([512])的参数,当前模型中的形状为torch.size([64])。 main.10.weight的大小不匹配:从检查点复制带有形状torch.size([512])的参数,当前模型中的形状为torch.size([64])。 main.10.running_mean的大小不匹配:从检查点复制具有形状torch.size([512])的参数,当前模型中的形状为torch.size([64])。 main.10.bias的大小不匹配:从检查点复制具有形状torch.size([512])的参数,当前模型中的形状为torch.size([64])。 main.10.running_var的大小不匹配:从检查点复制具有形状torch.size([512])的参数,当前模型中的形状为torch.size([64])。 main.12.weight的大小不匹配:从检查点复制带有形状torch.size([1,512,4,4,4])的参数,当前模型中的形状为torch.size([64,1,4,4,4])

我做错了什么


提前谢谢

您加载的模型与目标模型不相同,因此会出现错误,提示大小、图层不匹配,请再次检查代码,否则保存的模型可能无法正确保存

您确定两次都使用相同的代码从类创建模型吗?因为误差表明评估时间模型与训练时间模型不同。您可能需要向任何人显示更多代码才能识别问题。这是正确的。如果在训练和评估之间更改模型中的权重大小和偏差,则可能会发生这种情况。但是,如果这是需要的行为,则在加载
state\u dict
时,也可以使用
strict=False
标志,仅加载您提供的字典中的匹配权重。