通过单个参数在自己的Keras图层中创建特殊矩阵

问题描述

我想在Keras(Tensorflow 2.3.0)中使用以下结构构建一个层:

matrix

基本上,我只想将此矩阵与输入向量相乘,就像在密集层中一样。但是我想将此特殊矩阵与正在学习的lambda参数一起使用。我尝试了以下方法

class CarryOver(tf.keras.layers.Layer):
    # probably not relevant.
    def __init__(self,n_observations):
        super().__init__(autocast=False)
        self.n_observations = n_observations
    
    def carryover_matrix(self):
        res = np.zeros((self.n_observations,self.n_observations))
        for i in range(self.n_observations):
            for j in range(i+1):
                res[i,j] = self.carryover**(i-j)
        return tf.constant(res)

    def build(self,input_shape):
        self.carryover = self.add_weight(
            shape=(1,),initializer=tf.keras.initializers.Constant(0.0),constraint=tf.keras.constraints.MinMaxnorm(min_value=0.0,max_value=1.0),trainable=True,)

    # probably not relevant.
    def call(self,inputs):
        carryovers = self.carryover_matrix()
        inputs = tf.expand_dims(tf.transpose(inputs),axis=-1)
        return tf.transpose(tf.squeeze(tf.matmul(carryovers,inputs),axis=-1))

如果我创建一个图层并对其执行张量传递,则一切正常。

X = np.abs(np.random.randn(150,4))
c = CarryOver(150)
c(X) # proper output

但是,如果我在模型中使用它,事情将不再起作用。

model = tf.keras.Sequential([
    CarryOver(150),tf.keras.layers.Dense(1)
])

model.compile(
    loss=tf.keras.losses.MeanSquaredError(),optimizer=tf.keras.optimizers.Adam(learning_rate=0.01)
)

model.build(input_shape=(None,4))

我收到以下错误

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-68-8dca56ad3519> in <module>
     10 )
     11 
---> 12 model.build(input_shape=(None,4))

~\Miniconda3\lib\site-packages\tensorflow\python\keras\engine\sequential.py in build(self,input_shape)
    347         input_shape = tuple(input_shape)
    348         self._build_input_shape = input_shape
--> 349         super(Sequential,self).build(input_shape)
    350     self.built = True
    351 

~\Miniconda3\lib\site-packages\tensorflow\python\keras\engine\training.py in build(self,input_shape)
    430                            'method accepts an `inputs` argument.')
    431         try:
--> 432           self.call(x,**kwargs)
    433         except (errors.InvalidArgumentError,TypeError):
    434           raise ValueError('You cannot build your model by calling `build` '

~\Miniconda3\lib\site-packages\tensorflow\python\keras\engine\sequential.py in call(self,inputs,training,mask)
    384         kwargs['training'] = training
    385 
--> 386       outputs = layer(inputs,**kwargs)
    387 
    388       if len(nest.flatten(outputs)) != 1:

~\Miniconda3\lib\site-packages\tensorflow\python\keras\engine\base_layer.py in __call__(self,*args,**kwargs)
    983 
    984         with ops.enable_auto_cast_variables(self._compute_dtype_object):
--> 985           outputs = call_fn(inputs,**kwargs)
    986 
    987         if self._activity_regularizer:

~\Miniconda3\lib\site-packages\tensorflow\python\autograph\impl\api.py in wrapper(*args,**kwargs)
    256       except Exception as e:  # pylint:disable=broad-except
    257         if hasattr(e,'ag_error_Metadata'):
--> 258           raise e.ag_error_Metadata.to_exception(e)
    259         else:
    260           raise

ValueError: in user code:

    <ipython-input-43-50f8ab22ad29>:46 call  *
        carryovers = self.carryover_matrix()
    <ipython-input-65-42a1847b2327>:34 carryover_matrix  *
        res[i,j] = self.carryover**(i-j)

    ValueError: setting an array element with a sequence.

如果我创建一个参数并尝试在矩阵的不同位置使用Tensorflow,似乎Tensorflow不喜欢它。我也不明白为什么我在做“用序列设置数组元素”。 self.carrying是否结转一个数字?为什么我不能用它做一个矩阵?

您知道构建上述矩阵的正确方法吗?非常感谢!

最佳

罗伯特

解决方法

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

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

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