当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


Python tf.keras.layers.Layer用法及代码示例


这是所有层都继承的类。

继承自:Module

用法

tf.keras.layers.Layer(
    trainable=True, name=None, dtype=None, dynamic=False, **kwargs
)

参数

  • trainable 布尔值,层的变量是否应该是可训练的。
  • name 图层的字符串名称。
  • dtype 层的计算和权重的 dtype。也可以是 tf.keras.mixed_precision.Policy ,它允许计算和权重 dtype 不同。 None 默认值表示使用 tf.keras.mixed_precision.global_policy() ,这是一个 float32 策略,除非设置为不同的值。
  • dynamic 如果您的层应该只即刻地运行,并且不应该用于生成静态计算图,请将其设置为True。例如,Tree-RNN 或递归网络就是这种情况,或者通常是使用 Python 控制流来操纵张量的任何层。如果 False ,我们假设该层可以安全地用于生成静态计算图。

属性

  • name 图层的名称(字符串)。
  • dtype 图层权重的 dtype。
  • variable_dtype dtype 的别名。
  • compute_dtype 层计算的 dtype。层会自动将输入转换为此 dtype,这会导致计算和输出也在此 dtype 中。当混合精度与 tf.keras.mixed_precision.Policy 一起使用时,这将不同于 variable_dtype
  • dtype_policy 图层的 dtype 策略。有关详细信息,请参阅tf.keras.mixed_precision.Policy 文档。
  • trainable_weights 要包含在反向传播中的变量列表。
  • non_trainable_weights 不应包含在反向传播中的变量列表。
  • weights 列表 trainable_weights 和 non_trainable_weights 的串联(按此顺序)。
  • trainable 是否应训练层(布尔值),即是否应将其 potentially-trainable 权重作为 layer.trainable_weights 的一部分返回。
  • input_spec 可选(列表)InputSpec 对象,指定层可以接受的输入约束。
  • activity_regularizer 该层输出的可选正则化函数。
  • dynamic 图层是否动态(eager-only);在构造函数中设置。
  • input 检索层的输入张量。

    仅当该层只有一个输入时才适用,即如果它连接到一个传入层。

  • losses 使用添加的损失列表add_loss()API。

    访问此属性时会创建变量正则化张量,因此非常安全:访问 tf.GradientTape 下的 losses 会将梯度传播回相应的变量。

    class MyLayer(tf.keras.layers.Layer):
      def call(self, inputs):
        self.add_loss(tf.abs(tf.reduce_mean(inputs)))
        return inputs
    l = MyLayer()
    l(np.ones((10, 1)))
    l.losses
    [1.0]
    inputs = tf.keras.Input(shape=(10,))
    x = tf.keras.layers.Dense(10)(inputs)
    outputs = tf.keras.layers.Dense(1)(x)
    model = tf.keras.Model(inputs, outputs)
    # Activity regularization.
    len(model.losses)
    0
    model.add_loss(tf.abs(tf.reduce_mean(x)))
    len(model.losses)
    1
    inputs = tf.keras.Input(shape=(10,))
    d = tf.keras.layers.Dense(10, kernel_initializer='ones')
    x = d(inputs)
    outputs = tf.keras.layers.Dense(1)(x)
    model = tf.keras.Model(inputs, outputs)
    # Weight regularization.
    model.add_loss(lambda:tf.reduce_mean(d.kernel))
    model.losses
    [<tf.Tensor:shape=(), dtype=float32, numpy=1.0>]
  • metrics 使用添加的指标列表add_metric()API。
    input = tf.keras.layers.Input(shape=(3,))
    d = tf.keras.layers.Dense(2)
    output = d(input)
    d.add_metric(tf.reduce_max(output), name='max')
    d.add_metric(tf.reduce_min(output), name='min')
    [m.name for m in d.metrics]
    ['max', 'min']
  • output 检索层的输出张量。

    仅当该层只有一个输出时才适用,即如果它连接到一个传入层。

  • supports_masking 该层是否支持使用 compute_mask 计算掩码。

层是一个可调用对象,它将一个或多个张量作为输入,并输出一个或多个张量。它涉及计算,定义在call()方法和一个状态(权重变量)。在子类实现者的方便下,可以在不同的地方创建状态:

  • __init__()中;
  • 在可选的 build() 方法中,该方法由第一个 __call__() 调用到层,并提供在初始化时可能不知道的输入的形状;
  • call() 的第一次调用中,下面讨论了一些注意事项。

