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)
两种解决方案都有效,我想知道它们在后端的处理方式是否不同。
K.constant只是 Keras 类似于tf.constant,它只是创建一个常值张量。它是一个较低级别的构造,正如您所说,它仅对永远不会改变的值有用。大多数情况下,没有必要显式调用它,因为执行类似操作2 * my_tensor会自动将 转换2为具有正确类型的常量张量。但是,在某些情况下,您可能更愿意显式调用它,例如,如果您有一个常量值数组,并且只需要一个张量来表示它们(而不是重复地将它们转换为新的常量张量)。
add_weight是一种层方法,它创建一个表示层中某些可变值的 TensorFlow 变量。权重是一个更高层次的概念,与分层模型相关。正如您所指出的,无论可训练与否,权重都可以动态改变。
理论上,模型中完全可以没有常数,并将它们全部替换为权重。然而,它通常不太实用,因为变量(至少在 1.x 中)需要初始化,它们的使用不能像常量一样优化,而且如果您从不更改它,它们的开销不会给您带来任何好处。
| 归档时间: |
|
| 查看次数: |
4782 次 |
| 最近记录: |