基于多尺度图神经网络的流场预测,实现精度与速度的平衡

news2024/11/28 16:51:53

13dfa396505c1965e9a8c9a6260ae35d.gif

f2a21154b03422f3278524d79907553a.png

1bd0a5175dc1914cd4e5090b948b5437.png项目简介

本项目来源于飞桨AI for Science共创计划的论文复现赛题,复现论文为《AMGNET: multi-scale graph neural networks for flow field prediction》。该论文主要采用图神经网络,因为在计算流体力学中计算域被网格离散化,这与图结构天然契合。论文中通过训练 CFD 仿真数据,构建一种数据驱动模型进行流场预测。本文将与大家分享基于飞桨完成该论文的复现过程,欢迎大家一起沟通学习。

  • 论文链接

https://doi.org/10.1080/09540091.2022.2131737

  • 原文代码

https://github.com/baoshiaijhin/amgnet、

84d8ec26e40c031f0c5ab4ca88c59df4.png

环境依赖

93ef0b2c6b43e2f131a74adc788e1711.png

硬件与框架

本项目需要的硬件环境与框架要求如下所示:

  • GPU Memory >= 8GB

  • 飞桨== 2.4.0

  • Python ==3.7.4

  • PGL == 2.2.4

  • Matplotlib == 3.5.3

  • pyamg == 4.2.3

  • scipy

946663824387604432d9c82211a7b1c0.png

本地安装

通过以下指令完成飞桨以及各个库的安装。

1.conda create -n paddle_env python=3.7  
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

175e77f9a7f2be65f0ab12ffee27a533.png

模型介绍

aa2de8bad73ba4655c3a879de25d43bc.png

模型框架

AMGNET 是一种基于图神经网络的 CFD 计算模型,该模型可以预测在不同物理参数下的流场。图3.1为模型的网络结构图,该模型的基本原理就是将网格结构转化为图结构,然后通过网格中节点的物理信息、位置信息以及节点类型对图中的节点和边进行编码。接着对得到的图神经网络使用基于代数多重网格算法( Olson and Schroder, 2018 )的粗化层进行粗化,将所有节点分类为粗节点集和细节点集,其中粗节点集是细节点集的子集。粗图的节点集合就是粗节点集,于是完成了图的粗化,缩小了图的规模。粗化完成后通过设计的图神经网络信息传递块( GN )来总结和提取图的特征。之后图恢复层采用反向操作,使用空间插值法( Qi et al.,2017 )对图进行上采样。例如要对节点i插值,则在粗图中找到距离节点i最近的k个节点,然后通过公式计算得到节点i的特征。最后,通过解码器得到每个节点的速度与压力信息。

e2bd77a1de37012b44554b2f464433a2.png

图3.1 网络结构图

03fc6623a5682319b49161e1771a3daf.png

论文源码

原文的代码总体上可以分为4个部分,分别是数据预处理、图粗化层、图卷积块和图恢复层。如图3.2所示。

9fbf1f4d02ff3d5c7cded1b8ac161b4f.png

图3.2 原文代码结构

原文代码的关键技术要点如下:

  • 编码节点的特征和边的特征:

进而将原始网格数据变换为图结构的数据。

  • 使用代数多重网格算法进行图粗化,这个过程中存在大量的稀疏矩阵乘法,例如:

其中,A表示图的邻接矩阵。

  • 在图恢复层中,源代码采用空间插值法进行上采样:

其中,ri表示要恢复的节点i的特征,wij表示节点i和节点j之间距离的倒数。

a27ce73611effda6336ded8c02e9a214.png

飞桨复现的技术要点

在模型中我们需要使用图神经网络模拟网格,基于图这种数据结构模拟物理场的状态,于是我们调用了飞桨的 PGL 库。由于模型进行图数据的粗化时进行了大量的稀疏矩阵运算,为了提高运算效率,减少运算时间,我们需要对图进行合并。但是 PGL 是以列表的形式存储图,所以在图数据进入模型之前需要预处理,如下:

