将复值图像输入神经网络(张量流)

时间:2016-11-18 08:05:23

标签: machine-learning tensorflow neural-network computer-vision bigdata

我正在研究一个项目,该项目试图“学习”一组约10 k 复值输入图像(幅度/相位;真实/图像)与真实 - 之间的关系。带有48个条目的有价值的输出向量。此输出向量不是一组标签,而是一组数字,表示优化给定复值图像的视觉印象的最佳参数。这些参数由算法生成。有可能的是,数据中存在一些噪声(来自图像和生成参数矢量的算法)

这些参数越来越少取决于输入图像的FFT(快速傅里叶变换)。因此,我正在考虑使用FFT的一维重构版本(complexImage)来提供网络(5个隐藏层,但架构应该无关紧要) - 一些伪代码:

     // discretize spectrum
     obj_ft = fftshift(fft2(object));

     obj_real_2d = real(obj_ft);
     obj_imag_2d = imag(obj_ft);

     // convert 2D in 1D rows
     obj_real_1d = reshape(obj_real_2d, 1, []);
     obj_imag_1d = reshape(obj_imag_2d, 1, []);


     // create complex variable for 1d object and concat
     obj_complx_1d(index, :) = [obj_real_1d obj_imag_1d];

     opt_param_1D(index, :) = get_opt_param(object);

我想知道是否有更好的方法将复杂值图像输入深层网络。我想避免使用复杂的渐变,因为它不是真的有必要吗?!我“只是”尝试找到一个“黑盒子”,在插入新图像后输出优化的参数。

Tensorflow获取输入: obj_complx_1d 和输出矢量 opt_param_1D 进行培训。

2 个答案:

答案 0 :(得分:1)

有几种方法可以将复杂信号视为输入。

使用转换将其制作成图像'。短时傅立叶变换用于制作2D的光谱图。 x轴是时间,y轴是频率。如果您有复杂的输入数据,您可以选择仅查看幅度谱或转换数据的功率谱密度。

我在实践中看到的其他一些事情是将同相和正交(实/虚)通道视为在网络的早期层中分离,并在更高层中跨越两者进行操作。在早期阶段,您的网络将学习每个频道的特征,在更高层,它将学习I / Q频道之间的关系。

这些家伙用复杂的信号和神经网络做了很多事情。特别是检查卷积无线电调制识别网络'

http://geojson.org/geojson-spec.html

答案 1 :(得分:0)

在模型中使用复杂渐变来提供复数值数字的最简单方法是以不同的表示形式表示复杂值。两种主要方式是:

  1. 幅度/角度组件
  2. Real / Imaginary组件
  3. 我将使用幅度/角度分量来展示这个想法。假设你有一个2d numpy数组代表一个shape = (WIDTH, HEIGHT)

    的图像
    import numpy as np
    kSpace = np.fft.ifftshift(np.fft.fft2(img))
    

    这将为您提供2D复杂数组。然后,您可以将数组转换为

    data = np.dstack((np.abs(kSpace), np.angle(kSpace)))
    

    这个数组将是一个带有shape = (WIDTH, HEIGHT, 2)的numpy数组。该数组代表一个复值图像。对于一组图像,请确保将它们连接在一起以获得shape = (NUM_IMAGES, WIDTH, HEIGHT, 2)

    的数组

    我做了一个简单的例子,使用张量流来学习简单神经网络的傅里叶变换。您可以在https://github.com/michaelmendoza/learning-tensorflow

    找到此示例