wordpress打开高级设置360优化大师下载
- 作者: 多梦笔记
- 时间: 2026年02月18日 17:58
当前位置: 首页 > news >正文
wordpress打开高级设置,360优化大师下载,人际网络网络营销是什么,做网站的软件公司一、谱域图卷积#xff08;Spectral Domain Graph Convolution#xff09; 与谱域图卷积#xff08;Spectral Domain Graph Convolution#xff09;对应的是空间域#xff08;Spatial Domain#xff09;图卷积。本节学习的谱域图卷积指的是通过频率来理解卷积的方法。 …一、谱域图卷积Spectral Domain Graph Convolution 与谱域图卷积Spectral Domain Graph Convolution对应的是空间域Spatial Domain图卷积。本节学习的谱域图卷积指的是通过频率来理解卷积的方法。 二、ChebNet 上一节结尾我们将谱域图卷积写作 ( g ∗ g f ) U W U T f (g _g f) U W U^T f (g∗gf)UWUTf 这其实已经可以做一些任务了例如对于一个三维点云图特征为每个点的坐标或者法向量进行低通滤波可以把这个三维模型变得更加平滑。 而对于另一些任务就不大合适。例如我们有一张论文互相引用图特征为每篇论文的种类想要预测其中一些未标记的论文的种类。这时这种图卷积就暴露了一些问题例如参数量和图规模相关以至于不适合处理不同的图以及该处理方法过于全局缺乏局部信息。 于是我们重新考虑拉普拉斯矩阵。乘一次拉普拉斯矩阵相当于每个点聚合一次邻居的信息。那么乘两次就是聚合2跳邻居的信息。乘k次是k-hop信息。而 L k ( U Λ U T ) k U Λ k U T L^k (U\Lambda U^T)^k U\Lambda^kU^T Lk(UΛUT)kUΛkUT 因此我们可以这样修改信号处理方法。我们学习参数 θ 0 , … , θ k − 1 \theta0,…,\theta{k-1} θ0,…,θk−1代表不同距离邻居的重要程度令 W θ 0 Λ 0 … θ k − 1 Λ k − 1 W\theta0 \Lambda^0 …\theta{k-1} \Lambda^{k-1} Wθ0Λ0…θk−1Λk−1就是一个对这个任务不错的滤波函数。 不过ChebNet之所以叫ChebNet就是因为它出于种种复杂的原因使用了一个名为Chebyshev polynomial的技巧来拟合上述的 W W W。具体地 W ≈ ∑ k 0 K − 1 θ k T k ( Λ ~ ) W \approx \sum_{k0}^{K-1} \theta_k T_k(\tilde \Lambda) W≈k0∑K−1θkTk(Λ~) 其中 T 0 ( x ) 1 , T 1 ( x ) x , T k ( x ) 2 x T k − 1 ( x ) − T k − 2 ( x ) T_0(x)1,T_1(x)x,Tk(x)2xT{k-1}(x)-T_{k-2}(x) T0(x)1,T1(x)x,Tk(x)2xTk−1(x)−Tk−2(x) 为什么要使用切比雪夫多项式我看网上有些人说是为了降低复杂度但实际上计算 T k ( L ) Tk(L) Tk(L)应该并不会比计算 L k L^k Lk复杂度更低。实际上应该和切比雪夫多项式在信号处理中的性质有关由于我相关知识不足所以暂且略过。总之目前需要学到的是ChebNet引入的把参数量从和图中点数有关的 O ( n ) O(n) O(n)减少到 O ( 1 ) O(1) O(1)级别的思想。 而 Λ ~ \tilde \Lambda Λ~是对原 Λ \Lambda Λ进行放缩的值因为切比雪夫多项式要求参数取值在 [ − 1 , 1 ] [-1,1] [−1,1]之间所以对其进行了一个 Λ ~ 2 Λ λ m a x − I \tilde \Lambda\frac{2\Lambda}{\lambda{max}}-I Λ~λmax2Λ−I这样的缩放。接着代回到原式得 ( g ∗ g f ) ∑ k 0 K − 1 θ k T k ( L ~ ) f (gg f)\sum{k0}^{K-1} \theta_kTk(\tilde L)f (g∗gf)k0∑K−1θkTk(L~)f 其中 L ~ 2 L λ m a x − I \tilde L \frac{2L}{\lambda{max}}-I L~λmax2L−I 不过等等这么说我们还是得花费高额复杂度求特征值吗其实也不必因为我们可以相信神经网络参数对规模缩放的自适应性或许也可以使用一些估计方法取 l m a x ≈ 2 l_{max} \approx 2 lmax≈2即可。那么此时 L ~ D − 1 2 A D − 1 2 \tilde LD^{-\frac{1}{2}}AD^{-\frac{1}{2}} L~D−21AD−21。 至此我们已经解决了上一章讨论的所有问题 W W W不再与图结构相关。不需要计算特征向量。因为不需要计算特征向量不需求对称性保证正交基存在可以扩展用于有向图。可以拟合局部信息。 三、ChebNet的实现 接下来我们尝试实现一个简单的ChebNet。 在此我使用了小规模论文类别-引用关系数据集Cora可以使用torch_geometric.datasets来下载这个数据集。下载时如果出现超时问题可以参考这篇博客。 另外实际问题中的图一般都是稀疏图拉普拉斯矩阵也是稀疏矩阵可以用一些稀疏矩阵乘法方法加速过程。因为本篇笔记尚未讨论相关问题我还没学会此处给出使用邻接矩阵进行完整矩阵乘法的实现。 卷积核 class ChebConv(nn.Module):def init(self, in_channels, out_channles, K2,use_biasTrue):super(ChebConv, self).init()self.in_channels in_channelsself.out_channles out_channlesself.K Kself.use_bias use_biasself.weights nn.Parameter(torch.Tensor(K, 1, in_channels, out_channles))nn.init.xaviernormal(self.weights)if(use_bias):self.bias nn.Parameter(torch.FloatTensor(out_channles))else:self.register_parameter(bias, None)# 切比雪夫多项式其实可以提前实现而不必在卷积核里每次都重算一遍# 放在此处只是为了演示清晰def cheb_polynomial(self, laplacian):N laplacian.size(0)terms torch.zeros([self.K, N, N], devicelaplacian.device, dtypetorch.float32)terms[0] torch.eye(N, devicedevice, dtypetorch.float32)if(self.K 1):return termsterms[1] laplacianfor k in range(2, self.K):terms[k] 2.0 * torch.mm(laplacian, terms[k-1]) - terms[k-2]return terms # [K, N, N]def forward(self, inputs, laplacian):# inputs: [B, N, in_channels]# outputs: [B, N, out_channels]terms self.cheb_polynomial(laplacian).unsqueeze(1) # [K, 1, N, N]outputs torch.matmul(terms, inputs) # [K, B, N, in_channels]outputs torch.matmul(outputs, self.weights) # [K, B, N, out_channels]outputs torch.sum(outputs, dim0) #[B, N, out_channels]if(self.use_bias):outputs self.biasreturn outputs网络架构 class ChebNet(nn.Module):def init(self, in_channels, hidden_channels, out_channles, K2, droput0.5):super(ChebNet, self).init()self.conv1 ChebConv(in_channels, hidden_channels, K)self.conv2 ChebConv(hidden_channels, out_channles, K)self.dropout droputdef forward(self, x, laplacian):outputs1 self.conv1(x, laplacian)outputs1 outputs1.relu()outputs1 F.dropout(outputs1, pself.dropout, trainingself.training) outputs2 self.conv2(outputs1, laplacian)outputs2 outputs2.relu()return outputs2数据集处理及训练和测试
获取数据集Cora只有一组数据且不分训练和测试
dataset Planetoid(root./Cora, nameCora, transformNormalizeFeatures()) data dataset[0]device torch.device(cuda if torch.cuda.is_available() else cpu)# 定义模型 model ChebNet(in_channelsdataset.num_node_features,hidden_channels16,out_channlesdataset.num_classes,K3, droput0).to(device)# 邻接矩阵 def edge_index_to_adj(edge_index, num_nodes): # 构建一个大小为 (num_nodes, num_nodes) 的零矩阵 adj torch.zeros(num_nodes, num_nodes, dtypetorch.float32)# 使用索引广播机制一次性将边索引映射到邻接矩阵的相应位置上 adj[edge_index[0], edge_index[1]] 1.adj[edge_index[1], edge_index[0]] 1.return adjdef get_laplacian(adj, use_normalizeTrue):I torch.eye(adj.size(0), deviceadj.device, dtypeadj.dtype)if(use_normalize):D torch.diag(torch.sum(adj, dim-1) ** (-1 / 2))L I - torch.mm(torch.mm(D, adj), D)else:D torch.diag(torch.sum(adj, dim-1))L D - adjL - Ireturn L# 提前计算拉普拉斯矩阵 adj edge_index_to_adj(data.edge_index, data.num_nodes) laplacian get_laplacian(adj).to(device)# 定义损失函数和优化器 loss torch.nn.CrossEntropyLoss() optimizer torch.optim.Adam(paramsmodel.parameters(), lr 0.001, weight_decay5e-4)def train():model.train()optimizer.zero_grad() # 梯度清理y_hat model(data.x.unsqueeze(0).to(device), laplacian).squeeze(0)l loss(y_hat[data.train_mask].to(device), data.y[data.train_mask].to(device))l.backward() # 误差反向传播optimizer.step()return ldef test():model.eval()pred model(data.x.unsqueeze(0).to(device), laplacian).squeeze(0)pred pred.argmax(dim1)test_correct pred[data.test_mask] data.y[data.test_mask].to(device)test_acc int(test_correct.sum()) / int(data.test_mask.sum())return test_accepoch 501 for epoch in range(1, epoch):train_loss train()test_acc test()if epoch % 10 0:print(fepoch:{epoch} loss:{train_loss} test_acc:{testacc})四、从ChebNet的first-order近似到GCN从谱域理解GCN 对于ChebNet在 K 2 K2 K2的情况下卷积的定义为 g θ ∗ f θ 0 f − θ 1 D − 1 2 A D − 1 2 g\theta * f\theta_0 f - \theta_1 D^{-\frac{1}{2}}AD^{-\frac{1}{2}} gθ∗fθ0f−θ1D−21AD−21 如果我们进一步减少参数量取 θ 1 − θ 0 \theta_1-\theta0 θ1−θ0则此时有 g θ ∗ f θ ( I D − 1 2 A D − 1 2 ) f g\theta * f\theta (ID^{-\frac{1}{2}}AD^{-\frac{1}{2}})f gθ∗fθ(ID−21AD−21)f 到这一步已经离GCN很近了只缺少最后一点Renormalization Trick。 在上式中 I D − 1 2 A D − 1 2 ID^{-\frac{1}{2}}AD^{-\frac{1}{2}} ID−21AD−21的特征值范围在 [ 0 , 2 ] [0,2] [0,2]之间可以使用盖尔圆理论进行估计大于1的数反复相乘有可能引起数值不稳定和梯度爆炸的问题。而Renormalization Trick就是通过对图中所有点添加自环然后再统一归一化来估计一个特征值在 [ − 1 , 1 ] [-1,1] [−1,1]之间的 L ~ \tilde L L~。具体地 A ~ A I , D ~ i i ∑ j A ~ i j , L ~ D ~ − 1 2 A ~ D ~ − 1 2 \tilde A AI, \tilde D_{ii}\sumj \tilde A{ij}, \tilde L \tilde D^{-\frac{1}{2}}\tilde A\tilde D^{-\frac{1}{2}} A~AI,D~iij∑A~ij,L~D~−21A~D~−21 盖尔圆理论 若 A ( a i j ) ∈ C A(a{ij}) \in \mathbb{C} A(aij)∈C则第 i i i的盖尔圆为以 a i i a{ii} aii为圆心以 R i ∑ j ̸ i ∣ a i j ∣ Ri\sum{j \noti} |a{ij}| Ri∑ji∣aij∣为半径的圆。 A A A的所有特征值落在盖尔圆的并集之内。 I D − 1 2 A D − 1 2 ID^{-\frac{1}{2}}AD^{-\frac{1}{2}} ID−21AD−21的每一个盖尔圆都是以1为圆心以1为半径特征值取值范围 [ 0 , 2 ] [0,2] [0,2]。而 L ~ \tilde L L~的盖尔圆是以 1 D i i \frac{1}{D{ii}} Dii1为圆心以 1 − 1 D i i 1-\frac{1}{D_{ii}} 1−Dii1为半径的特征值取值范围 [ − 1 , 1 ] [-1,1] [−1,1]。 好的恭喜你也学会GCN了让我们来实现吧 五、GCN的实现 卷积核 class GCNConv(nn.Module):def init(self, in_channels, out_channles, use_biasTrue):super(GCNConv, self).init()self.in_channels in_channelsself.out_channles out_channlesself.use_bias use_biasself.weights nn.Parameter(torch.Tensor(in_channels, out_channles))nn.init.xaviernormal(self.weights)if(use_bias):self.bias nn.Parameter(torch.FloatTensor(out_channles))else:self.register_parameter(bias, None)def forward(self, inputs, laplacian):# inputs: [B, N, in_channels]# outputs: [B, N, out_channels]outputs torch.matmul(inputs, self.weights) # [B, N, out_channels]outputs torch.matmul(laplacian, outputs) # [B, N, out_channels]if(self.use_bias):outputs self.biasreturn outputs网络 class GCN(nn.Module):def init(self, in_channels, hidden_channels, out_channles, droput0.5):super(GCN, self).init()self.conv1 GCNConv(in_channels, hidden_channels)self.conv2 GCNConv(hidden_channels, out_channles)self.dropout droputdef forward(self, x, laplacian):outputs1 self.conv1(x, laplacian)outputs1 outputs1.relu()outputs1 F.dropout(outputs1, pself.dropout, trainingself.training) outputs2 self.conv2(outputs1, laplacian)outputs2 F.softmax(outputs2, dim2)return outputs2renormalization trick后的拉普拉斯矩阵计算 def get_laplacian(adj):I torch.eye(adj.size(0), deviceadj.device, dtypeadj.dtype)adj adj ID torch.diag(torch.sum(adj, dim-1) ** (-1 / 2))L torch.mm(torch.mm(D, adj), D)return L除了自己手写GCN卷积核以外还可以使用torch_geometric中的GCNConv实现此时传入的不再是拉普拉斯矩阵而是所有的边集edge index包中会用一些针对拉普拉斯矩阵的稀疏性质的方法加速计算 class GCN(nn.Module):def init(self, in_channels, hidden_channels, out_channles, droput0.5):super(GCN, self).init()self.conv1 GCNConv(in_channels, hidden_channels)self.conv2 GCNConv(hidden_channels, out_channles)self.dropout droputdef forward(self, x, edge_index):outputs1 self.conv1(x, edge_index)outputs1 outputs1.relu()outputs1 F.dropout(outputs1, pself.dropout, trainingself.training) outputs2 self.conv2(outputs1, edge_index)outputs2 F.softmax(outputs2, dim2)return outputs2
相关文章
-
wordpress搭建子網站淘宝网页制作教程视频
wordpress搭建子網站淘宝网页制作教程视频
- 站长
- 2026年02月18日
-
wordpress搭建网站有什么好外枣庄专业三合一网站开发
wordpress搭建网站有什么好外枣庄专业三合一网站开发
- 站长
- 2026年02月18日
-
wordpress搭建电子商城wordpress seo栏目标题
wordpress搭建电子商城wordpress seo栏目标题
- 站长
- 2026年02月18日
-
wordpress打开网站加速jsp做的网站后台信息
wordpress打开网站加速jsp做的网站后台信息
- 站长
- 2026年02月18日
-
wordpress大数据插件seo的宗旨是
wordpress大数据插件seo的宗旨是
- 站长
- 2026年02月18日
-
wordpress大型站点郑州 公司网站制作
wordpress大型站点郑州 公司网站制作
- 站长
- 2026年02月18日
