Я создаю модель для решения PDE, и мое обучение l oop выглядит следующим образом:
for epoch in range(200):
print("\nStart of epoch %d" % (epoch,))
with tf.GradientTape(persistent=True) as tape:
data_points = random_data_points(1000)
loss = epoch_loss(model, data_points)
grads = tape.gradient(loss, model.trainable_weights)
grads = [grad if grad is not None else tf.zeros_like(var)
for var, grad in zip(model.trainable_weights, grads)]
optimizer.apply_gradients(zip(grads, model.trainable_weights))
losses.append(loss.numpy())
и метод epoch_loss как:
def epoch_loss(model, data):
Point_loss = 0
Boundary_loss = 0
Points, Boundary_points = data
Points = np.array(Points)
Points = Points.reshape(len(Points),2,1)
Boundary_points = np.array(Boundary_points)
Boundary_points = Boundary_points.reshape(len(Boundary_points),2,1)
for Point in Points:
Point = tf.keras.backend.variable(Point)
Point_output = model(Point)
Point_loss += (- laplacian(Point_output, Point) - right_hand_side(Point)) ** 2
for Boundary_point in Boundary_points:
Boundary_point = tf.keras.backend.variable(Boundary_point)
Boundary_point_output = model(Boundary_point)
Boundary_loss += (Boundary_point_output - boundary_condition(Boundary_point))**2
Point_loss = Point_loss / len(Points)
Boundary_loss = Boundary_loss / len(Boundary_points)
return Point_loss + Boundary_loss
Метод лапласианского типа:
def laplacian(u, input):
grads = tape.gradient(u, input)
ux = grads[0]
uxx = tape.gradient(ux, input)[0]
uy = grads[1]
uyy = tape.gradient(uy, input)[1]
return uxx + uyy
Я использовал tape.gradient в функции потерь и при обновлении весов оптимизатором. Я не знаю, что это правильный способ вычислить разницу (uxx + uyy) и использовать ленту для обновления весов оптимизатором, и они заставляют мой код работать так медленно?