翘602 2024-04-23 18:14 采纳率: 0%
浏览 3
已结题

paddlepaddle pinn

我写了一个基于pinn求解二维传热反问题,传热模型是一个三角形,现在不知道那里有bug,运行不了


# 调包
import matplotlib.pyplot as plt
import plotly.graph_objects as go
import plotly.express as px
import pandas as pd
import numpy as np
import deepxde as dde
import numpy as np
import math
import scipy.io as io




# 定义参数
LENGTH_OF_DOMAIN = 1
TIME = 5
INITIAL_CONC = 10
D = 0.4
J = 1
c_bar = 10


TriangleDomain = dde.geometry.geometry_2d.Triangle([0, 0], [8, 0], [4, 4])
#建立二维模型
TimeDomain = dde.geometry.TimeDomain(0, TIME)#时间范围
CombinedDomain = dde.geometry.GeometryXTime(TriangleDomain, TimeDomain)

#划定边界范围
def on_boundary_1(X, on_boundary):
    return on_boundary and np.isclose(X[0]-X[1], 0)
def on_boundary_2(X, on_boundary):
    return on_boundary and np.isclose(X[1], 0)
def on_boundary_3(X, on_boundary):
    return on_boundary and np.isclose(X[1]+X[0], 8)


#定义逆问题需要计算的参数
C = dde.Variable(1.0)


#导入真实数据
xytT = io.loadmat('chushizhi.mat')
xyt = xytT['data'][:, 0:3]
T = xytT['data'][:, 3:4]




l_bc_1 = dde.icbc.DirichletBC(CombinedDomain, lambda X: C, on_boundary_1)
l_bc_2 = dde.icbc.DirichletBC(CombinedDomain, lambda X: C, on_boundary_2)
l_bc_3 = dde.icbc.DirichletBC(CombinedDomain, lambda X: C, on_boundary_3)#边界条件

initial_bc = dde.icbc.IC(CombinedDomain, lambda X: INITIAL_CONC, lambda _, on_initial: on_initial) #初始条件
ob_x = dde.icbc.PointSetBC(xyt, T, component=0)#数据点

#二维热传导方程

def pde(A, u):
    du_dt = dde.grad.jacobian(u, A, i=0, j=2)
    ddu_dxx = dde.grad.hessian(u, A, i=0, j=0)
    ddu_dyy = dde.grad.hessian(u, A, i=1, j=1)
    return du_dt - D * (ddu_dxx + ddu_dyy)



# 组合模型
module = dde.data.TimePDE(
    CombinedDomain,
    pde,
    [l_bc_1, l_bc_2, l_bc_3, initial_bc, ob_x],
    num_domain = 5000,
    num_boundary = 1200,
    num_initial = 1200,
    num_test = 5000,
)


# 定义神经网络模型
net = dde.nn.FNN([3] + [100] * 4 + [1], "tanh", "Glorot normal")#网络层和激活函数
model = dde.Model(module, net)
model.compile("adam", lr = 0.0001, external_trainable_variables=C)#优化器、学习率、需要计算的参数

#保存计算的参数
fnamevar = "10_4dian.dat"
variable = dde.callbacks.VariableValue([C], period=100, filename=fnamevar)


# 训练模型
LossHistory, TrainState = model.train(iterations = 150000, callbacks=[variable])
dde.saveplot(LossHistory, TrainState, issave = True, isplot = True)

这个是报错
return _C_ops.linear(x, weight, bias)
ValueError: (InvalidArgument) The type of data we are trying to retrieve (float32) does not match the type of data (float64) currently contained in the container.
  [Hint: Expected dtype() == phi::CppTypeToDataType<T>::Type(), but received dtype():11 != phi::CppTypeToDataType<T>::Type():10.] (at ..\paddle\phi\core\dense_tensor.cc:171)
  [operator < linear > error]


我想问一下

  • 写回答

21条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-04-23 18:20
    关注
    获得1.50元问题酬金

    引自免费微信小程序:皆我百晓生

    您好!根据您提供的代码和错误信息,看起来您的模型在执行过程中遇到了数据类型不匹配的问题。PaddlePaddle在内部使用了不同的数据类型(float32 和 float64),而模型期望的数据类型与实际输入的数据类型不一致。

    解决此问题的方法是在初始化数据或者设置数据类型时确保所有数据都统一为相同的浮点精度。请尝试将您的数据转换为 float32 类型,例如:

    xytT = io.loadmat('chushizhi.mat')
    xyt = xytT['data'].astype(np.float32)[:, 0:3]
    T = xytT['data'].astype(np.float32)[:, 3:4]
    

    同时,确认您的模型和损失函数也都在 float32 环境下运行:

    net = dde.nn.FNN([3] + [100] * 4 + [1], "tanh", "Glorot normal", dtype='float32')
    

    如果您的深度学习库或框架支持设置全局默认数据类型,请确保全局设置也为 float32

    这样应该可以解决您遇到的类型不匹配错误。另外,请检查您的其他输入数据或自定义函数是否也有类似的数据类型问题,并做相应的转换。

    评论 编辑记录

报告相同问题?

问题事件

  • 系统已结题 5月1日
  • 赞助了问题酬金50元 4月23日
  • 创建了问题 4月23日

悬赏问题

  • ¥15 c语言怎么用printf(“\b \b”)与getch()实现黑框里写入与删除?
  • ¥20 怎么用dlib库的算法识别小麦病虫害
  • ¥15 华为ensp模拟器中S5700交换机在配置过程中老是反复重启
  • ¥15 java写代码遇到问题,求帮助
  • ¥15 uniapp uview http 如何实现统一的请求异常信息提示?
  • ¥15 有了解d3和topogram.js库的吗?有偿请教
  • ¥100 任意维数的K均值聚类
  • ¥15 stamps做sbas-insar,时序沉降图怎么画
  • ¥15 买了个传感器,根据商家发的代码和步骤使用但是代码报错了不会改,有没有人可以看看
  • ¥15 关于#Java#的问题,如何解决?