张量流中具有复指数的自定义梯度
Custom gradient with complex exponential in tensorflow
作为练习,我正在尝试在 Tensorflow 中构建一个自定义运算符,并检查由 Tensorflow API 操作组成的相同前向操作的 Tensorflow 自动差异梯度。但是,我的自定义运算符的梯度不正确。看来我的复杂分析不正确,需要补习一下。
import tensorflow as tf
shape = (1, 16)
dtype = tf.complex64
x = tf.cast(tf.complex(tf.random.normal(shape), tf.random.normal(shape)), dtype=dtype)
def fun(x):
phi = x * tf.math.conj(x)
e = tf.exp(1j * phi)
return e
def d_fun(x):
d_phi = x + tf.math.conj(x)
phi = x * tf.math.conj(x)
d_e = 1j * d_phi * tf.exp(1j * phi)
return d_e
@tf.custom_gradient
def tf_custom(x):
e = fun(x)
def grad(dy):
d_e = d_fun(x)
return dy * d_e
return e, grad
with tf.GradientTape() as g:
g.watch(x)
res = fun(x)
dy_dx = g.gradient(res, x)
with tf.GradientTape() as g:
g.watch(x)
res2 = tf_custom(x)
dy_dx2 = g.gradient(res2, x)
print(tf.reduce_sum(tf.abs(res - res2)).numpy())
print(tf.reduce_sum(tf.abs(dy_dx - dy_dx2)).numpy())
TensorFlow 2 不直接计算复杂变量函数的导数。似乎它使用 Wirtinger calculus. You can also find an explanation here.
计算复数函数的导数作为实部和虚部的函数
作为练习,我正在尝试在 Tensorflow 中构建一个自定义运算符,并检查由 Tensorflow API 操作组成的相同前向操作的 Tensorflow 自动差异梯度。但是,我的自定义运算符的梯度不正确。看来我的复杂分析不正确,需要补习一下。
import tensorflow as tf
shape = (1, 16)
dtype = tf.complex64
x = tf.cast(tf.complex(tf.random.normal(shape), tf.random.normal(shape)), dtype=dtype)
def fun(x):
phi = x * tf.math.conj(x)
e = tf.exp(1j * phi)
return e
def d_fun(x):
d_phi = x + tf.math.conj(x)
phi = x * tf.math.conj(x)
d_e = 1j * d_phi * tf.exp(1j * phi)
return d_e
@tf.custom_gradient
def tf_custom(x):
e = fun(x)
def grad(dy):
d_e = d_fun(x)
return dy * d_e
return e, grad
with tf.GradientTape() as g:
g.watch(x)
res = fun(x)
dy_dx = g.gradient(res, x)
with tf.GradientTape() as g:
g.watch(x)
res2 = tf_custom(x)
dy_dx2 = g.gradient(res2, x)
print(tf.reduce_sum(tf.abs(res - res2)).numpy())
print(tf.reduce_sum(tf.abs(dy_dx - dy_dx2)).numpy())
TensorFlow 2 不直接计算复杂变量函数的导数。似乎它使用 Wirtinger calculus. You can also find an explanation here.
计算复数函数的导数作为实部和虚部的函数