keras为add或matmul定义了一个可训练的变量

时间:2019-07-11 09:55:22

标签: tensorflow keras

在使用tf.keras构建模型时遇到一些问题。现在我想定义一个形状为(64,128)的火车重量张量,类似于tf.get_variable。但是我无法实现。

过去,我尝试了很多方法,但是我想寻找一种简便的方法。

inputs = tf.keras.Input((128,))
weights = tf.Variable(tf.random.normal((64, 128)))
output = tf.keras.layers.Lambda(lambda x: tf.matmul(x, tf.transpose(weights)))(inputs)
model = tf.keras.Model(inputs, output)
model.summary()
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
input_10 (InputLayer)        (None, 128)               0         
_________________________________________________________________
lambda_2 (Lambda)            (None, 64)                0         
=================================================================
Total params: 0
Trainable params: 0
Non-trainable params: 0

定义的重量不可训练。
此外,我知道Dense可以得到训练有素的矩阵权重和偏差。但是如果我想增加一个偏见,就不能使用Dense。
但是,我必须在自定义图层中使用add_weights,例如:

class Bias(keras.layers.Layer):
    def build(self, input_shape):
        self.bias = self.add_weight(shape=(64, 128), initializer='zeros', dtype=tf.float32, name='x')
        self.built = True

    def call(self, inputs):
        return inputs + self.bias

inputs = Input(shape=(64, 128))
outputs = Bias()(inputs)
model = Model(inputs=inputs, outputs=outputs)
model.summary()
Layer (type)                 Output Shape              Param #   
=================================================================
input_11 (InputLayer)        (None, 64, 128)           0         
_________________________________________________________________
bias_5 (Bias)                (None, 64, 128)           8192      
=================================================================
Total params: 8,192
Trainable params: 8,192
Non-trainable params: 0

是否有更容易的方法来定义可训练变量?

0 个答案:

没有答案