PyTorch第三方库 2. GNN使用PyG的实现( 四 )


很明显=4,即有4个不同的类别
3. Graph网络定义
GCN layer(与上述继承基类的 略有不同)
import torchfrom torch.nn import Linearfrom torch_geometric.nn import GCNConvclass GCN(torch.nn.Module):def __init__(self):super().__init__()torch.manual_seed(1234)#设置随机种子是为了确保每次生成固定的随机数# 定义输入特征和输出特征即可self.conv1 = GCNConv(dataset.num_features,4)#dataset.num_features:34维向量,经过这一层得到4维向量self.conv2 = GCNConv(4,4)self.conv3 = GCNConv(4,2)#连接全连接self.classifier = Linear(2,dataset.num_classes)# 4个类别概率值def forward(self,x,edge_index):h = self.conv1(x,edge_index)#输入特征与邻接矩阵x:图(有每个点的特征),edge_index(邻接矩阵)h = h.tanh()h = self.conv2(h,edge_index)h = h.tanh()h = self.conv3(h,edge_index)h = h.tanh()#分类层,即FCout = self.classifier(h)return out,h #out为输出结果,h为得到的中间结果【self.conv3 = GCNConv(4,2)】,即两维向量model = GCN()print(model)'''GCN((conv1): GCNConv(34, 4)(conv2): GCNConv(4, 4)(conv3): GCNConv(4, 2)(classifier): Linear(in_features=2, out_features=4, bias=True))'''
4. 输出特征展示
def visualize_embedding(h,color,epoch=None,loss=None):plt.figure(figsize=(7,7))plt.xticks([])plt.yticks([])#detach(): 返回一个新的Tensor,但返回的结果是没有梯度的 。cpu():把gpu上的数据转到cpu上 。numpy():将tensor格式转为numpyh = h.detach().cpu().numpy()plt.scatter(h[:,0],h[:,1],s=140,c=color,cmap="Set2")if epoch is not None and loss is not None:plt.xlabel(f"Epoch:{epoch},Loss:{loss.item():.4f}",fontsize=16)plt.show()# 展示输出的两维特征(还未训练前)model = GCN()_, h = model(data.x,data.edge_index)print(f'Embedding Shape:{list(h.shape)}') #Embedding Shape:[34, 2]visualize_embedding(h,color=data.y)
上图为随机初始化的两维向量
5. 训练模型(Semi-)
import timemodel = GCN()criterion = torch.nn.CrossEntropyLoss() #define loss criterion 分类损失函数optimizer = torch.optim.Adam(model.parameters(),lr=0.01)#优化器#traindef train(data):optimizer.zero_grad()#梯度清零out,h = model(data.x,data.edge_index)#h为两维向量主要是为了展示画图loss = criterion(out[data.train_mask],data.y[data.train_mask])#data.train_mask 即看train_mask为True的,即只看有标签的结点#semi-supervised:只关注有标签的那些loss.backward()#反向传播optimizer.step()#参数更新return loss,h#迭代for epoch in range(401):#1个epoch即1个图loss,h = train(data)#每10个epoch去画一个图if epoch ==0:visualize_embedding(h,color=data.y,epoch=epoch,loss=loss)time.sleep(0.3) #让画停一下
向量聚堆的感觉,特征分类示意图
【一些PyG的数据类型】 Data 类(PyG的数据结构)
一些data的方法和属性补充:
-PyG包含了很多公用的数据集,所有数据集(Cora, , ) 。来自 | TUD的所有图分类数据集,和其简洁版,QM7和QM9数据集等等 。
Batch类【详情可参考】
番外篇:PyG框架及Cora数据集简介 - 知乎由于GNN的输入是不规则的graph,所以在训练中无法方便地像image或text输入数据,该篇文章介绍PyG框架,介绍部分基本上来自于PyG的文档的前面两节 。介绍Cora数据集是因为在该篇之后会单独再发一篇使用PyG框架及原生…

PyTorch第三方库  2. GNN使用PyG的实现

文章插图
Mini-(Batch类是继承Data的,是自动生成的)
神经网络通常以批量方式进行训练 。PyG 通过创建稀疏块对角邻接矩阵(由定义)并在节点维度上连接特征和目标矩阵来实现小批量的并行化 。这种设计使得我们可以将不同规模的图放在同一个batch中 。