问题描述
我想在Keras(Tensorflow 2.3.0)中使用以下结构构建一个层:
基本上,我只想将此矩阵与输入向量相乘,就像在密集层中一样。但是我想将此特殊矩阵与正在学习的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 (将#修改为@)