Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

2d圆柱绕流算例中用于训练的dataset的疑问 #293

Closed
jiangzhangze opened this issue May 10, 2023 · 26 comments
Closed

2d圆柱绕流算例中用于训练的dataset的疑问 #293

jiangzhangze opened this issue May 10, 2023 · 26 comments

Comments

@jiangzhangze
Copy link

datasets中的各个csv文件分别代表什么呢?
domain_cylinder.csv,domain_inlet.csv,domain_outlet.csv分别包含了圆柱上,入口,出口的网格和初始时刻数据,domain_train.csv包含整个流场的初始时刻.这样理解对吗?
在initial文件夹中的csv,又是哪个时刻的流场数据呢,因为我看ic0.1.csv中的速度和压力不是初始时刻的数据。
在probes文件夹中的50个probes文件又是代表的什么.

如果我想自己生成数据,放到脚本中直接来训练,也应该按照这个格式吗

@HydrogenSulfate
Copy link
Collaborator

HydrogenSulfate commented May 16, 2023

hi,现在在AIStudio上应该已经提供了数据集了
https://paddlescience-docs.readthedocs.io/zh/latest/zh/examples/cylinder2d_unsteady/
最近我们会上传数据集供用户直接下载使用,暂时先在Aistudio上下载一下数据集吧,谢谢

@HydrogenSulfate
Copy link
Collaborator

datasets中的各个csv文件分别代表什么呢? domain_cylinder.csv,domain_inlet.csv,domain_outlet.csv分别包含了圆柱上,入口,出口的网格和初始时刻数据,domain_train.csv包含整个流场的初始时刻.这样理解对吗? 在initial文件夹中的csv,又是哪个时刻的流场数据呢,因为我看ic0.1.csv中的速度和压力不是初始时刻的数据。 在probes文件夹中的50个probes文件又是代表的什么.

如果我想自己生成数据,放到脚本中直接来训练,也应该按照这个格式吗

数据集已经上传完毕,可以按照以下命令运行 cylinder2d_unsteady_Re100 案例

python download_dataset.py
python cylinder2d_unsteady_Re100.py

@jiangzhangze
Copy link
Author

Hi @HydrogenSulfate .谢谢您的回复,事实上我想基于自己计算的数据来训练,想知道关于自己生成数据集有教程之类的吗

@HydrogenSulfate
Copy link
Collaborator

HydrogenSulfate commented May 18, 2023

Hi @HydrogenSulfate .谢谢您的回复,事实上我想基于自己计算的数据来训练,想知道关于自己生成数据集有教程之类的吗

至于生成数据集,考虑到相当一部分用户对自己已经有的数据比较熟悉,但是大概率不太熟悉如何转换成可以拿来训练的数据点,这块近期会出一个教程。在此之前,如果想自己训练的话,可以参照训练数据的格式(案例里用的是csv文件,可以直接用excel打开查看,或者也可以用.mat储存数据),最关键的就是最终是要把数据离散化成一个一个点,然后加载进来训练。

@cheercao
Copy link

在Windows下使用cpu的开发版本,运行文件cylinder2d_unsteady_Re100报错AttributeError: module 'paddle.optimizer' has no attribute 'LBFGS',是由于飞浆版本的原因吗?是CPU版本没有只有GPU版本有这个属性吗?我的paddle是:paddlepaddle==0.0.0,cpu版本。

@HydrogenSulfate
Copy link
Collaborator

在Windows下使用cpu的开发版本,运行文件cylinder2d_unsteady_Re100报错AttributeError: module 'paddle.optimizer' has no attribute 'LBFGS',是由于飞浆版本的原因吗?是CPU版本没有只有GPU版本有这个属性吗?我的paddle是:paddlepaddle==0.0.0,cpu版本。

建议先卸载一下本地的paddle,然后去官网安装develop版paddle,我在windows机器上试了一下是可以运行的

image

@cheercao
Copy link

