搭建复数神经网络遇到的问题【求交流】

最近在研究显微图像的处理,想用深度神经网络实现。发现网上对复数神经网络的资料真的不多,代码几乎都局限于 deep complex networks 这一篇论文。有很多论文研究复数神经网络的,也都是前向传播、反向传播等理论知识,实践性代码几乎没有。

【我的实验数据】拿到的数据是经过处理的复数数据,尺寸大小为888*2048。

基于keras搭建网络层,至于实数形式的网络框架已经没有问题,并且能达到较好的效果,但是遇到复数域,问题就比较大,看了很多论文,仍无收获,希望能和各位交流讨论。

遇到的问题如下:

1. 阅读了《 deep complex networks 》这篇论文,以及下载了其代码。

  • 论文地址:https://arxiv.org/abs/1705.09792

  • 代码地址:https://github.com/ChihebTrabelsi/deep_complex_networks

对于论文,翻译了一遍,大致能看懂,就是在运行代码时遇到不少问题,有能成功看懂代码的大佬吗?

2. 我的数据是npy格式的,我把复数comlex128形式的数据存为(batch,channels,x_dim ,y_dim),我使用原来实数搭建的网络,直接运行,没有报错,只是在计算时出现警告:

/home/zkh/anaconda3/envs/zmm/lib/python3.6/site-packages/numpy/core/numeric.py:531: 
ComplexWarning: Casting complex values to real discards the imaginary part
  return array(a, dtype, copy=False, order=order)

所以出现的结果会直接变成实数的计算。

3. 当我把实数搭建的网络层换成1中所述的代码中的层编码时,出现了另外的问题。

例如:

input_img = Input((1,888,2048))
#x = conv.ComplexConv2D(3, (3, 3),padding='same')(input_img)
x =Convolution2D(3, (3, 3),padding='same')(input_img)
autoencoder = Model(inputs=input_img, outputs=x)
decoded_imgs = autoencoder.predict(x_train)
print(x)
print(decoded_imgs.shape)


运行结果为:Tensor("conv2d_2/BiasAdd:0", shape=(?, 1, 888, 3), dtype=float32)
(1, 1, 888, 3)

而当改为

input_img = Input((1,888,2048))
x = conv.ComplexConv2D(3, (3, 3),padding='same')(input_img)
#x =Convolution2D(3, (3, 3),padding='same')(input_img)
autoencoder = Model(inputs=input_img, outputs=x)
decoded_imgs = autoencoder.predict(x_train)
print(x)
print(decoded_imgs.shape)

运行结果为:Tensor("complex_conv2d_2/BiasAdd:0", shape=(?, 1, 888, 6), dtype=float32)
(1, 1, 888, 6)

对于为什么输入的是3个卷积核,而输出的是6个,表示疑问,还有复数complex128直接变为float32类型也表示疑问。

4. 第一次运行池化层时,直接报错如下:

-----
TypeError                                 Traceback (most recent call last)
 in ()
      2 x = conv.ComplexConv2D(6, (3, 3),padding='same')(input_img)
      3 #x =Convolution2D(3, (3, 3),padding='same')(input_img)
----> 4 x = pool.SpectralPooling2D((2, 2))(x)
      5 autoencoder = Model(inputs=input_img, outputs=x)
      6 decoded_imgs = autoencoder.predict(x_train)

TypeError: __init__() takes 1 positional argument but 2 were given

后来试验之后,知道了错误的原因,改为了:

x = pool.SpectralPooling2D(gamma=[0.15,0.15])(x)

错误是改掉了,但是结果延续上面的,直接以实数的形式出现。

5. 还有个问题是,复数的值差别挺大的,我要想使用自编码形式的话,我的损失函数该使用什么呢?

之前实数的时候loss用的mse,但发现相位很接近的两个数据的复数形式的数据,两者差别很大,所以mse不是很好的选择,所以很疑惑用什么损失函数比较好?

比如:相位数据只差0.4的两个数据,并且人为也知道它们是比较接近的,但是复数差别为

(2.23770128717e+12-644411468251j),所以这就对损失函数的选择要求比较高。

6. 后面的层还在修改中,并且一直在研究复数域神经网络的搭建,希望有大佬能提供帮助。

有能对我提出的问题解答的吗,或者能提供一点思路,或者对复数神经网络有研究的,或者也在研究这个的?

希望一起探讨。

你可能感兴趣的:(代码问题解决,复数,神经网络,keras)