使用“K.constant”或“self.add_weight(trainable=False)”作为层中的固定权重有什么不同

Luc*_*ucG 5 python keras tensorflow

我有一个使用固定权重矩阵的自定义 keras 层。我想知道如何使用 keras API 和张量流来处理这个固定权重矩阵。特别是,为什么我要使用K.constantwhenself.add_weights(trainable=False)提供更大的灵活性(例如,我可以Layer.set_weights与后者一起使用)。

具体来说,在构建方法中我可以这样做:

 class CustomLayer(Layer):
        ...

        def build(self, input_shape):
               self.fixed_tensor = K.constant(self.my_fixed_tensor)
               self.built = True
Run Code Online (Sandbox Code Playgroud)

或者

 class CustomLayer(Layer):
        ...

        def build(self, input_shape):
               self.fixed_tensor = self.add_weight(
                    shape=self.my_fixed_tensor.shape,
                    initializer=lambda shape, dtype: self.my_fixed_tensor,
                    trainable=False
               )
               self.built = True
Run Code Online (Sandbox Code Playgroud)

两种解决方案都有效,我想知道它们在后端的处理方式是否不同。

jde*_*esa 5

K.constant只是 Keras 类似于tf.constant,它只是创建一个常值张量。它是一个较低级别的构造,正如您所说,它仅对永远不会改变的值有用。大多数情况下,没有必要显式调用它,因为执行类似操作2 * my_tensor会自动将 转换2为具有正确类型的常量张量。但是,在某些情况下,您可能更愿意显式调用它,例如,如果您有一个常量值数组,并且只需要一个张量来表示它们(而不是重复地将它们转换为新的常量张量)。

add_weight是一种层方法,它创建一个表示层中某些可变值的 TensorFlow 变量。权重是一个更高层次的概念,与分层模型相关。正如您所指出的,无论可训练与否,权重都可以动态改变。

理论上,模型中完全可以没有常数,并将它们全部替换为权重。然而,它通常不太实用,因为变量(至少在 1.x 中)需要初始化,它们的使用不能像常量一样优化,而且如果您从不更改它,它们的开销不会给您带来任何好处。