PyTorch训练CryoGAN中3D体张量无更新的问题求助
我正在大学项目中复现CryoGAN网络(结合GAN的冷冻电镜技术),目标是还原蛋白质的3D结构,输入为真实蛋白质的投影图像。CryoGAN的生成器由蛋白质3D体数据和物理模拟器组成,物理模拟器负责将3D体数据生成2D投影,这部分已正常工作,我只需训练128×128×128体素的3D体数据张量。
我尝试把该体数据作为可学习参数创建为张量,但代码能运行,体数据却完全没有更新。相关代码片段如下:
class Generator(nn.Module): def __init__(self): super().__init__() self.gen = nn.Parameter(torch.rand(128, 128, 128)) def forward(self, x): return self.gen(x) gen = Generator(projection_pixels) opt_gen = optim.Adam(gen.parameters(), lr=lr) loss_criterion = nn.BCELoss() #...feeding discriminator with projections from fake and real protein, calculating loss for generator gen.zero_grad() lossG.backward() opt_gen.step()
我已尝试将体数据初始化改为self.gen = nn.Parameter(torch.FloatTensor(128,128,128).uniform_()),但无任何变化。
修复forward方法的错误调用:你的
forward方法里错误地把self.gen(3D张量参数)当作函数调用self.gen(x),这会触发张量的索引操作而非返回参数本身,更无法关联到物理模拟器的投影生成逻辑。正确的写法应该是调用物理模拟器,用self.gen生成对应投影:def forward(self, x): # x为投影所需的角度/参数,调用物理模拟器生成2D投影 return physical_simulator(self.gen, x)如果无需输入参数,也可以直接返回体数据:
def forward(self): return self.gen确认参数被优化器正确捕获:打印
list(gen.parameters()),检查输出中是否包含self.gen这个参数,确保优化器能追踪到它的更新。验证梯度有效性:在
lossG.backward()执行后,打印gen.gen.grad,查看梯度是否为None或全零。如果梯度无效,说明损失计算环节没有将假样本投影与生成器体数据建立关联,需要检查损失计算的逻辑链。调整优化器设置:尝试调高学习率(比如从1e-4调整到1e-3),或者检查Adam优化器的
weight_decay参数是否过大,导致参数更新被抑制。优化参数初始化:可以尝试用正态分布
torch.randn初始化参数,或者结合蛋白质体数据的先验信息(如密度分布)进行初始化,更合理的初始值有助于梯度流动和参数更新。
内容的提问来源于stack exchange,提问作者F0rtes

