Gradient.tape заставляет модель работать так медленно? - PullRequest
0 голосов
/ 13 июля 2020

Я создаю модель для решения 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) и использовать ленту для обновления весов оптимизатором, и они заставляют мой код работать так медленно?

...