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

3

我对Pytorch非常陌生,如果问题很简单,请原谅。 我的问题是,我定义了一个名为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添加到代码中时:
class net2(nn.Module):
    def __init__(self):
        super(net2, self).__init__()
        self.main_body = nn.Sequential(
            # Define the layers
        )
    def forward(self, x):
        return self.main_body(x)

net2_ = net2()

即使我没有在其他任何地方使用它,而且它也没有连接到我的主图(建立在net1_上),我仍然可以实例化它,但是我的图表输出结果不同。这是否是合理的结果?


在实例化 net2 之前第二次固定种子? - mbpaulus
1个回答

0

我假设执行顺序是:

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 = Truewith_net2 = False相比,随机数生成器的状态将不同。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接