宝应县天宇建设网站,做网站流量赚钱,wordpress输网址采集,免费服务器试用文章说明#xff1a; 1)参考资料#xff1a;PYG官方文档。超链。 2)博主水平不高#xff0c;如有错误还望批评指正。 3)我在百度网盘上传了这篇文章的jupyter notebook。超链。提取码8888。 文章目录 代码实操1#xff1a;GCN的复杂实现代码实操2#xff1a;GCN的简单实现…文章说明 1)参考资料PYG官方文档。超链。 2)博主水平不高如有错误还望批评指正。 3)我在百度网盘上传了这篇文章的jupyter notebook。超链。提取码8888。 文章目录 代码实操1GCN的复杂实现代码实操2GCN的简单实现代码实操3GAT的简单实现 代码实操1GCN的复杂实现
导入绘图的库定义绘图函数。
from sklearn.manifold import TSNE
import matplotlib.pyplot as pltdef visualize(h,color):zTSNE(n_components2).fit_transform(h.detach().cpu().numpy())plt.figure(figsize(10,10))plt.xticks([])plt.yticks([])plt.scatter(z[:,0],z[:,1],s70,ccolor,cmapSet2)plt.show()目前我并不知道TSNE降维理论。所以暂时把它作为一种降维并且可视化的技术。 导入对应的库导入对应的数据集导入对应的库。
from torch_geometric.transforms import NormalizeFeatures
from torch_geometric.datasets import PlanetoiddatasetPlanetoid(root/DATA/Planetoid,nameCora,transformNormalizeFeatures())
datadataset[0]
#确定具体的图Cora数据集简单说明特征矩阵 N × M N \times M N×M N N N表示为论文数量 M M M表示为特征维度对于每维如果单词在论文中就是1反之0。邻接矩阵 N × N N \times N N×N N N N表示为论文数量论文间存在引用之间就有一条边。 其他说明这段代码会在C盘生成一个叫做DATA的文件并将数据集放在DATA之中有强迫症注意一下。
import torch.nn.functional as F
from torch.nn import Linear
import torch搭建一个多层的感知机训练模型并且得到结果。
class MLP(torch.nn.Module):def __init__(self,hidden_channels):super().__init__()self.lin1Linear(dataset.num_features,hidden_channels)self.lin2Linear(hidden_channels,dataset.num_classes)def forward(self,x):xself.lin1(x)xx.relu()xF.dropout(x,p0.5,trainingself.training)xself.lin2(x)return xmodelMLP(hidden_channels16)
print(model)
#输出
#MLP(
# (lin1): Linear(in_features1433, out_features16, biasTrue)
# (lin2): Linear(in_features16, out_features7, biasTrue)
#)modelMLP(hidden_channels16)
criteriontorch.nn.CrossEntropyLoss()
optimizertorch.optim.Adam(model.parameters(),lr0.01,weight_decay5e-4)def train():model.train()optimizer.zero_grad()outmodel(data.x)losscriterion(out[data.train_mask],data.y[data.train_mask])loss.backward()optimizer.step()return lossdef test():model.eval()outmodel(data.x)predout.argmax(dim1)test_correctpred[data.test_mask]data.y[data.test_mask]test_accint(test_correct.sum())/int(data.test_mask.sum())return test_accfor epoch in range(1,201):losstrain()print(fEpoch: {epoch:03d}, Loss: {loss:.4f})
#这里就不展示输出test_acctest()
print(fTest Accuracy: {test_acc:.4f})
#输出Test Accuracy: 0.5750导入对应的库搭建图神经网络GCN
from torch_geometric.nn import GCNConvclass GCN(torch.nn.Module):def __init__(self,hidden_channels):super().__init__()self.conv1GCNConv(dataset.num_features,hidden_channels)self.conv2GCNConv(hidden_channels,dataset.num_classes)def forward(self,x,edge_index):xself.conv1(x,edge_index)xx.relu()xF.dropout(x,p0.5,trainingself.training)xself.conv2(x,edge_index)return x
modelGCN(hidden_channels16)
print(model)
#输出
#GCN(
# (conv1): GCNConv(1433, 16)
# (conv2): GCNConv(16, 7)
#)可视化图嵌入(这里只有正向传播)
modelGCN(hidden_channels16)
model.eval()
outmodel(data.x,data.edge_index)
visualize(out,colordata.y)进行训练得出结果
modelGCN(hidden_channels16)
optimizertorch.optim.Adam(model.parameters(),lr0.01,weight_decay5e-4)
criteriontorch.nn.CrossEntropyLoss()def train():model.train()optimizer.zero_grad()outmodel(data.x, data.edge_index)losscriterion(out[data.train_mask],data.y[data.train_mask])loss.backward()optimizer.step()return lossdef test():model.eval()outmodel(data.x,data.edge_index)predout.argmax(dim1)test_correctpred[data.test_mask]data.y[data.test_mask]test_accint(test_correct.sum())/int(data.test_mask.sum())return test_accfor epoch in range(1,101):losstrain()print(fEpoch: {epoch:03d}, Loss: {loss:.4f})
#这里就不展示输出test_acctest()
print(fTest Accuracy: {test_acc:.4f})
#输出Test Accuracy: 0.8010可视化图嵌入(训练过后)
代码实操2GCN的简单实现
这是PYG官方文档的代码就以难度而言其实就是少了可视化的东西。构建GCN的框架不同使用损失函数不同。
from torch_geometric.datasets import Planetoid
from torch_geometric.nn import GCNConv
import torch.nn.functional as F
import torch
class GCN(torch.nn.Module):def __init__(self):super().__init__()self.conv1GCNConv(dataset.num_node_features,16)self.conv2GCNConv(16,dataset.num_classes)def forward(self,data):x,edge_indexdata.x,data.edge_indexxself.conv1(x,edge_index)xF.relu(x)xF.dropout(x,trainingself.training)xself.conv2(x,edge_index)return F.log_softmax(x,dim1)
datasetPlanetoid(root/DATA/Cora,nameCora)
devicetorch.device(cuda if torch.cuda.is_available() else cpu)
modelGCN().to(device)
datadataset[0].to(device)
optimizertorch.optim.Adam(model.parameters(),lr0.01,weight_decay5e-4)
model.train()
for epoch in range(200):optimizer.zero_grad()outmodel(data)lossF.nll_loss(out[data.train_mask],data.y[data.train_mask])loss.backward()optimizer.step()
model.eval()
predmodel(data).argmax(dim1)
correct(pred[data.test_mask]data.y[data.test_mask]).sum()
accint(correct)/int(data.test_mask.sum())
print(fAccuracy: {acc:.4f})
#输出Accuracy: 0.8090代码实操3GAT的简单实现
这里操作同上代码略有不同。
from torch_geometric.datasets import Planetoid
from torch_geometric.nn import GATConv
import torch.nn.functional as F
import torch
class GCN(torch.nn.Module):def __init__(self):super().__init__()self.conv1GATConv(dataset.num_node_features,16)self.conv2GATConv(16,dataset.num_classes)def forward(self,data):x,edge_indexdata.x,data.edge_indexxF.dropout(x,p0.6,trainingself.training)xself.conv1(x,edge_index)xF.relu(x)xF.dropout(x,p0.6,trainingself.training)xself.conv2(x,edge_index)return x
datasetPlanetoid(root/DATA/Cora,nameCora)
devicetorch.device(cuda if torch.cuda.is_available() else cpu);modelGCN().to(device);datadataset[0].to(device)
optimizertorch.optim.Adam(model.parameters(),lr0.05,weight_decay5e-4);criteriontorch.nn.CrossEntropyLoss()
model.train()
for epoch in range(200):optimizer.zero_grad()outmodel(data)losscriterion(out[data.train_mask],data.y[data.train_mask])loss.backward()optimizer.step()
model.eval()
predmodel(data).argmax(dim1);correct(pred[data.test_mask]data.y[data.test_mask]).sum();accint(correct)/int(data.test_mask.sum())
print(fAccuracy: {acc:.4f})
#输出Accuracy: 0.7980