张量流中的复杂卷积

问题描述 投票:0回答:3

我正在尝试运行一个简单的卷积,但具有复数:

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 convolution complex-numbers
3个回答
0
投票

可能为时已晚,但对于任何仍然感兴趣的人来说:将卷积应用于复杂的值数据并不像常用的数据类型(例如 float32)那么简单。有研究为此目的研究了不同的网络结构(例如,请参阅“Deep Complex U-Net”的link)。这些结构在 pytorchtensorflow 中都有实现。


0
投票

所有复值特征都分为笛卡尔(实数、虚数)或极坐标(模数、角度)表示。 没有人真正尝试使用纯粹复杂的单一功能;我很想被证明是错的!


0
投票

您可以通过将张量分解为实部和虚部来执行复杂的卷积。如果 x=a+bi 且 y=c+di 则 xy = ac-bd + i*(bc+ad)。同样,您可以将张量分解为实部和虚部,并分别对每个部分进行卷积。伪代码:

A_real = tf.math.real(A)
A_imag = tf.math.imag(A)

B_real = tf.math.real(B)
B_imag = tf.math.imag(B)

AB_conv_real = convolve(A_real, B_real) - convolve(A_imag, B_imag) 
AB_conv_imag = convolve(A_real, B_imag) + convolve(A_imag, B_real)
© www.soinside.com 2019 - 2024. All rights reserved.