使用深度学习解决偏微分方程
这个例子展示了如何使用深度学习解决汉堡的方程。
汉堡的方程是偏微分方程(PDE)出现在不同领域的应用数学。特别是,流体力学、非线性声学气体动力学和流量。
考虑到计算域 ,这个示例使用物理通知神经网络(PINN)[1]和火车一个多层感知器神经网络样本 作为输入, 是空间变量, 是时间变量,并返回 ,你的解决方案是汉堡的方程:
与 作为初始条件, 和 作为边界条件。
火车的例子执行给定一个输入模式 ,网络的输出 满足汉堡的方程,边界条件和初始条件。
训练该模型不需要提前收集数据。你可以生成数据使用PDE的定义和约束。
生成的训练数据
训练搭配点的模型需要一个数据集执行边界条件,执行初始条件和满足汉堡的方程。
选择25等距的时间点执行每一个边界条件 和 。
numBoundaryConditionPoints = 25 [25];x0BC1 = 1 * 1 (1, numBoundaryConditionPoints (1));numBoundaryConditionPoints x0BC2 = 1 (1 (2));t0BC1 = linspace (0, 1, numBoundaryConditionPoints (1));t0BC2 = linspace (0, 1, numBoundaryConditionPoints (2));u0BC1 = 0 (1, numBoundaryConditionPoints (1));numBoundaryConditionPoints u0BC2 = 0 (1 (2));
选择50等距的空间指向执行初始条件 。
numInitialConditionPoints = 50;x0IC = linspace (1, 1, numInitialConditionPoints);numInitialConditionPoints t0IC = 0 (1);u0IC = sin(π* x0IC);
初始和边界条件的数据分组在一起。
X0 = [x0IC x0BC1 x0BC2];T0 = [t0IC t0BC1 t0BC2];情况= [u0IC u0BC1 u0BC2];
选择要执行的输出10000点网络实现汉堡的方程。
numInternalCollocationPoints = 10000;pointSet = sobolset (2);点=净(pointSet numInternalCollocationPoints);dataX = 2 *点(:1)1;人数(=点(:,2);
创建一个数组包含训练数据的数据存储。
ds = arrayDatastore ([dataX人数());
定义深度学习模型
定义一个多层感知器体系结构与9完全连接操作20隐藏神经元。第一个完全连接操作有两个输入通道对应的输入 和 。最后完全连接操作有一个输出 。
定义并初始化模型参数
为每个操作定义的参数,包括结构。使用格式parameters.OperationName.ParameterName
在哪里参数
阿,是结构体perationName
是操作的名称(例如“fc1”)和ParameterName
参数的名称(例如,“权重”)。
指定的层数和每层的神经元数。
numLayers = 9;numNeurons = 20;
初始化参数第一个完全连接操作。第一个完全连接操作有两个输入通道。
参数=结构;深圳= [numNeurons 2];parameters.fc1。重量= initializeHe(深圳,2);parameters.fc1。偏见= initializeZeros ([numNeurons 1]);
初始化参数为每个剩余的中间完全连接操作。
为layerNumber = 2: numLayers-1 name =“俱乐部”+ layerNumber;深圳= [numNeurons numNeurons];numIn = numNeurons;参数。(名字)。重量= initializeHe(深圳、numIn);参数。(名字)。偏见= initializeZeros ([numNeurons 1]);结束
初始化参数最终完全连接操作。最后完全连接操作有一个输出通道。
深圳= [1 numNeurons];numIn = numNeurons;参数。“俱乐部”+ numLayers)。重量= initializeHe(深圳、numIn);参数。“俱乐部”+ numLayers)。偏见= initializeZeros ([1]);
查看网络参数。
参数
参数=结构体字段:fc1:(1×1结构)fc2: [1×1 struct]一个fc3:文件[1×1 struct] fc4: [1×1 struct] fc5: [1×1 struct] fc6: [1×1 struct] fc7: [1×1 struct] fc8: [1×1 struct] fc9: [1×1 struct]
查看第一个完全连接层的参数。
parameters.fc1
ans =结构体字段:权重(20×2 dlarray):偏见:[20×1 dlarray]
定义模型和模型损失函数
创建函数模型
中列出,模型函数节的例子,计算输出的深度学习模型。这个函数模型
接受模型作为输入参数和网络输入,并返回模型输出。
创建函数modelLoss
中列出,损失函数模型结尾部分的例子,使用模型作为输入参数,网络输入,初始和边界条件,并返回损失和损失的梯度对可学的参数。
指定培训选项
火车模型3000时代mini-batch大小为1000。
numEpochs = 3000;miniBatchSize = 1000;
火车在GPU如果可用,指定执行环境“汽车”
。使用GPU需要并行计算工具箱™和支持GPU设备。金宝app支持设备的信息,请参阅金宝appGPU计算的需求(并行计算工具箱)(并行计算工具箱)。
executionEnvironment =“汽车”;
指定亚当优化选项。
initialLearnRate = 0.01;decayRate = 0.005;
列车网络的
列车网络使用自定义训练循环。
创建一个minibatchqueue
对象的数据流程和管理mini-batches在训练。为每个mini-batch:
格式的数据维度标签
“公元前”
(批处理、通道)。默认情况下,minibatchqueue
把数据转换为对象dlarray
对象与基本类型单
。火车在GPU的价值
executionEnvironment
变量。默认情况下,minibatchqueue
将每个输出转换为对象gpuArray
如果一个GPU是可用的。
兆贝可= minibatchqueue (ds,…MiniBatchSize = MiniBatchSize,…MiniBatchFormat =“公元前”,…OutputEnvironment = executionEnvironment);
转换的初始和边界条件dlarray
。对于输入的数据点,指定格式和尺寸“CB”
(频道,批处理)。
X0 = dlarray (X0,“CB”);T0 = dlarray (T0,“CB”);情况= dlarray(情况);
如果使用GPU训练,把初始和边界条件gpuArray
。
如果(executionEnvironment = =“汽车”& & canUseGPU) | | (executionEnvironment = =“图形”)X0 = gpuArray (X0);T0 = gpuArray (T0);情况= gpuArray(情况);结束
亚当的初始化参数解算器。
averageGrad = [];averageSqGrad = [];
加速模型损失函数使用dlaccelerate
函数。欲了解更多,请看加快定制培训循环功能。
accfun = dlaccelerate (@modelLoss);
初始化培训进展阴谋。
图C = colororder;lineLoss = animatedline(颜色= C (2:));ylim([0正])包含(“迭代”)ylabel (“损失”网格)在
培训网络。
每一次迭代:
读mini-batch从mini-batch队列的数据
损失评估模型和梯度使用加速模型和损失
dlfeval
功能。更新学习速率。
更新可学的参数使用
adamupdate
函数。
在每个时代,更新培训策划与损失值。
开始=抽搐;迭代= 0;为时代= 1:numEpochs重置(兆贝可);而hasdata(兆贝可)迭代=迭代+ 1;XT =下一个(兆贝可);X = X (t): 1);T = XT (2);%计算模型和梯度使用dlfeval损失% modelLoss函数。(损失,梯度)= dlfeval (accfun、参数X, T, X0, T0,情况);%更新学习速率。learningRate = initialLearnRate / (1 + decayRate *迭代);%更新使用adamupdate函数网络参数。(参数、averageGrad averageSqGrad) = adamupdate(参数、渐变averageGrad,…迭代,averageSqGrad learningRate);结束%情节训练进展。损失=双(收集(extractdata(损失)));addpoints (lineLoss,迭代,损失);D =持续时间(0,0,toc(开始),格式=“hh: mm: ss”);标题(”时代:“+时代+”,过去:“字符串(D) + +”,损失:“+损失)drawnow结束
检查的有效性加速功能通过检查和入住率。
accfun
accfun = AcceleratedFunction属性:功能:@modelLoss启用:1 CacheSize: 50 HitRate: 99.9967占用:2 CheckMode:‘没有’CheckTolerance: 1.0000 e-04
评估模型的准确性
的值 在0.25,0.5,0.75,1,比较深刻的学习模型的预测值和真实的汉堡的方程使用的解决方案金宝搏官方网站 错误。
设置目标时间来测试模型。每一次计算解决方案1001等距的点的距离[1]。
tt = (0.25 0.5 0.75 1);numPredictions = 1001;XTest = linspace (1, 1, numPredictions);图为i = 1:元素个数(tt) t = tt(我);tt = t * 1 (1, numPredictions);%作出预测。XTest = dlarray (XTest,“CB”);tt = dlarray (tt,“CB”);upr =模型(参数、XTest tt);%计算真值。ut = solveBurgers (extractdata (XTest), t, 0.01 / pi);%计算错误。呃=规范(extractdata (upr) - ut) /规范(ut);%的阴谋的预测。次要情节(2,2,我)情节(XTest, extractdata (upr),“-”、线宽= 2);ylim ([-1.1, 1.1])%情节真实值。持有在情节(XTest、ut、”——“线宽= 2)从标题(“t =”+ t +”,错误= "+收集(err));结束次要情节(2,2,2)传说(“预测”,“真正的”)
情节展示关闭预测真实值。
解决汉堡的函数方程
的solveBurgers
函数返回汉堡真溶液的方程t
在[2]中。
函数U = solveBurgers (X, t,ν)%定义函数。f = @ (y) exp (cos(π* y) /(2 *π*ν));g = @ (y) exp (- (y ^ 2) /(4 *ν* t));%初始化解决方案。金宝搏官方网站U = 0(大小(X));%循环/ x值。为i = 1:元素个数(X) X = X(我);%计算解决方案使用积分函数。金宝搏官方网站的边界% x = 1和x = 1是已知的,所以离开0%由初始化。如果abs (x) ~ = 1有趣= @ (eta)罪(π* (x-eta)。* f (x-eta)。* g (eta);uxt =积分(乐趣无穷,正无穷);有趣= @ (eta) f (x-eta)。* g (eta);U (i) = uxt /积分(乐趣无穷,正无穷);结束结束结束
损失函数模型
给定一个输入的模型是由执行训练 网络的输出 满足汉堡的方程,边界条件和初始条件。特别是,两个量导致损失最小化:
,
在哪里 和 。
在这里, 对应于搭配点的边界计算域和边界和初始条件。 在域的内部点。
计算 要求衍生品 输出的 的模型。
这个函数modelLoss
将作为输入,模型参数参数
,网络的输入X
和T
,初始和边界条件X0
,T0
,情况
,并返回损失和损失的梯度对可学的参数。
函数(损失,梯度)= modelLoss(参数X, T, X0、T0情况)%与初始条件作出预测。U =模型(参数X, T);%计算衍生品对X和T。gradientsU = dlgradient(总和(U,“所有”),{X T}, EnableHigherDerivatives = true);用户体验= gradientsU {1};Ut = gradientsU {2};%计算二阶导数对X。Uxx = dlgradient(和用户体验,“所有”),X, EnableHigherDerivatives = true);%计算lossF。执行汉堡的方程。f = Ut + U。*用户体验——(0.01. / pi)。* Uxx;zeroTarget = 0(大小(f),“喜欢”f);lossF = mse (f, zeroTarget);%计算lossU。执行初始和边界条件。U0Pred =模型(参数,X0, T0);lossU = mse (U0Pred情况);%将损失。损失= lossF + lossU;%计算梯度对可学的参数。梯度= dlgradient(损失、参数);结束
模型函数
模型训练在这个例子中由一系列完全连接操作和每个人之间的双曲正切操作。
该模型函数模型作为输入参数参数
和网络输入X
和T
,并返回该模型输出U
。
函数U =模型(参数X, T) XT = [X; T];numLayers =元素个数(字段名(参数));%第一个完全连接操作。重量= parameters.fc1.Weights;偏见= parameters.fc1.Bias;U = fullyconnect (XT,重量、偏见);%双曲正切和完全剩余层的连接操作。为我= 2:numLayers name =“俱乐部”+我;U =双曲正切(U);重量=参数。(名字).Weights;偏见=参数。(名字).Bias;U = fullyconnect (U,重量偏差);结束结束
引用
自从Raissi、巴黎Perdikaris和乔治•Em Karniadakis物理深度学习通知(第一部分):数据驱动的解决方案的非线性偏微分方程金宝搏官方网站https://arxiv.org/abs/1711.10561
c . Basdevant m .帝威,p . Haldenwang j . Lacroix j . Ouazzani r . Peyret p . Orlandi接线盒,光谱和汉堡方程的有限差分方法,电脑& 14(1986)23-41液体。金宝搏官方网站
另请参阅
dlarray
|dlfeval
|dlgradient
|minibatchqueue