Layer 类keras.layers.Layer(
activity_regularizer=None,
trainable=True,
dtype=None,
autocast=True,
name=None,
**kwargs
)
所有层都继承自此类。
层是一个可调用对象,它接受一个或多个张量作为输入,并输出一个或多个张量。它包含计算,在 call() 方法中定义,以及状态(权重变量)。状态可以在
__init__() 中创建,例如通过 self.add_weight();build() 方法中创建,该方法在第一次调用层时被调用,并提供输入的形状,这些形状可能在初始化时未知。层是可递归组合的:如果您将 Layer 实例分配给另一个 Layer 的属性,外部层将开始跟踪内部层创建的权重。嵌套层应在 __init__() 方法或 build() 方法中实例化。
用户只需实例化一个层,然后将其视为可调用对象即可。
参数
keras.DTypePolicy,它允许计算和权重 dtype 不同。默认为 None。None 表示使用 keras.config.dtype_policy(),它是一个 float32 策略,除非设置为其他值(通过 keras.config.set_dtype_policy())。属性
layer.variable_dtype 的别名。keras.DTypePolicy 结合使用混合精度时,这将与 variable_dtype 不同。layer.trainable_weights 的一部分返回。InputSpec 对象列表,指定层可接受的输入约束。我们建议 Layer 的子类实现以下方法:
__init__(): 定义自定义层属性,并创建不依赖于输入形状的层权重,使用 add_weight() 或其他状态。build(self, input_shape): 此方法可用于创建依赖于输入形状的权重,使用 add_weight() 或其他状态。__call__() 会自动构建层(如果尚未构建),方法是调用 build()。call(self, *args, **kwargs): 在确保 build() 已被调用后,在 __call__ 中调用。call() 执行将层应用于输入参数的逻辑。您可以在 call() 中选择性使用的两个保留关键字参数是:1. training(布尔值,表示调用是处于推理模式还是训练模式)。2. mask(布尔张量,编码输入中的掩码时间步,例如在 RNN 层中使用)。此方法的典型签名是 call(self, inputs),用户可以根据需要选择性地添加 training 和 mask。get_config(self): 返回一个包含用于初始化此层的配置的字典。如果键与 __init__() 中的参数不同,则也应覆盖 from_config(self)。保存层或包含此层的模型时使用此方法。示例
这是一个基本示例:一个具有两个变量 w 和 b 的层,它返回 y = w . x + b。它展示了如何实现 build() 和 call()。设置为层属性的变量作为层的权重(在 layer.weights 中)被跟踪。
class SimpleDense(Layer):
def __init__(self, units=32):
super().__init__()
self.units = units
# Create the state of the layer (weights)
def build(self, input_shape):
self.kernel = self.add_weight(
shape=(input_shape[-1], self.units),
initializer="glorot_uniform",
trainable=True,
name="kernel",
)
self.bias = self.add_weight(
shape=(self.units,),
initializer="zeros",
trainable=True,
name="bias",
)
# Defines the computation
def call(self, inputs):
return ops.matmul(inputs, self.kernel) + self.bias
# Instantiates the layer.
linear_layer = SimpleDense(4)
# This will also call `build(input_shape)` and create the weights.
y = linear_layer(ops.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
除了通过训练期间的反向传播更新的可训练权重外,层还可以拥有不可训练的权重。这些权重旨在在 call() 中手动更新。以下是一个计算其输入运行总和的示例层。
class ComputeSum(Layer):
def __init__(self, input_dim):
super(ComputeSum, self).__init__()
# Create a non-trainable weight.
self.total = self.add_weight(
shape=(),
initializer="zeros",
trainable=False,
name="total",
)
def call(self, inputs):
self.total.assign(self.total + ops.sum(inputs))
return self.total
my_sum = ComputeSum(2)
x = ops.ones((2, 2))
y = my_sum(x)
assert my_sum.weights == [my_sum.total]
assert my_sum.non_trainable_weights == [my_sum.total]
assert my_sum.trainable_weights == []
weights 属性keras.layers.Layer.weights
层所有权重变量的列表。
与 layer.variables 不同,它不包括指标状态和随机种子。
trainable_weights 属性keras.layers.Layer.trainable_weights
层所有可训练权重变量的列表。
这些是在训练期间由优化器更新的权重。
non_trainable_weights 属性keras.layers.Layer.non_trainable_weights
层所有不可训练权重变量的列表。
这些是不应由优化器在训练期间更新的权重。与 layer.non_trainable_variables 不同,它不包括指标状态和随机种子。
add_weight 方法Layer.add_weight(
shape=None,
initializer=None,
dtype=None,
trainable=True,
autocast=True,
regularizer=None,
constraint=None,
aggregation="none",
overwrite_with_gradient=False,
name=None,
)
向层添加一个权重变量。
参数
None 条目)。如果未指定,则默认为 ()(标量)。"random_normal")。如果未指定,则浮点变量默认为 "glorot_uniform",所有其他类型(例如 int、bool)默认为 "zeros"。"float32"。如果未指定,则默认为层的变量 dtype(其本身默认为 "float32",如果未指定)。True。True。None。None。None、"none"、"mean"、"sum" 或 "only_first_replica" 之一。在编写自定义数据并行训练循环时,使用此字符串来注解变量,表示该变量要使用的多副本聚合类型。默认为 "none"。False。trainable 属性keras.layers.Layer.trainable
可设置的布尔值,表示该层是否应可训练。
get_weights 方法Layer.get_weights()
将 layer.weights 的值作为 NumPy 数组列表返回。
set_weights 方法Layer.set_weights(weights)
从 NumPy 数组列表中设置 layer.weights 的值。
get_config 方法Model.get_config()
返回对象的配置。
对象配置是一个 Python 字典(可序列化),其中包含重新实例化它所需的信息。
add_loss 方法Layer.add_loss(loss)
可以在 call() 方法内部调用以添加一个标量损失。
示例
class MyLayer(Layer):
...
def call(self, x):
self.add_loss(ops.sum(x))
return x
losses 属性keras.layers.Layer.losses
来自 add_loss、正则化器和子层的标量损失列表。