用户只需实例化一个层,然后将其视为可调用的。

我们建议Layer 的后代实现以下方法:

  • __init__() :定义自定义图层属性,并使用 add_weight() 或其他状态创建不依赖于输入形状的图层权重。
  • build(self, input_shape) :此方法可用于创建取决于输入形状的权重,使用 add_weight() 或其他状态。 __call__() 将通过调用 build() 自动构建层(如果尚未构建)。
  • call(self, inputs, *args, **kwargs): 调用__call__确定后build()已被调用。call()执行将图层应用于inputs.第一次调用可能会另外创建无法方便地创建的状态build();有关详细信息,请参阅其文档字符串。您可以选择使用的两个保留关键字参数call()是:
    • training(布尔值,调用是处于推理模式还是训练模式)。在层/模型子类化指南中查看更多详细信息
    • mask(布尔张量编码输入中的掩码时间步,用于 RNN 层)。在层/模型子类化指南中查看更多详细信息此方法的典型签名是 call(self, inputs) ,如果层需要,用户可以选择添加 trainingmask*args**kwargs 仅在计划添加更多输入参数时对将来的扩展有用。
  • get_config(self):Returns a dictionary containing the configuration used to initialize this layer. If the keys differ from the arguments in __init__, then override from_config(self) as well. This method is used when saving the layer or a model that contains this layer.

例子:

这是一个基本示例:具有两个变量 wb 的层,返回 y = w . x + b 。它展示了如何实现 build()call() 。设置为图层属性的变量将作为图层的权重进行跟踪(在 layer.weights 中)。

class SimpleDense(Layer):

  def __init__(self, units=32):
      super(SimpleDense, self).__init__()
      self.units = units

  def build(self, input_shape): # Create the state of the layer (weights)
    w_init = tf.random_normal_initializer()
    self.w = tf.Variable(
        initial_value=w_init(shape=(input_shape[-1], self.units),
                             dtype='float32'),
        trainable=True)
    b_init = tf.zeros_initializer()
    self.b = tf.Variable(
        initial_value=b_init(shape=(self.units,), dtype='float32'),
        trainable=True)

  def call(self, inputs): # Defines the computation from inputs to outputs
      return tf.matmul(inputs, self.w) + self.b

# Instantiates the layer.
linear_layer = SimpleDense(4)

# This will also call `build(input_shape)` and create the weights.
y = linear_layer(tf.ones((2, 2)))
assert len(linear_layer.weights) == 2

# These weights are trainable, so they're listed in `trainable_weights`:
assert len(linear_layer.trainable_weights) == 2

请注意,add_weight() 方法提供了创建权重的快捷方式:

class SimpleDense(Layer):

  def __init__(self, units=32):
      super(SimpleDense, self).__init__()
      self.units = units

  def build(self, input_shape):
      self.w = self.add_weight(shape=(input_shape[-1], self.units),
                               initializer='random_normal',
                               trainable=True)
      self.b = self.add_weight(shape=(self.units,),
                               initializer='random_normal',
                               trainable=True)

  def call(self, inputs):
      return tf.matmul(inputs, self.w) + self.b

除了在训练期间通过反向传播更新的可训练权重外,层还可以具有不可训练的权重。这些权重应在 call() 期间手动更新。这是一个计算其输入的运行总和的示例层:

class ComputeSum(Layer):

  def __init__(self, input_dim):
      super(ComputeSum, self).__init__()
      # Create a non-trainable weight.
      self.total = tf.Variable(initial_value=tf.zeros((input_dim,)),
                               trainable=False)

  def call(self, inputs):
      self.total.assign_add(tf.reduce_sum(inputs, axis=0))
      return self.total

my_sum = ComputeSum(2)
x = tf.ones((2, 2))

y = my_sum(x)
print(y.numpy())  # [2. 2.]

y = my_sum(x)
print(y.numpy())  # [4. 4.]

assert my_sum.weights == [my_sum.total]
assert my_sum.non_trainable_weights == [my_sum.total]
assert my_sum.trainable_weights == []

有关创建层的更多信息,请参阅通过子类化创建新层和模型指南

相关用法


注:本文由纯净天空筛选整理自tensorflow.org大神的英文原创作品 tf.keras.layers.Layer。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。