Tensorflow 如何使用复值权重进行反向传播

Tensorflow 如何使用复值权重进行反向传播,tensorflow,neural-network,theano,complex-numbers,Tensorflow,Neural Network,Theano,Complex Numbers,我们目前正在尝试复制以下论文的结果: 为此,我们需要在包含复数权重的神经网络上运行反向传播 当我们尝试这样做时(使用代码[0]),我们会得到一个错误(在[1])。我们找不到训练包含复数权重的神经网络的任何项目的源代码 我们想知道我们是否需要自己实现论文的反向传播调整,或者这是否已经是一些神经网络库的一部分。如果需要在Tensorflow中实现,那么实现这一点的正确步骤是什么 [0]: [1] : Extracting/tmp/tensorflow/mnist/input_data/train-i

我们目前正在尝试复制以下论文的结果:

为此,我们需要在包含复数权重的神经网络上运行反向传播

当我们尝试这样做时(使用代码[0]),我们会得到一个错误(在[1])。我们找不到训练包含复数权重的神经网络的任何项目的源代码

我们想知道我们是否需要自己实现论文的反向传播调整,或者这是否已经是一些神经网络库的一部分。如果需要在Tensorflow中实现,那么实现这一点的正确步骤是什么

[0]:

[1] :

Extracting/tmp/tensorflow/mnist/input_data/train-images-idx3-ubyte.gz
提取/tmp/tensorflow/mnist/input_数据/train-labels-idx1-ubyte.gz
提取/tmp/tensorflow/mnist/input_data/t10k-images-idx3-ubyte.gz
提取/tmp/tensorflow/mnist/input_data/t10k-labels-idx1-ubyte.gz
回溯(最近一次呼叫最后一次):
文件“complex.py”,第156行,在
tf.app.run(main=main,argv=[sys.argv[0]]]+未解析)
文件“/Users/kevin/wdev/learn_tensor/env/lib/python3.6/site packages/tensorflow/python/platform/app.py”,第48行,运行中
_系统出口(主(_sys.argv[:1]+标志_passthrough))
文件“complex.py”,第58行,在main中
训练步骤=优化器。最小化(交叉熵)
文件“/Users/kevin/wdev/learn_tensor/env/lib/python3.6/site packages/tensorflow/python/training/optimizer.py”,第343行
梯度损失=梯度损失)
文件“/Users/kevin/wdev/learn_tensor/env/lib/python3.6/site packages/tensorflow/python/training/optimizer.py”,第419行,在计算梯度中
[v代表g,v代表梯度和变量
文件“/Users/kevin/wdev/learn\u tensor/env/lib/python3.6/site packages/tensorflow/python/training/optimizer.py”,第547行,在有效数据类型中
数据类型,t.name,[v代表有效的\u数据类型中的v]))
ValueError:线性组合/变量0的tf.complex64类型无效,应为:[tf.float32,tf.float64,tf.float16]。

我还尝试在tensorflow中实现类似的网络,发现优化器无法使用复数张量进行反向传播。解决方法是为实部和虚部使用单独的实数张量。您必须编写一个函数来获得“复数”的振幅网络的输出,即Re^2-Im^2。此输出值是您将用于计算损失的值。

使用优化器将无法工作。这是一个报告,我认为tf 2还不支持它。但是,您可以手工制作,例如:

[...]
gradients = tf.gradients(mse, [weights])[0]
training_op = tf.assign(weights, weights - learning_rate * gradients)
init = tf.global_variables_initializer()

with tf.Session() as sess:
    sess.run(init)
    sess.run(training_op)

这里的梯度按预期运行,并按预期计算梯度。这里讨论的是复杂变量的梯度计算内容。

我现在研究以下内容:。
Extracting /tmp/tensorflow/mnist/input_data/train-images-idx3-ubyte.gz
Extracting /tmp/tensorflow/mnist/input_data/train-labels-idx1-ubyte.gz
Extracting /tmp/tensorflow/mnist/input_data/t10k-images-idx3-ubyte.gz
Extracting /tmp/tensorflow/mnist/input_data/t10k-labels-idx1-ubyte.gz
Traceback (most recent call last):
  File "complex.py", line 156, in <module>
    tf.app.run(main=main, argv=[sys.argv[0]] + unparsed)
  File "/Users/kevin/wdev/learn_tensor/env/lib/python3.6/site-packages/tensorflow/python/platform/app.py", line 48, in run
    _sys.exit(main(_sys.argv[:1] + flags_passthrough))
  File "complex.py", line 58, in main
    train_step = optimizer.minimize(cross_entropy)
  File "/Users/kevin/wdev/learn_tensor/env/lib/python3.6/site-packages/tensorflow/python/training/optimizer.py", line 343, in minimize
    grad_loss=grad_loss)
  File "/Users/kevin/wdev/learn_tensor/env/lib/python3.6/site-packages/tensorflow/python/training/optimizer.py", line 419, in compute_gradients
    [v for g, v in grads_and_vars
  File "/Users/kevin/wdev/learn_tensor/env/lib/python3.6/site-packages/tensorflow/python/training/optimizer.py", line 547, in _assert_valid_dtypes
    dtype, t.name, [v for v in valid_dtypes]))
ValueError: Invalid type tf.complex64 for linear_combination/Variable:0, expected: [tf.float32, tf.float64, tf.float16].
[...]
gradients = tf.gradients(mse, [weights])[0]
training_op = tf.assign(weights, weights - learning_rate * gradients)
init = tf.global_variables_initializer()

with tf.Session() as sess:
    sess.run(init)
    sess.run(training_op)