相同种子的不同Pytorch随机初始化

2024-10-01 13:34:42 发布

您现在位置:Python中文网/ 问答频道 /正文

我对Pythorch很陌生,如果问题很直接,我很抱歉。 我的问题是我定义了类net1,并用固定的手动种子随机初始化了它的参数。在

random.seed(opt.manualSeed)
torch.manual_seed(opt.manualSeed)
if torch.cuda.is_available():
    torch.cuda.manual_seed_all(opt.manualSeed)    

class net1(nn.Module):
    def __init__(self):
        super(net1, self).__init__()
        self.main_body = nn.Sequential(
            # Define the layers...#
        )
    def forward(self, x):
        return self.main_body(x)

# custom weights initialization called on net1
def weights_init(m):
    classname = m.__class__.__name__
    if classname.find('Conv') != -1:
        m.weight.data.normal_(0.0, 0.02)
    elif classname.find('BatchNorm') != -1:
        m.weight.data.normal_(1.0, 0.02)
        m.bias.data.fill_(0)

net1_ = net1()
net1_.apply(weights_init)

但是,当我向代码中添加另一个类net2时:

^{pr2}$

并实例化它,即使我不在其他任何地方使用它,也没有连接到我的主图(它是建立在net1_)上的,我从我的图中得到不同的输出。 结果是否合理?在


Tags: selfdataifinitdeftorchmanualcuda
1条回答
网友
1楼 · 发布于 2024-10-01 13:34:42

我想执行的顺序是:

random.seed(opt.manualSeed)
torch.manual_seed(opt.manualSeed)
if torch.cuda.is_available():
    torch.cuda.manual_seed_all(opt.manualSeed)    

if with_net2:
    net2_ = net2()

net1_ = net1()
net1_.apply(weights_init)

如果是这样,这是意料之中的。在

这是因为当调用net2.__init__时(在net2_ = net2()期间), torch的随机数生成器用于随机初始化net2_中的权重。 因此,随机数生成器在执行net1_.apply时的状态将与with_net2 = False不同。在

相关问题 更多 >