Tensorflow中的复杂卷积

4

我想运行一个简单的复数卷积:

r = np.random.random([1,10,10,10])
i = np.random.random([1,10,10,10])
x = tf.complex(r,i)

conv_layer = tf.layers.conv2d(
            inputs=x,
            filters=10,
            kernel_size=[3,3],
            kernel_initializer=utils.truncated_normal_complex(),
            activation=tf.nn.sigmoid)

然而,我遇到了这个错误:
TypeError: Value passed to parameter 'input' has DataType complex128 not in list of allowed values: float16, float32

有人知道如何在Tensorflow中实现这样的卷积吗?

我需要实现一个自定义操作吗,还是还有更好的选择?

令人沮丧的是,复杂矩阵乘法是可能的,例如以下代码可以正常运行:

def r():
    return np.random.random([10,10])
A = tf.complex(r(),r())
B = tf.complex(r(),r())
C = tf.multiply(A,B)
sess.run(C)

因为卷积本质上就是矩阵乘法,所以我认为没有任何理由卷积不会起作用。

谢谢。


你使用的是哪个版本的Tensorflow?当我使用TF 1.0.1时,同样的问题仍然存在。 - robit
追踪到了一个在 Github 上的问题:https://github.com/tensorflow/tensorflow/issues/2255;虽然这个问题已经关闭了,但我还是不清楚如何在内核中使用复数。 - zbyte
2个回答

0

可能已经太晚了,但对于仍然感兴趣的人来说:将卷积应用到复值数据并不像您通常处理float32等常规数据类型那样简单。有研究调查了不同的网络结构,以实现此目的(例如,请参见“Deep Complex U-Net” link)。在 pytorchtensorflow 中有这些结构的实现。


0
所有的复数特征都被分成笛卡尔(实部,虚部)或极坐标(模长,角度)表示。 实际上没有人试图使用纯粹的复数特征;但我很愿意被证明是错的!

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接