Tensorflow,Keras:在自定义图层中分配值不返回任何内容

时间:2018-08-03 08:17:03

标签: python tensorflow keras deep-learning

我正尝试在自定义层中使用分配操作,如下图和代码所述:

Figure Here

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)

我的问题是:

  1. 自定义图层代码有什么问题?

  2. 我用tf.concat替换了assign操作,它可以产生正确的结果。但是我想知道哪个更有效(assignconcat)?对于concat,您必须在每个call()期间构造新的张量。对于assign,您只需要向变量张量分配值,变量张量已被初始化(在build()中)。

0 个答案:

没有答案