You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PyTorch训练CryoGAN中3D体张量无更新的问题求助

问题: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 03:50:14