项目场景:
在使用tensorflow.keras自定义网络层时遇到的,出于对numpy的习惯,生成复数会直接在矩阵后面生意-1j,在tensoflow中则会报错
问题描述:
Cannot convert (-0-1j) to EagerTensor of dtype float
这里需要强调的是(-0-1j) 复数,如果是其他的数据很有可能只是因为数据类型不匹配不都是float的问题。
所以要通过tf.complex()来生成复数
def call(self, inputs):
#tensorflow正确的复数生成方式
self.kernel = tf.complex(self.kernel,tf.ones(1080))
#错误的复数生成方式
out_SLM1 = tf.exp(-1.0j * self.kernel)
U12 = fftshift(fft2(fftshift(out_SLM1)))
U21 = fftshift(ifft2(fftshift(tf.multiply(U12, inputs))))
return U21
原因分析:
代码如上,在tensorflow中的tensor张量和numpy中的ndarray的数据处理方式并不是完全互通的,不过也可以通过
len1 = tf.convert_to_tensor(len1)
来将ndarray转化为tensor
解决方案:
当遇到这个错误时,可能很多人一开始的反应都会是数据类型不匹配,往往会采用如下:
img_tensor = tf.cast(img_tensor, tf.float64)
或者直接简单粗暴些的形式
tf.float()
或者直接在前面的所要相乘的整数加.0
如果以上并不能解决问题的且你的数据中存在复数的话,可以查看下自己的复数生成是不是有习惯性错误
正确的tensorflow复数生成方法是通过tf.complex()