基于多尺度图神经网络的流场预测,实现精度与速度的平衡
发布日期:2023-06-07 16:00浏览量:551次
-
论文链接
-
原文代码
-
GPU Memory >= 8GB
-
飞桨== 2.4.0
-
Python ==3.7.4 -
PGL == 2.2.4
-
Matplotlib == 3.5.3
-
pyamg == 4.2.3
-
scipy
2.conda install paddlepaddle-gpu==2.4.0 cudatoolkit=11.6 -c https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/Paddle/ -c conda-forge
3.pip install pgl==2.2.4
4.pip install matplotlib==3.5.3
5.pip install pyamg==4.2.3
6.pip install scipy
-
编码节点的特征和边的特征:
-
使用代数多重网格算法进行图粗化,这个过程中存在大量的稀疏矩阵乘法,例如:
-
在图恢复层中,源代码采用空间插值法进行上采样:
2. batch = MyCopy(graphs[0])
3. for index, graph in enumerate(graphs):
4. if index > 0:
5. batch = Myadd(batch, graph)
6.
7. latent_graph = self.encoder(batch)
8. x,p= self.processor(latent_graph)
9. node_features=self.spa_compute(x,p)
10. pred_field = self.decoder(node_features)
11.
12. return pred_field
2. coarse_nodes_input = paddle.repeat_interleave(coarse_nodes.unsqueeze(0), fine_nodes.shape[0], 0)
3. fine_nodes_input = paddle.repeat_interleave(fine_nodes.unsqueeze(1), coarse_nodes.shape[0], 1)
4. dist_w = 1.0 / (paddle.norm(x=coarse_nodes_input - fine_nodes_input, p=2, axis=-1) + 1e-9)
5. knn_value, knn_index = paddle.topk(dist_w, k=3, largest=True)
6. weight = knn_value.unsqueeze(-2)
7. features_input = features[knn_index]
8. output = paddle.bmm(weight, features_input).squeeze(-2) / paddle.sum(knn_value, axis=-1, keepdim=True)
9. return output
-
方案1:
2. index_E, value_E = FillZeros(index_E, value_E, standard_index, kN)
3.
4.def FillZeros(index_E, value_E, standard_index, kN):
5. shape = [kN, kN]
6. row_E = index_E[0]
7. col_E = index_E[1]
8. # coo_E = paddle.sparse.sparse_coo_tensor(index_E, value_E, shape)
9. DenseMatrix_E = sp.coo_matrix((paddle.ones_like(value_E), (row_E, col_E)), shape).toarray()
10.
11. row_S = standard_index[0]
12. col_S = standard_index[1]
13. DenseMatrix_S = sp.coo_matrix((paddle.ones([row_S.shape[0]]), (row_S, col_S)), shape).toarray()
14.
15. diff = DenseMatrix_S - DenseMatrix_E
16. rows, cols = np.nonzero(diff)
17. rows = paddle.to_tensor(rows, dtype = 'int32')
18. cols = paddle.to_tensor(cols, dtype = 'int32')
19. index = paddle.stack([rows, cols], axis=0)
20. value = paddle.zeros([index.shape[1]])
21. index_E = paddle.concat([index_E, index], axis=1)
22. value_E = paddle.concat([value_E, value], axis=-1)
23.
24. sp_x = paddle.sparse.sparse_coo_tensor(index_E, value_E)
25. sp_x = paddle.sparse.coalesce(sp_x)
26. index_E = sp_x.indices()
27. value_E = sp_x.values()
28.
29. return index_E, value_E
-
方案2:
2.('l1', paddle.nn.Linear(128, 256)), ('act1', paddle.nn.ReLU()),
3.('l2', paddle.nn.Linear(256, 256)), ('act2', paddle.nn.ReLU()),
4.# ('l3', paddle.nn.Linear(256, 256)), ('act3', paddle.nn.ReLU()),
5.('l4', paddle.nn.Linear(256, 128)), ('act4', paddle.nn.ReLU()),
6.('l5', paddle.nn.Linear(128, 1))
7.)
8.model_2 = paddle.nn.Sequential(
9.('l1', paddle.nn.Linear(1, 64)), ('act1', paddle.nn.ReLU()),
10.('l2', paddle.nn.Linear(64, 128)),('act2', paddle.nn.ReLU()),
11.# ('l3', paddle.nn.Linear(128, 128)),('act3', paddle.nn.ReLU()),
12.('l4', paddle.nn.Linear(128, 128))
13.)
14.
15.val_A = model_1(value_A)
16.val_A = paddle.squeeze(val_A)
17.index_E, value_E = StAS(index_A, val_A, index_S, value_S, N, kN, nor)
18.value_E = paddle.reshape(value_E, shape=[-1, 1])
19.edge_weight = model_2(value_E)
论文复现项目的代码链接为:
往期推荐
![](http://ai-public-console.cdn.bcebos.com/portal-pc-static/1738835561055/images/car.png)
体验AI
Web端 前往AI能力体验中心
移动端 打开百度APP“扫一扫”