源代码:
with tf.GradientTape(persistent=False) as tap:
# loss of boundary condtions
lb = self.loss_fn_conds(batch_data)
# 边界条件关于神经网络参数的梯度
gb = tap.gradient(lb,
[self.model_lr.trainable_variables, self.model_hr.trainable_variables, self.filter_delta],
unconnected_gradients=tf.UnconnectedGradients.ZERO)
问题:
损失函数与网络并没有关联,返回的是默认值0。我希望损失函数关于网络参数的导数也能返回0。在之前的tensorflow 2.7版本中,只需将unconnected_gradients设置成tf.UnconnectedGradients.ZERO即可满足我的要求。
但是最近将tensorflow升级到2.21,出现了错误。当unconnected_gradients设置成NONE时,可以运行,返回NONE;但设置成ZERO时,报错,并没有返回我需要的0值。报错信息如下:
File /mnt/d/HPWANG/Projects/PINNs-TF2.20-Linux-R5/pinns_2d_multiscale.py:630, in PINNs_2D_MultiScale.get_dynamic_weight(self, batch_data, weight_res)
628 print(lb)
629 # 边界条件关于神经网络参数的梯度
--> 630 gb = tap.gradient(lb,
631 [self.model_lr.trainable_variables, self.model_hr.trainable_variables, self.filter_delta],
632 unconnected_gradients=tf.UnconnectedGradients.ZERO)
634 gb0 = [tf.reshape(j, (1, -1)) for j in gb[0]]
635 gb0 = tf.concat(gb0, axis=1)
File ~/anaconda3/envs/tf-gpu/lib/python3.11/site-packages/tensorflow/python/eager/backprop.py:1066, in GradientTape.gradient(self, target, sources, output_gradients, unconnected_gradients)
1060 output_gradients = (
1061 composite_tensor_gradient.get_flat_tensors_for_gradients(
1062 output_gradients))
1063 output_gradients = [None if x is None else ops.convert_to_tensor(x)
1064 for x in output_gradients]
-> 1066 flat_grad = imperative_grad.imperative_grad(
1067 self._tape,
1068 flat_targets,
1069 flat_sources,
1070 output_gradients=output_gradients,
1071 sources_raw=flat_sources_raw,
1072 unconnected_gradients=unconnected_gradients)
1074 if not self._persistent:
1075 # Keep track of watched variables before setting tape to None
1076 self._watched_variables = self._tape.watched_variables()
File ~/anaconda3/envs/tf-gpu/lib/python3.11/site-packages/tensorflow/python/eager/imperative_grad.py:67, in imperative_grad(tape, target, sources, output_gradients, sources_raw, unconnected_gradients)
63 except ValueError:
64 raise ValueError(
65 "Unknown value for unconnected_gradients: %r" % unconnected_gradients)
---> 67 return pywrap_tfe.TFE_Py_TapeGradient(
68 tape._tape, # pylint: disable=protected-access
69 target,
70 sources,
71 output_gradients,
72 sources_raw,
73 compat.as_str(unconnected_gradients.value))
SystemError: <function BaseResourceVariable.dtype at 0x70cc34b6b060> returned a result with an exception set
相似问题