1

为什么当我使用 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 
4

1 回答 1

1

问题是梯度磁带只记录张量。为什么在ver = 1的情况下无法计算梯度的原因是没有记录numpy变量。ver1 中的 Loss1 看起来与 ver=0 中的 loss1 相同,但对 xx 的依赖被 numpy 破坏了。
我的参考。计算 get_gaes() 时出现此错误且 grads 的计算不正确。

于 2020-01-27T22:35:36.540 回答