为什么我在 pytorch 中训练和测试时准确度为 0?

问题描述 投票:0回答:0

我正在使用元路径进行嵌入。我加载了一个异构图形数据集。我使用 pytorch-geometric 文档制作了这个。这是有关数据集的信息。

HeteroData(
  Publication={
    x=[6662, 8],
    y_index=[6662, 1],
    y=[6662, 1]
  },
  Venue={
    x=[2290, 8],
    y_index=[2290, 1],
    y=[2290, 1]
  },
  Author={
    x=[11884, 8],
    y_index=[11884, 1],
    y=[11884, 1]
  },
  (Venue, cite, Venue)={ edge_index=[2, 15089] },
  (Publication, cite, Publication)={ edge_index=[2, 15089] },
  (Publication, in, Venue)={ edge_index=[2, 6354] }
)

这些是元路径。

metapath = [
    
    ("Venue", "cite", "Venue"),
    ('Publication', 'cite', 'Publication'),
    ('Publication', 'in', 'Venue')
]
model = MetaPath2Vec(data.edge_index_dict, embedding_dim=128,
                     metapath=metapath, walk_length=50, context_size=3,
                     walks_per_node=3, num_negative_samples=1,
                     sparse=True).to(device)

现在,当我尝试运行测试和训练模型时,我得到的准确度等于零。 以下是我的测试和训练模型的代码。

ef train(epoch, log_steps=50, eval_steps=100):
    model.train()

    total_loss = 0
    for i, (pos_rw, neg_rw) in enumerate(loader):
        optimizer.zero_grad()
        loss = model.loss(pos_rw.to(device), neg_rw.to(device))
        loss.backward()
        optimizer.step()

        total_loss += loss.item()
        if (i + 1) % log_steps == 0:
            print((f'Epoch: {epoch}, Step: {i + 1:05d}/{len(loader)}, '
                   f'Loss: {total_loss / log_steps:.4f}'))
            total_loss = 0

        if (i + 1) % eval_steps == 0:
            acc = test()
            print((f'Epoch: {epoch}, Step: {i + 1:05d}/{len(loader)}, '
                   f'Acc: {acc:.4f}'))

@torch.no_grad()
def test(train_ratio=0.3):
    model.eval()
    z = model('Publication', batch=data.y_index_dict['Publication'].flatten())
    
    y = data.y_dict['Publication'].flatten()

    perm = torch.randperm(z.size(0))
    train_perm = perm[:int(z.size(0) * train_ratio)]
    test_perm = perm[int(z.size(0) * train_ratio):]

    return model.test(z[train_perm], y[train_perm], z[test_perm],
                      y[test_perm], max_iter=1500)

for epoch in range(1, 60):

   train(epoch)
   print('trian')
   acc = test()
   print(f'Epoch: {epoch}, Accuracy: {acc:.4f}')

我们有办法获得大约 40-50% 的准确度。

python deep-learning word-embedding graph-data-science
© www.soinside.com 2019 - 2024. All rights reserved.