为什么当我使用 numpy 数学时 GradientTape 返回 None
我正在尝试了解 RL 损失函数的 tensorflow GradientTape 计算。当我使用 np.math 调用函数时,GradientTape 返回 None。如果我在函数中使用 tf.math 它工作正常。我看过像 ppo 和 sac 这样的 tf-agents,他们正在做(?)我正在尝试做的事情(我已经尝试了最后 50 个其他版本)。下面的代码有什么问题?我错过了什么?
窗口 10,python 3.6.8,tensorflow 2.0.0 参考:https ://github.com/chagmgang/tf2.0_reinforcement_learning/blob/master/policy/ppo.py
import numpy as np
import tensorflow as tf
import matplotlib.pyplot as plt
def my_loss1(x):
y=tf.sin(x)
y=tf.abs(y)
return y
def my_loss2(x):
y=np.sin(x)
y=np.abs(y)
return y
def main(ver):
x = np.linspace(0,10,25)
dsin_dx=np.cos(x)
xx = tf.constant(x)
with tf.GradientTape() as tape:
tape.watch(xx)
if ver==0:
# my_loss1 with tf math
loss1=my_loss1(xx)
if ver==1:
#my loss with numpy math
loss1=my_loss2(np.array(xx))
loss1 = tf.convert_to_tensor(loss1, dtype=tf.float64)
print(loss1)
loss=tf.reduce_sum(loss1)
print('loss=',loss)
grads = tape.gradient(loss, xx)
fig, ax = plt.subplots(2)
ax[0].plot(x,loss1,'r')
print('grads', grads)
if not grads is None:
ax[1].plot(x, grads)
ax[1].plot(x,dsin_dx)
plt.show()
if __name__ == '__main__':
main(ver=0) # This works ok
main(ver=1) # This returns grads = None