感谢,重新安装paddle之后问题已解决

@HydrogenSulfate
Copy link
Collaborator

感谢,重新安装paddle之后问题已解决

paddle develop版本为快速迭代版本,版本号都是0.0.0,所以是通过commit号 paddle.version.commit 对应的paddle commit日期来看版本的新旧,当commit号对应的commit日期(在paddle仓库中直接搜commit号就能搜到commit日期)比较老,意味着它是老的develop,可能存在功能缺失

@jiangzhangze
Copy link
Author

你好 @HydrogenSulfate ,训练数据中的domain_train.csv和ic0.1.csv分别代表的是什么数据

@HydrogenSulfate
Copy link
Collaborator

HydrogenSulfate commented Jun 5, 2023

你好 @HydrogenSulfate ,训练数据中的domain_train.csv和ic0.1.csv分别代表的是什么数据

domain_train.csv 是一个时刻的二维内部点坐标数据(example 代码中会被 TimeXGeometry 接受,复制成 T 份相同的数据变成时间-空间的三维坐标数据),这些点主要用于计算方程残差约束(作为损失函数的一项);
ic0.1.csv 是一个时刻(初始时刻t0)的内部点坐标数据,用于初值约束

@jiangzhangze
Copy link
Author

@HydrogenSulfate
domain_train.csv中的数据看起来似乎是初始时刻的数据?因为除了速度边界每个点对应的速度和压力都是0;
ic0.1.csv 像是某个时刻的数据,因为其中的点速度和压力都不像是初始时刻的。
domain_train
ic0 1

@HydrogenSulfate
Copy link
Collaborator

@HydrogenSulfate domain_train.csv中的数据看起来似乎是初始时刻的数据?因为除了速度边界每个点对应的速度和压力都是0; ic0.1.csv 像是某个时刻的数据,因为其中的点速度和压力都不像是初始时刻的。 domain_train ic0 1

domain_train.csv 这个文件其实只用到了里面的 x 和 y,uvp数据并没有使用,所以和它所处的时刻没关系,
然后 ic0.1.csv 的uvp非0,是因为我们这个案例里选取的初始时刻并不是 0 时刻,而是之后的一个时刻 TIME_START,而本案例代码只是保证了 domain_train.csv 所用的时刻 T 在 TIME_START 之后。

@HydrogenSulfate
Copy link
Collaborator

@HydrogenSulfate domain_train.csv中的数据看起来似乎是初始时刻的数据?因为除了速度边界每个点对应的速度和压力都是0; ic0.1.csv 像是某个时刻的数据,因为其中的点速度和压力都不像是初始时刻的。 domain_train ic0 1

相当于我们模拟了某一个时间段(时间窗口)的2D流场,只是这个时间窗口的起始点不一定是0而已,如果是你自己的数据,完全可以尝试用t=0的数据去构造IC

@jiangzhangze
Copy link
Author

@HydrogenSulfate domain_train.csv中的数据看起来似乎是初始时刻的数据?因为除了速度边界每个点对应的速度和压力都是0; ic0.1.csv 像是某个时刻的数据,因为其中的点速度和压力都不像是初始时刻的。 domain_train ic0 1

相当于我们模拟了某一个时间段(时间窗口)的2D流场,只是这个时间窗口的起始点不一定是0而已,如果是你自己的数据,完全可以尝试用t=0的数据去构造IC

使用t=0的数据构造IC时,是不是要用该时间段的最后时刻来构造domain_train.csv

@HydrogenSulfate
Copy link
Collaborator

HydrogenSulfate commented Jun 5, 2023

举一个简单的例子,假如我想模拟一段离散时刻 $[t_0, t_1, ..., t_n]$ 的流场状态,那么就用 $t_0$ 数据作为初始时刻数据构造约束, $[t_1, ..., t_n]$ 时刻的数据作为方程数据构造约束

@cheercao
Copy link

cheercao commented Jun 6, 2023

