如何在keras.backend中使用复数进行自定义激活功能

问题描述

我正在为某个项目的一些量子状态数据构建机器学习模型,在该项目中我开发了自己需要实现的激活函数。它涉及一些无法从数学上消除的复杂因素。我能够使用numpy构建此激活功能,如下所示:

import numpy as np
def  softmax(x):
    return np.exp(x) / np.sum(np.exp(x),axis=1,keepdims=True)

def  qsoftmax(x):
    return np.multiply((np.sqrt(softmax(x))),(np.exp(np.multiply(1j,np.arctan(x)))))

# Test
scores2D = np.array([[1,2,3,6],[2,4,5,[3,8,7,6]])
print(np.sum(np.square(np.abs(qsoftmax((scores2D)))),axis = 1))

下一步是将其添加到我使用Keras构建的机器学习模型中。我不确定原因,但是使用Keras的Tensors不能与numpy一起使用,而是必须使用keras.backend中存在的有限功能。在大多数情况下,我能够将上面的代码转录到keras.backend库中,但是在实现复数以使用张量类型时并不够。我只想乘以

enter image description here

但无法使张量乘以1j,如图所示:

import keras.backend as K
from keras.utils.generic_utils import get_custom_objects
...
def QMsoftmax(x):
    softmax = K.exp(x) / K.sum(K.exp(x),keepdims=True)

    a = K.sqrt(softmax)
    arctan = K.cos(x)/K.sin(x)
    
    # Original method with exponential [e^(i arctan(x))]
    # b = K.exp(np.multiply(1j,arctan))
    # return np.multiply(a,b)

    # Second attempt with Eulers
    b = K.sin(arctan) + (1j * K.cos(arctan))
    return a * b

自定义激活功能调用如下:

get_custom_objects().update({'QMsoftmax': Activation(QMsoftmax)})
model.add(Activation(QMsoftmax,name='QMsoftmax'))

我遇到的主要错误

TypeError: Expected float32 passed to parameter 'y' of op 'Pow',got 1j of type 'complex' instead. Error: Expected float32,got 1j of type 'complex' instead.

...
        b = K.sin(tan) + (1j * K.cos(tan))
    /home/iisharankov/anaconda3/lib/python3.8/site-packages/tensorflow/python/ops/math_ops.py:1009 r_binary_op_wrapper
        x = ops.convert_to_tensor(x,dtype=y.dtype.base_dtype,name="x")
    /home/iisharankov/anaconda3/lib/python3.8/site-packages/tensorflow/python/framework/ops.py:1341 convert_to_tensor
        ret = conversion_func(value,dtype=dtype,name=name,as_ref=as_ref)
    /home/iisharankov/anaconda3/lib/python3.8/site-packages/tensorflow/python/framework/constant_op.py:321 _constant_tensor_conversion_function
        return constant(v,name=name)
    /home/iisharankov/anaconda3/lib/python3.8/site-packages/tensorflow/python/framework/constant_op.py:261 constant
        return _constant_impl(value,dtype,shape,name,verify_shape=False,/home/iisharankov/anaconda3/lib/python3.8/site-packages/tensorflow/python/framework/constant_op.py:298 _constant_impl
        tensor_util.make_tensor_proto(
    /home/iisharankov/anaconda3/lib/python3.8/site-packages/tensorflow/python/framework/tensor_util.py:451 make_tensor_proto
        _AssertCompatible(values,dtype)
    /home/iisharankov/anaconda3/lib/python3.8/site-packages/tensorflow/python/framework/tensor_util.py:330 _AssertCompatible
        raise TypeError("Expected %s,got %s of type '%s' instead." %

    TypeError: Expected float32,got 1j of type 'complex' instead.

我已经遍历整个网络,却一无所获。我尝试在keras中找到一些内容,以将1j乘以反正切,但是由于错误,似乎完全不支持复杂类型。我检查了keras.backend中提供的所有方法,但这些方法似乎都不是虚构的。有什么办法可以用虚构的组件编写此激活函数,以便训练模型?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)