Воспроизводимость результатов для GNN с использованием DGL grahSAGE

Я работаю над проблемой классификации узлов с помощью graphSAGE. Я новичок в GNN, поэтому мой код основан на учебниках GraphSAGE с DGL для задач классификации [1] и [2]. Это код, который я использую, это трехуровневый GNN с размером входных данных 20 и размером выходных данных 2 (проблема двоичной классификации):

class GraphSAGE(nn.Module):
    def __init__(self,in_feats,n_hidden,n_classes,n_layers,
                 activation,dropout,aggregator_type):
        super(GraphSAGE, self).__init__()
        self.layers = nn.ModuleList()
        self.dropout = nn.Dropout(dropout)
        self.activation = activation

        self.layers.append(dglnn.SAGEConv(in_feats, n_hidden, aggregator_type))
        for i in range(n_layers - 1):
            self.layers.append(dglnn.SAGEConv(n_hidden, n_hidden, aggregator_type))
        self.layers.append(dglnn.SAGEConv(n_hidden, n_classes, aggregator_type))

    def forward(self, graph, inputs):
        h = self.dropout(inputs)
        for l, layer in enumerate(self.layers):
            h = layer(graph, h)
            if l != len(self.layers) - 1:
                h = self.activation(h)
                h = self.dropout(h)
        return h

modelG = GraphSAGE(in_feats=n_features, #20
                   n_hidden=16,
                   n_classes=n_labels, #2
                   n_layers=3,
                   activation=F.relu,
                   dropout=0,
                   aggregator_type='mean')

opt = torch.optim.Adam(modelG.parameters())

for epoch in range(50):
    modelG.train() 

    logits = modelG(g, node_features)
    
    loss = F.cross_entropy(logits[train_mask], node_labels[train_mask])
    
    acc = evaluate(modelG, g, node_features, node_labels, valid_mask)
    
    opt.zero_grad()
    loss.backward()
    opt.step()
    
    if epoch % 5 == 0:
        print('In epoch {}, loss: {}'.format(epoch, loss),)

Каждый раз, когда я тренирую модель (ничего не меняя), производительность сильно меняется, точность колеблется от 0,45 до 0,87. Как я могу гарантировать воспроизводимость результатов? Я пробовал установить семя pytorch torch.manual_seed(), numpy seed и установите значение dropout на 0, но результаты продолжают меняться. Это нормально или я что-то упускаю?

1 ответ

Я видел подобные проблемы в Интернете, и решение заключалось в использовании:

      torch.set_deterministic(True) 

Причина может быть в том, что операции разброса, поскольку они используют атомарные операции под капотом, поэтому порядок суммирования может меняться каждый раз, когда вы запускаете код.

ссылка:https://pytorch.org/docs/stable/notes/randomness.htmlhttps://github.com/pyg-team/pytorch_geometric/issues/859

Другие вопросы по тегам