У меня проблема с вычислением градиента в 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 + 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.