我正尝试在自定义层中使用分配操作,如下图和代码所述:
class test_layer(keras.layers.Layer):
def __init__(self, **kwargs):
super(test_layer, self).__init__(**kwargs)
def build(self, input_shape):
self.MM = TF.variable(np.zeros(shape=(1, 200, 10)))
super(test_layer, self).build(input_shape)
def compute_output_shape(self, input_shape):
return (input_shape[1][1], 10)
def call(self, x, **kwargs):
m = x[0] * x[1] * x[2]
self.MM[:,:,0].assign(m)
for i in range(1, 10):
m = m + x[0] * x[1] * x[2]
self.MM[:,:,i].assign(m)
return self.MM
基本上,该层应输出输入乘积之和的堆栈。但是,评估图层时,图层始终返回零。
a = Input(shape=(200, 1))
b = Input(shape=(200, 1))
c = Input(shape=(200, 1))
y = test_layer()([a, b, c])
model = Model([a, b, c], y)
result = model.predict([np.ones((1, 200, 1)), 2 * np.ones((1, 200, 1)), 3 * np.ones((1, 200, 1))])
result
Out[3]:
array([[[0., 0., 0., ..., 0., 0., 0.],
[0., 0., 0., ..., 0., 0., 0.],
[0., 0., 0., ..., 0., 0., 0.],
...,
[0., 0., 0., ..., 0., 0., 0.],
[0., 0., 0., ..., 0., 0., 0.],
[0., 0., 0., ..., 0., 0., 0.]]], dtype=float32)
我的问题是:
自定义图层代码有什么问题?
我用tf.concat
替换了assign操作,它可以产生正确的结果。但是我想知道哪个更有效(assign
或concat
)?对于concat
,您必须在每个call()
期间构造新的张量。对于assign
,您只需要向变量张量分配值,变量张量已被初始化(在build()
中)。