微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何为回归问题找到合适的损失函数?

如何解决如何为回归问题找到合适的损失函数?

我正在尝试使用神经网络求解非线性微分方程。很多人正在这样做,他们已经取得了不错的成绩。我定义了一个自定义损失函数,以满足一组物理约束。但是,我不确定此损失函数是否合适。对于这些条件之一,期望值是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 举报,一经查实,本站将立刻删除。