【问题标题】:Different Pytorch random initialization with the same seed具有相同种子的不同 Pytorch 随机初始化
【发布时间】:2018-03-05 02:05:56
【问题描述】:

我对 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 之前再次修复种子?

标签: python random pytorch


【解决方案1】:

我假设执行顺序是:

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_ 中的权重。 因此,如果with_net2 = Truewith_net2 = False 相比,net1_.apply 执行时随机数生成器的状态会有所不同。

【讨论】:

    猜你喜欢
    • 2011-06-13
    • 2019-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-03
    • 2015-10-12
    • 1970-01-01
    相关资源
    最近更新 更多