1.def forward(self, graphs):  
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

在基于代数多重网格的图粗化层中,我们将图粗化到不同的尺度,然后使用 GN 块通过消息传递来总结和提取图的特征。与基于代数多重网格的图粗化层相比,图恢复层采用反向操作。在图恢复层中,我们使用空间插值方法对图进行上采样,空间插值法的实现如下:

1.def knn_interpolate(features, coarse_nodes, fine_nodes):  
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

使用代数多重网格算法对图进行粗化时,涉及大量的稀疏矩阵乘法,于是我们调用了 scipy.sparse 库。但是 scipy.sparse 库中的.dot 方法和如今大部分深度学习框架中的稀疏矩阵乘法不同,后者会保留一些0,而前者只存非零值。这种差异会导致数据维度不一致,进而影响之后的操作。针对这个问题,我们提出了两种解决方案,第一种是采用填充的方法保持数据维度,第二种是采用编码器与解码器将特征维度进行压缩。其中第一种方法与代数多重网格算法保持一致,精度较高。第二种方法提高了约20倍的训练速度,但是均方根误差会略高。两种方案的代码如下:

  • 方案1:

1.if (index_E.shape[1] != standard_index.shape[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:

1.model_1 = paddle.nn.Sequential(  
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)

2affe285fc24189ee89259809d90fa19.png预测结果

我们的模型按照论文给的案例,分别在机翼和圆柱这两种不同的物理场景中进行预测,其中机翼采用 NACA0012 翼型,表示翼型的网格包含6648个节点。圆柱体网格包含3887个节点。所有网格均由三角形和四边形网格组成。翼型在稳态、可压缩和无粘性条件下由 Navier-Stokes 方程控制。圆柱在稳态、不可压缩和无粘性条件下由 Navier-Stokes 方程控制。预测结果表明,我们的模型预测的流场与真实流场基本相同,能够达到原文的精度,证明复现成功。我们模型对圆柱和机翼的预测结果如图4.1和图4.2所示。原文的预测结果如图4.3所示,其中原文的预测结果图采用了专业的流体力学软件绘制。

9eddc7338b5bf2f75ba27744e04c6e7f.png图4.1 雷诺数=78的圆柱速度场的预测值与真实值对比图

846f33eac416c081c1430cbd3929e967.png图4.2 攻角=8.0,马赫数=0.65下的机翼压力场的预测值与真实值对比图

bc58fc02acb7c6019f3697aae0bed4b0.png

图4.3 原文中雷诺数=78的圆柱速度场的预测(左图);攻角=8.0,马赫数=0.65的机翼压力场的预测(右图)

a70f9f9c68740b1760f3254e226c5553.png

结语

这是我们团队第一次参加百度飞桨的论文复现赛,这次比赛的经历让我们受益良多。首先,飞桨的复现赛赛事流程安排非常合理,我们被要求阅读论文,然后跑通论文的原始参考代码,这使得我们对论文的整体思路和原始代码有了清晰的了解。在复现的过程中,我们快速了解两种框架之间的差异,使用API映射表顺利切换和使用不同的框架。尽管有一些 API 无法完全对应,但我们可以进行适当地改动或重写来解决这个问题。第二,飞桨团队为这个比赛提供了优秀的平台、充足的资源以及充分的指导,这使我们能够更好地理解论文和实现代码。他们的反馈对我们复现的结果和进一步改进非常有帮助。最后,特别感谢论文作者杨志双学长以及实验室的李天宇师兄对本次复现工作提供的技术指导和专业知识讲解。

参与飞桨的论文复现赛是一次宝贵的学习和成长机会。我学到了很多关于论文复现和深度学习框架转换的知识,也结识了许多志同道合的同学和专业人士。未来,我们期待看到更多来自企业、高校、科研院所以及超算的小伙伴,加入飞桨 AI for Science 共创计划,参与建设基于飞桨的 AI for Science 领域顶尖开源项目和开源社区。

论文复现项目的代码链接为:

https://aistudio.baidu.com/aistudio/projectdetail/5592458

往期推荐

  • 基于数据驱动 U-Net 模型的大气污染物扩散快速预测,提升计算速度近6000倍

58bbae330da3f014173eabe9c1833cf1.gif

关注【飞桨PaddlePaddle】公众号

获取更多技术内容~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/626628.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

将PDF1页分割为4页

运行效果 原始PDF 分割后PDF 一、python代码(用的是python3.9.0版本) import os import tempfile from pdf2image import convert_from_path from PIL import Image from PyPDF2 import PdfReader, PdfWriterdef split_pdf_page(pdf_path, output_path…

4G开发板-安卓手机开发套件-MTK主板开发板定制

开发板是一种用于嵌入式系统开发的电路板,它包含了各种硬件组件,如中央处理器、存储器、输入设备、输出设备、数据通路/总线以及外部资源接口等。为了满足特定的开发需求,嵌入式系统开发者通常会根据项目要求来定制开发板,当然用户…

2023年前端面试高频考点ES6

目录 ES6新增 数据类型 基本数据类型 引用数据类型 Null,NaN,Undefined toString,valueOf ,,Object.is() 判断数据类型:typeof运算符,instance of运算符,isPrototypeOf() 方…

数据分析第11课pandas时间序列(上+下)-第12期15,16课

数据分析思维:有逻辑性, 课前练习1 各大平台相继推出和迭代付费会员策略,如优酷会员、京东PLUS会员、网易云音乐黑胶VIP等,通过提供丰富的权益吸引用户成为付 费会员,提升用户黏性和忠诚度。请围绕付费会员回答以下问题: 以网易云音乐黑胶VIP为例,运营同学希望推出活动…

k8s 使用helm安装longhorn存储控制器

1.安装helm 参考:k8s helm安装使用_Apex Predator的博客-CSDN博客 2.配置基础环境 安装longhorn存储控制器需要用到iSCSI工具,所以需要在k8s所有节点上安装 yum -y install iscsi-initiator-utils 3.安装longhorn 3.1配置helm镜像源 helm repo ad…

kafka Ar 、ISR 、 OSR 已分配副本 同步中副本 、不同步副本 Controller 执行leader 重新分配

目录 Ar 、ISR 、 OSR 已分配副本 同步中副本 、不同步副本 Controller 执行leader 重新分配 Ar 、ISR 、 OSR 已分配副本 同步中副本 、不同步副本 AR分区所有已分配副本 ISR 在同步中的副本OSR 不同步副本 如果有一个节点挂掉,分区领导会渠道其他地方当上领导…

Git的理解以及在IDEA中的使用

什么是版本控制 版本控制是指记录一段时间内对一个文件或一组文件的更改的系统,称为“版本”。换句话说,这些版本将帮助您跟踪代码/项目中的更改,如果需要,还可以撤消这些更改。 当处理较大的项目时,这种能够比较、区…

“RAID0 vs RAID1 vs RAID5 vs RAID6 vs RAID10:哪种RAID级别最适合你的需求?“

概要: RAID(Redundant Array of Independent Disks)是一种数据存储技术,可以将多个硬盘组合起来以提高性能、可靠性和容错能力。下面是几种常见的RAID级别,以及它们的用途和特点。 目录 RAID 0RAID 1RAID 5RAID 6RAID…

navicat 怎么导入运行bak文件,详细教程

文章目录 一、新建数据库,点击高级设置访问权限二、点击SQL Server备份三、右击空白,点击从文件还原四、找到备份的bak文件五、 点击“高级”选项六、然后点击 生产SQL,最后点 还原 一、新建数据库,点击高级设置访问权限 二、点击…

Opencv-python 将图片中某段HSV范围内的所有像素去除,用白色替换

文章目录 前言一、效果二、代码1.思路2.代码解释 总结 前言 本次实验要求将模拟飞行座舱图像中的HUD绿色字体去掉,并且用白色来替代,最终输出没有绿色字体的图片,用于下一步的某种图像算法的输入。 一、效果 二、代码 1.思路 将一张图片中的…

经验教训:微服务设计时的五条宝贵经验

微服务架构的新挑战 在著名软件著作《人月神话》中提到,软件世界没有“银弹”,这句话当然适用于架构领域,随着从单体架构过渡到微服务架构,因为将原有系统打散,给系统增加了许多不稳定因素。 单体架构向微服务架构转变…

【服务器数据恢复】断电导致RAID无法找到存储设备的数据恢复案例

服务器数据恢复环境: HP EVA存储,6块SAS硬盘组建的raid5磁盘阵列。上层操作系统是WINDOWS SERVER。该存储为公司内部文件服务器使用。 服务器故障&分析: 在遭遇两次意外断电后,设备重启时raid提示“无法找到存储设备”。管理员…

值得推荐收藏的 9个免费PDF转PPT的方法

随着现在工作和学习越来越多涉及到电子文件,PDF格式已经成为了一种非常重要的文件格式。但有时候需要将PDF文件转换为PPT格式,因为PPT格式更适合用于演示和公开演讲等场合。而转换PDF文件到PPT格式则需要使用专用工具。以下是9个免费的PDF转PPT的方法介绍…

蓝牙耳机都能打电话吗,分享几款通话效果不错的骨传导耳机

骨传导耳机的兴起是近几年来才出现的新概念,骨传导耳机也是近几年来才开始流行起来,在我看来骨传导耳机的兴起是科技进步的产物。随着蓝牙耳机技术和设备的发展,蓝牙耳机也越来越普及,但是也给用户带来了很多困扰。而骨传导耳机就…

好用的电容笔有哪些推荐?性价比高的触控笔

电容笔的选购对新手来说难度很大,看到网友们都在讨论电容笔什么牌子的好用,电容笔怎么挑选?小编今天也来详细解答这个问题,盘点四款好用的平价电容笔,如果你想知道性价比高电容笔推荐哪些,那这篇文章一定不…

什么是 Vue 的片段(Fragment)?如何使用片段?

什么是 Vue 的片段(Fragment)?如何使用片段? 在 Vue 2.6.0 版本中,新增了一个特性:片段(Fragment)。片段是一种特殊的组件,可以让开发者在不增加额外节点的情况下渲染多…

2023年第二届计算与人工智能国际会议(ISCAI 2023)

会议简介 Brief Introduction 2023年第二届计算与人工智能国际会议(ISCAI 2023) 会议时间:2023年10月13 -15日 召开地点:中国上海 大会官网:www.iscai.org 2023年第二届计算与人工智能国际会议(ISCAI 2023)将围绕“计算与人工智能”的最新研究…

ETC人车关系查询-ETC人车关系查询api接口

接口地址: https://登录后显示/api/189/363(支持:http/https)) 接口页面:https://www.wapi.cn/api_detail/189/363.html 网站地址:https://www.wapi.cn 接口简介:核验指定人员/企业是否是指定车辆的 ETC 开户人、车辆所有人或 E…

【c/c++】属于程序员的浪漫,基于easyx.h图形库实现3D Heart

文章目录 😏专栏导读🤖文章导读🙀一、easyX图形库基本介绍?1、easyX的原理:2、easyX的安装🙀3D Heat源码描述 😳3D Heat效果展示总结 😏专栏导读 👻作者简介:…

ssm+java汽车销售分析与管理系统

此次设计一款汽车销售分析与管理系统,能够对当前销售的车辆的日销售、季度销售以及年度销售进行统计分析、对于车辆的入库出库进行了准确的信息录入。对于销售人员的销售情况进行登记和统计,能够对整个店面的财务情况、盈利情况进行统计。同时对于以上数…