请问有pytorch版本的代码吗?想对比学习一下

@HydrogenSulfate
Copy link
Collaborator

请问有pytorch版本的代码吗?想对比学习一下

没有提供pytorch代码,可以在 https://paddlescience-docs.readthedocs.io/zh/latest/zh/examples/cylinder2d_unsteady/ 跳转到 AIStudio 上运行该案例的代码

@cheercao
Copy link

cheercao commented Jun 6, 2023

运行代码会报错
image

@HydrogenSulfate
Copy link
Collaborator

运行代码会报错 image

哦这里应该是变量没改成大写的原因,现在应该可以了,可以再试一下
image

@cheercao
Copy link

cheercao commented Jun 6, 2023

感谢

@cheercao
Copy link

cheercao commented Jun 9, 2023

@HydrogenSulfate 请问代码中构建的计算域我可以理解为一个是微分方程约束的计算域也就是微分方程的一些随机取值,也就是说用来训练,还有一个计算域就是用整个时间的数据来测试训练的情况。我这么理解对吗?
image

@HydrogenSulfate
Copy link
Collaborator

HydrogenSulfate commented Jun 9, 2023

计算域是一个比较抽象的概念,在 paddlescience 里一般指 包含所研究问题的取值范围的区域,可以是一个连续的几何,然后训练的时候会在这个连续的几何上进行随机采样得到训练/测试点;也可以是离散的几何(点云),训练的时候直接从点云中随机选取数据作为训练/测试点。

@cheercao
Copy link

cheercao commented Jun 9, 2023

比如我构建了一个训练的计算域,我在训练时在这个点云中会随机取值,可能会取到重复的值吗?

@jiangzhangze
Copy link
Author

jiangzhangze commented Aug 9, 2023

你好 @HydrogenSulfate ,我现在有个新的问题,如果我的边界条件是随时间和空间变化的,比如说DFG基准
其中圆柱绕流的入口边界条件为u(x,y,t) = 4*1.5*sin(pi*t/8)*y*(0.41-y)/0.41^2

这种情况下dataset应该怎么生成呢,这种情况下是不是应该把inlet的数据集改成probes的数据集的形式

@HydrogenSulfate
Copy link
Collaborator

HydrogenSulfate commented Aug 9, 2023

你好 @HydrogenSulfate ,我现在有个新的问题,如果我的边界条件是随时间和空间变化的,比如说DFG基准 其中圆柱绕流的入口边界条件为u(x,y,t) = 4*1.5*sin(pi*t/8)*y*(0.41-y)/0.41^2

这种情况下dataset应该怎么生成呢,这种情况下是不是应该把inlet的数据集改成probes的数据集的形式

有两种方法

  1. 在 PaddleScience 外面手动生成采样点 $(t,x,y)$,然后生成对应的边界条件 $u_{BC}(t,x,y)$,然后这两者作为文件读入进来作为监督数据,用 ppsci.constraint.SupervisedConstraint 包一层变成约束

  2. 在 PaddleScience 里面用 Geometry 生成采样点,那么这样对应使用的是 ppsci.constraint.BoundaryConstraint,在其参数 label_dict 字典里,用函数(或lambda表达式)代替常数即可,如下所示

    ppsci.constraint.BoundaryConstraint(
        output_expr={"u": lambda d: d["u"]},
        label_dict={"u": lambda input: (input["t"] + input["x"] + input["y"])}, # <-- 这里
        geom["noslip_geo"],
        {**train_dataloader_cfg, "batch_size": 5200},
        ppsci.loss.MSELoss("sum"),
        name="no_slip",
    )

PaddleScience 处理传入参数为函数的代码逻辑在这里:
image

如果是2D圆柱绕流,因为 PaddleScience 提供的这个案例都是从文件里读入的数据,所以建议使用第一种方法,自己生成一下数据

@jiangzhangze
Copy link
Author

好的感谢

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants