问题描述
我正在为某个项目的一些量子状态数据构建机器学习模型,在该项目中我开发了自己需要实现的激活函数。它涉及一些无法从数学上消除的复杂因素。我能够使用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
库中,但是在实现复数以使用张量类型时并不够。我只想乘以
但无法使张量乘以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 (将#修改为@)