Расчет градиента в Tensorflow с использованием GradientTape - получение неожиданного значения Нет - PullRequest
0 голосов
/ 27 апреля 2020

У меня проблема с вычислением градиента в TensorFlow 1.15. Я думаю, что это что-то связанное с менеджером контекста или сеансом keras, но я не уверен в этом. Ниже приведен код, который я написал:

def create_adversarial_pattern_CW(input_patch, input_label, target_label):
 input_patch_T = tf.cast(input_patch,tf.float32)
 with tf.GradientTape() as tape:
  tape.watch(input_patch_T)
  patch_pred = model(input_patch_T)
  loss_input_label = soft_dice_loss(input_label, patch_pred[0])
  loss_target_label = soft_dice_loss(target_label, patch_pred[0])
  f = loss_input_label - loss_target_label
 f_grad = tape.gradient(f, input_patch_T)

 #-------------------------#
 print(type(f_grad)) 
 #-------------------------#

 f_grad_sign = tf.sign(f_grad)
 return f_grad_sign


def DAG():
 sess = K.get_session()
 with sess.as_default() as sess:
  adv_x_old = tf.cast(X,dtype=tf.float32)
  for i in range(iters):
   #-------------------------#
   #y_pred = model(adv_x_old) -> If I uncomment this line the value of f_grad returned is None, otherwise it works fine, but I need this line
   #-------------------------#
   perturbations = create_adversarial_pattern_CW(adv_x_old, y, y_target)
   adv_x_new = adv_x_old - alpha*perturbations
   adv_x_old = adv_x_new
  adv_patch_pred = model(adv_x_old)

Чтобы исправить это, я попытался обернуть закомментированную строку как:

with tf.GradientTape() as tape:
  with tape.stop_recording():
    y_pred = model(adv_x_old)

, но все равно получаю значение f_grad как None.

...