GNN/GCA中创建无向图实例中的小提示

部署运行你感兴趣的模型镜像
import torch
import torch.nn as nn
import torch.optim as optim
import dgl
from dgl.nn.pytorch import GraphConv

class GCA(nn.Module):
    def __init__(self, in_feats, hidden_size, out_feats):
        super(GCA, self).__init__()
        self.encoder = nn.Sequential(
            GraphConv(in_feats, hidden_size),
            nn.ReLU()
        )
        self.decoder = nn.Sequential(
            GraphConv(hidden_size, out_feats),
            nn.Sigmoid()
        )

    def forward(self, g, x):

        h = self.encoder[0](g, x)
        h = self.encoder[1](h)

        x_recon = self.decoder[0](g, h)
        x_recon = self.decoder[1](x_recon)
        return x_recon

# 创建图数据
def create_graph():


    g = dgl.graph(( torch.tensor([0,1,2,3]), torch.tensor([1,2,3,0]) ))
    #g = dgl.add_self_loop(g)

    features = torch.tensor([[1, 2, 3, 4],
                             [2, 3, 4, 1],
                             [3, 4, 1, 2],
                             [4, 1, 2, 3]], dtype=torch.float32)
    return g, features

# 初始化
g, x = create_graph()
g = g.to('cpu')
x = x.to('cpu')

model = GCA(in_feats=4, hidden_size=64, out_feats=4)
optimizer = optim.Adam(model.parameters(), lr=0.01)
criterion = nn.MSELoss()

model.train()

print(f"Graph has {g.number_of_nodes()} nodes and {g.number_of_edges()} edges")


for epoch in range(200):
    optimizer.zero_grad()
    x_recon = model(g, x)
    loss = criterion(x_recon, x)
    loss.backward()
    optimizer.step()
    print(f'Epoch: {epoch:03d}, Loss: {loss.item():.4f}')

 针对自己在学习GCN中遇到的一些问题,在这里简单记录一下。

这是我在模拟实现一个简单的图自编码器中遇到的一些问题:

1.当运行这段代码时,初始创建图g的代码如下:g = dgl.graph((torch.tensor([1, 2, 3, 4]), torch.tensor([2, 3, 4, 1]))),而节点特征矩阵创建如代码所示,是一个4×4的矩阵。在上述创建完毕后点击运行,大概率会出现'RuntimeError: The size of tensor a (4) must match the size of tensor b (5) at non-singleton dimension 0'的错误,这是因为出现了维度不匹配的问题,在(torch.tensor([1,2,3,4]),torch.tensor([2,3,4,1]))中,graph是根据索引值进行创建,所以代码默认从下标索引为1开始创建,其中就多包含了索引值为0的节点,这就是'

print(f"Graph has {g.number_of_nodes()} nodes and {g.number_of_edges()} edges")

'打印出来会显示5个node的原因,所以在创建图g的时候,一定是要从索引为0开始。如上述代码中创建的图则为:0->1,1->2,2->3,3->0。

2. 很多时候会出现from dgl.nn import GraphConv 中GraphConv标红,显示在'__init__'中找不到什么GraphConv,只要将导入语句修改为“ from dgl.nn.pytorch import GraphConv”就ok了。


您可能感兴趣的与本文相关的镜像

PyTorch 2.5

PyTorch 2.5

PyTorch
Cuda

PyTorch 是一个开源的 Python 机器学习库,基于 Torch 库,底层由 C++ 实现,应用于人工智能领域,如计算机视觉和自然语言处理

评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值