【发布时间】:2020-04-10 21:30:24
【问题描述】:
我正在训练 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:为生成器加载 state_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])。
我做错了什么?
提前致谢!
【问题讨论】:
-
您确定两次都使用相同的代码从您的班级创建模型吗?因为错误表明评估时间模型与训练时间模型不同。您可能需要向任何人展示更多代码以识别问题。
标签: python pytorch generative-adversarial-network