DGL系列之(二):使用DGL实现GCN

import dgl
import dgl.function as fn
import torch as th
import torch.nn as nn
import torch.nn.functional as F
from dgl import DGLGraph

gcn_msg=fn.copy_src(src="h",out="m")
gcn_reduce=fn.sum(msg="m",out="h")#聚合邻居节点的特征

#定义节点的UDF apply_nodes  他是一个完全连接层
class NodeApplyModule(nn.Module):
    #初始化
    def __init__(self,in_feats,out_feats,activation):
        super(NodeApplyModule,self).__init__()
        self.linear=nn.Linear(in_feats,out_feats)
        self.activation=activation
    #前向传播
    def forward(self,node):
        h=self.linear(node.data["h"])
        if self.activation is not None:
            h=self.activation(h)
        return {"h":h}

#定义GCN模块  GCN模块的本质是在所有节点上执行消息传递  然后再调用NOdeApplyModule全连接层
class GCN(nn.Module):
    #初始化
    def __init__(self,in_feats,out_feats,activation):
        super(GCN,self).__init__()
        #调用全连接层模块
        self.apply_mod=NodeApplyModule(in_feats,out_feats,activation)
    #前向传播
    def forward(self,g,feature):
        g.ndata["h"]=feature#feature应该对应的整个图的特征矩阵
        g.update_all(gcn_msg,gcn_reduce)
        g.apply_nodes(func=self.apply_mod)#将更新操作应用到节点上
        
        return g.ndata.pop("h")

#利用cora数据集搭建网络然后训练
class Net(nn.Module):
    #初始化网络参数
    def __init__(self):
        super(Net,self).__init__()
        self.gcn1=GCN(1433,16,F.relu)#第一层GCN
        self.gcn2=GCN(16,7,None)
    #前向传播
    def forward(self,g,features):
        x=self.gcn1(g,features)
        x=self.gcn2(g,x)
        return x
net=Net()
net

#使用DGL内置模块加载cora数据集
from dgl.data import citation_graph as citegrh
import networkx as nx
def load_cora_data():
    data = citegrh.load_cora()#加载数据集
    features=th. FloatTensor(data.features)#特征向量  张量的形式
    labels=th.LongTensor(data.labels)#所属类别
    train_mask=th.BoolTensor(data.train_mask)#那些参与训练
    test_mask=th.BoolTensor(data.test_mask)#哪些是测试集
    g=data.graph
    g.remove_edges_from(nx.selfloop_edges(g))#删除自循环的边
    g = DGLGraph(g)
    g.add_edges(g.nodes(), g.nodes())
    return g, features, labels, train_mask, test_mask

g, features, labels, train_mask, test_mask=load_cora_data()


import matplotlib.pyplot as plt
nx.draw(g.to_networkx(),node_size=50,with_labels=True)
plt.show()

#测试模型
def evaluate(model, g, features, labels, mask):
    model.eval()#会通知所有图层您处于评估模式
    with th.no_grad():
        logits = model(g, features)
        logits = logits[mask]
        labels = labels[mask]
        _, indices = th.max(logits, dim=1)
        correct = th.sum(indices == labels)
        return correct.item() * 1.0 / len(labels)

#训练网络
import time
import numpy as np
g, features, labels, train_mask, test_mask = load_cora_data()

#定义优化器
optimizer=th.optim.Adam(net.parameters(),lr=1e-3)
dur=[]#时间
for epoch in range(100):
    print(epoch)
    if epoch>=3:
        t0=time.time()
    net.train()
    logits = net(g, features)
    logp = F.log_softmax(logits, 1)
    loss = F.nll_loss(logp[train_mask], labels[train_mask])

    optimizer.zero_grad()
    loss.backward()
    optimizer.step()

    if epoch >=3:
        dur.append(time.time() - t0)

    acc = evaluate(net, g, features, labels, test_mask)
    print("Epoch {:05d} | Loss {:.4f} | Test Acc {:.4f} | Time(s) {:.4f}".format(
            epoch, loss.item(), acc, np.mean(dur)))

  • 0
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
SAT(布尔可满足性问题)是计算机科学中一个非常重要的问题,其解决方法可以应用于很多领域,例如计算机科学、人工智能、计算机网络和密码学等。在SAT问题中,我们需要找到一组布尔变量的赋值,使得一个逻辑公式能够被满足。 DGL(Deep Graph Library)是一个用于图神经网络的Python库。它提供了一组高效的API,用于构建、训练和评估图神经网络模型。为了使用dgl实现SAT模型,我们可以将SAT问题转换为一个图结构,其中节点代表布尔变量,边代表逻辑关系。然后,我们可以使用dgl构建和训练图神经网络模型,以解决SAT问题。 以下是一个简单的SAT模型实现使用dgl库来构建和训练图神经网络模型: ``` import dgl import torch import torch.nn as nn import torch.nn.functional as F # Convert SAT problem to graph def sat_to_graph(clauses): g = dgl.graph() # Add nodes n = len(clauses) g.add_nodes(n) # Add edges for i in range(n): for j in range(n): if i != j: for a in clauses[i]: for b in clauses[j]: if a == -b: g.add_edge(i, j) return g # Define graph convolutional neural network model class GCN(nn.Module): def __init__(self, in_feats, hidden_feats, out_feats): super(GCN, self).__init__() self.conv1 = dgl.nn.GraphConv(in_feats, hidden_feats) self.conv2 = dgl.nn.GraphConv(hidden_feats, out_feats) def forward(self, g, inputs): h = self.conv1(g, inputs) h = F.relu(h) h = self.conv2(g, h) return h # Define training function def train(model, g, inputs, labels, optimizer): model.train() logits = model(g, inputs) loss = F.cross_entropy(logits, labels) optimizer.zero_grad() loss.backward() optimizer.step() return loss.item() # Define test function def test(model, g, inputs, labels): model.eval() with torch.no_grad(): logits = model(g, inputs) pred = logits.argmax(1) acc = (pred == labels).float().mean() return acc.item() # Define main function if __name__ == '__main__': # Define SAT problem clauses = [[1, 2, -3], [-1, -2, 3], [2, 3, 4], [1, -3, 4], [-2, -4]] # Convert SAT problem to graph g = sat_to_graph(clauses) # Define model and optimizer model = GCN(g.ndata['feat'].shape[1], 16, 2) optimizer = torch.optim.Adam(model.parameters(), lr=0.01) # Train and test model for epoch in range(100): loss = train(model, g, g.ndata['feat'], g.ndata['label'], optimizer) acc = test(model, g, g.ndata['feat'], g.ndata['label']) print('Epoch {:03d} | Loss {:.4f} | Accuracy {:.4f}'.format(epoch, loss, acc)) ``` 在这个例子中,我们首先将SAT问题转换为一个图结构,然后定义了一个包含两层图卷积层的GCN模型。我们使用Adam优化器来训练模型,每个epoch都计算训练损失和测试准确率。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值