问题描述
我正在尝试使用神经网络求解非线性微分方程。很多人正在这样做,他们已经取得了不错的成绩。我定义了一个自定义损失函数,以满足一组物理约束。但是,我不确定此损失函数是否合适。对于这些条件之一,期望值是10到5的幂,而另一个是10到-10的幂。大多数人都使用均方误差作为损失函数并获得了良好的结果,但是在我的案例中应用相同的方法似乎忽略了约束n的损失。有什么办法可以解决这类问题?在定义损失函数的方向上解决问题是否正确?
def loss(self,u,u_pred):
f_pred = self.f_model()
n_pred = self.n_model()
return tf.reduce_mean(tf.square((u - u_pred))) + \
tf.reduce_mean(tf.square(f_pred)) + tf.reduce_mean(tf.square(n_pred))
def f_model(self):
with tf.GradientTape(persistent=True) as tape:
# Watching the two inputs we’ll need later,x and t
tape.watch(self.x_f)
tape.watch(self.t_f)
X_f = tf.stack([self.x_f[:,0],self.t_f[:,0]],axis=1)
# Getting the prediction
logvo=self.model(X_f)
vo = 10.0**logvo
vo_x = tape.gradient(vo,self.x_f)
Jvo=svo(logvo)/stot(logvo)*DC['J']-2*DC['e0']*DC['DVo']*vo_x
Jvo_x=tape.gradient(Jvo,self.x_f)
vo_t = tape.gradient(vo,self.t_f)
del tape
return (vo_t+Jvo_x/2/DC['e0']) #the constraint is vo_t == -Jvo_x/2/DC['e0']
def n_model(self):
with tf.GradientTape(persistent = True) as tape:
tape.watch(self.x_N)
tape.watch(self.t_N)
X_N=tf.stack([self.x_N[:,self.t_N[:,axis=1)
logvo = self.model(X_N)
vo = 10.0**logvo
vo_x = tape.gradient(vo,self.x_N)
Jvo=svo(logvo)/stot(logvo)*DC['J']-2*DC['e0']*DC['DVo']*vo_x
del tape
return Jvo #the constraint is Jvo == 0
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)