【问题标题】:Keras.backend.gradients giving None instead of ZeroKeras.backend.gradients 给出无而不是零
【发布时间】:2019-09-30 19:33:32
【问题描述】:

我是 tensorflow 的新手,我正在尝试获得函数的二阶导数,但是如果一阶导数变为常数,则二阶导数变为 None 而不是 0。

据我了解,这是因为没有计算图将常数从一阶导数链接到任何变量,因此它变为“无”。但我不明白如何解决这个问题。我也不明白为什么这种情况下的导数并不总是 0,从数学上讲,将其设置为 0 而不是 None 更有意义。

这是我为解决问题而运行的代码:

x_val = np.linspace(0,1,n)
x = K.variable(x_val,dtype='float64',name='x')

y_val = np.linspace(0,1,n)
y = K.variable(y_val,dtype='float64',name='y')

z = x**2 + y + 1

g = K.gradients(z,[x,y])
g2 = K.gradients(g,[x,y])

print(K.eval(g2[0])) #Works
print(K.eval(g2[1])) #Gradient is None, can't be evaluated

【问题讨论】:

    标签: python tensorflow keras gradient


    【解决方案1】:

    您可以尝试如下更改g2

    g2_correct = [g2_elem if g2_elem is not None else K.zeros_like(var) for var, grad_2 in zip(vars, g2)]
    

    参考:

    【讨论】:

    • 谢谢!这有效(在我将 grad_2 更改为 g2_elem 之后)。你知道这是否会弄乱计算图或其他东西。基本上,这会给我带来更多问题吗?
    • 另外,你知道这是否并行运行吗?从看起来 for 循环不会并行运行,我非常希望我的代码并行运行:P
    • 对于计算图部分,我不确定它是否会搞砸,因为它是矢量运算,在层中None 部分可能仍然有意义。对于并行运行,您可以搜索一下,因为当我仍在努力实现并行运行时,我无法提供建议。
    • 我发现了如何并行做基本相同的事情,tensorflow 有一个“where”函数可以做到这一点:D 不知道我在搜索答案时怎么没早点找到它这个问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-11
    • 2020-08-16
    • 2022-11-13
    • 1970-01-01
    • 2019-10-29
    • 1970-01-01
    相关资源
    最近更新 更多