在 PINN 模型中使用 tfp.optimizer.lbfgs_minimize 时出现问题

问题描述 投票:0回答:1

我正在为当前使用 adam optimiser 的练习设计 PINN。 我想使用这个优化器:

tfp.optimizer.lbfgs_minimize(
  value_and_gradients_function,
  initial_position,
  num_correction_pairs=50,
  f_relative_tolerance=1.0 * np.finfo(float).eps,
  max_iterations=50000,
  max_line_search_iterations=50,
)

我一直在查看数据表,但无法准确理解我需要在“value_and_gradients_function”和“initial_position”中放入什么。

我拥有的是:

2 个列表,一个用于权重,一个用于偏差,包含 tf 变量(每一层一个)。它们看起来像这样:

self.weights = [<tf.Variable 'Variable:0' shape=(2, 100) dtype=float32>, <tf.Variable 'Variable_2:0' shape=(100, 100) dtype=float32>, <tf.Variable 'Variable_4:0' shape=(100, 100) dtype=float32>, <tf.Variable 'Variable_6:0' shape=(100, 100) dtype=float32>, <tf.Variable 'Variable_8:0' shape=(100, 2) dtype=float32>]

self. biases = [<tf.Variable 'Variable_1:0' shape=(1, 100) dtype=float32>, <tf.Variable 'Variable_3:0' shape=(1, 100) dtype=float32>, <tf.Variable 'Variable_5:0' shape=(1, 100) dtype=float32>, <tf.Variable 'Variable_7:0' shape=(1, 100) dtype=float32>, <tf.Variable 'Variable_9:0' shape=(1, 2) dtype=float32>]

计算网络并返回输出的函数:

  self.neural_net(self, input, weights, biases)

张量流图来计算一些事情,例如输出相对于输入的微分。它们看起来像这样:

    self.Cg0_pred, self.Cs0_pred, _ = self.net_CgCs(self.x0_tf,self.t0_tf) 
    self.Cg_lb_pred, self.Cs_lb_pred, self.Cg_x_lb_pred = self.net_CgCs(self.x_lb_tf, self.t_lb_tf)
    _ , _ , self.Cg_x_ub_pred = self.net_CgCs(self.x_ub_tf, self.t_ub_tf)
    self.f_gp_pred, self.f_pp_pred = self.net_f_CgCs(self.x_f_tf, self.t_f_tf)

(self.x0_tf、self.t0_tf、self.x_lb_tf、self.t_lb_tf、self.x_ub_tf、self.t_ub_tf 和 self.x_f_tf、self.t_f_tf 基本上是包含训练模型输入的列表)

使用张量流图计算损失的张量,如下所示:

  self.loss = tf.reduce_mean(tf.square(self.u0_tf - self.u0_pred)) + \
    tf.reduce_mean(tf.square(self.v0_tf - self.v0_pred)) + \
    tf.reduce_mean(tf.square(self.u_lb_pred - self.u_ub_pred)) + \
    tf.reduce_mean(tf.square(self.v_lb_pred - self.v_ub_pred)) + \
    tf.reduce_mean(tf.square(self.u_x_lb_pred - self.u_x_ub_pred)) + \
    tf.reduce_mean(tf.square(self.v_x_lb_pred - self.v_x_ub_pred)) + \
    tf.reduce_mean(tf.square(self.f_u_pred)) + \
    tf.reduce_mean(tf.square(self.f_v_pred)) 

而且,基本上我对 Adam 的所有了解就是定义优化器

self.train_op_Adam = self.optimizer_Adam.minimize(self.loss)

然后我只需为每次训练重复此操作:

self.sess.run(self.train_op_Adam, tf_dict) 

我需要做什么才能使用 LBFGS 优化器运行它?

我定义了一个函数,它基本上只是返回损失,因为 tfp.optimizer.lbfgs_minimize 需要可调用。

  def loss_LBFGS(self,x):
    '''Callable returning the loss for the LBFGS optimizer'''
    return tf.reduce_mean(input_tensor=tf.square(self.Cg0_pred - self.Cg0_tf)) + \
                tf.reduce_mean(input_tensor=tf.square(self.Cs0_pred - self.Cs0_tf)) + \
                tf.reduce_mean(input_tensor=tf.square(self.ug * self.C0 
                                         - self.ug * self.Cg_lb_pred 
                                         + self.Dg * self.Cg_x_lb_pred)) + \
                tf.reduce_mean(input_tensor=tf.square(self.Cg_x_ub_pred)) + \
                tf.reduce_mean(input_tensor=tf.square(self.f_gp_pred)) + \
                tf.reduce_mean(input_tensor=tf.square(self.f_pp_pred))

这似乎没问题,但不确定,因为无论如何我都无法使其工作,因为我不知道如何处理“initial_position”部分。我尝试过连接权重和偏差,或者将一个与另一个进行扩展,但我收到一个错误,告诉我这两个列表应该具有相同的形状。

ValueError: Dimension 1 in both shapes must be equal, but are 100 and 2. Shapes are [100,100] and [100,2].
    From merging shape 3 with other shapes. for '{{node minimize/initial_position/0}} = Pack[N=5, T=DT_FLOAT, axis=0](minimize/initial_position/0/ReadVariableOp, minimize/initial_position/0/ReadVariableOp_1, minimize/initial_position/0/ReadVariableOp_2, minimize/initial_position/0/ReadVariableOp_3, minimize/initial_position/0/ReadVariableOp_4)' with input shapes: [2,100], [100,100], [100,100], [100,100], [100,2].

我明白这意味着什么,因为权重和偏差确实具有不同的形状,但我不知道如何解决这个问题。

有人知道如何做到这一点吗?你还认为我对损失函数所做的事情是正确的吗?

python tensorflow optimization deep-learning
1个回答
0
投票

使用 Tensorflow 概率 LBFGS 优化器进行神经网络训练很复杂,因为您需要做接口。但是你可以使用Deepxde完成的界面。这是完成界面的存储库。其他实现链接在 tfp_optimizer.py 的标头中。

© www.soinside.com 2019 - 2024. All rights reserved.