自定义Tensorflow层,对角线化+可训练

时间:2020-03-12 16:30:34

标签: python tensorflow deep-learning

我想将以下函数编码为TS层。令x为d维向量。
x-> tf.linalg.diag(x)* A + b,

其中A是可训练的 dxd矩阵,b是可训练的(d维)向量。

如果A和b不在那里,我会使用Lambda层,但是既然它们在...我将如何处理。


P.s .:出于教育上的考虑,我不想喂食lambda层:

Lambda(lambda x: tf.linalg.diag(x)))

进入具有“身份”激活的完全连接层。 (我知道这行得通,但实际上并不能帮助我学习如何解决问题:))

1 个答案:

答案 0 :(得分:0)

您可以创建自定义图层,然后将函数放入调用方法中。

class Custom_layer(keras.layers.Layer):

    def __init__(self, dim):
        super(Custom_layer, self).__init__()
        self.dim = dim

        # add trainable weight
        self.weight = self.add_weight(shape=(dim,dim),trainable=True)
        # add trainable bias
        self.bias = self.add_weight(shape=(dim))

    def call(self, input):
        # your function
        return (tf.linalg.diag(input)*self.weight) + self.bias
    def get_config(self):
        config = super(Custom_layer, self).get_config()
        config['dim'] = self.dim
        return config

并像普通图层一样使用它,并在使用时为其提供尺寸参数。

my_layer = Custom_layer(desire_dimension)
output = my_layer(input)