将`K.constant`或`self.add_weight(trainable = False)`用于图层中的固定权重是否有所不同

我有一个使用固定权重矩阵的自定义keras图层。我想知道如何使用带有tensorflow的keras API处理这个固定权重矩阵。特别是当K.constant提供更大的灵活性时(例如,我可以将self.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

 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

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

liutongyanjss 回答:将`K.constant`或`self.add_weight(trainable = False)`用于图层中的固定权重是否有所不同

K.constant仅仅是Keras类似于tf.constant的一种,它只是创建了一个常数值张量。它是一个较低层的构造,就像您说的那样,它仅对永远不变的值有用。大多数情况下,无需显式调用此方法,因为进行类似2 * my_tensor的操作会将2转换为常量 自动为您提供正确类型的张量。但是,在某些情况下,您可能更喜欢显式调用它,例如,如果您有一个常量数组,并且只希望一个张量表示它们(而不是将它们反复转换为新的常量张量)。

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

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

本文链接:https://www.f2er.com/3124399.html

大家都在问