Layer
类keras.layers.Layer(
activity_regularizer=None,
trainable=True,
dtype=None,
autocast=True,
name=None,
**kwargs
)
所有层都继承自此类。
层是一个可调用对象,它接收一个或多个张量作为输入,并输出一个或多个张量。它涉及在 call()
方法中定义的计算和一个状态(权重变量)。状态可以在
self.add_weight()
在 __init__()
中创建;build()
方法中,该方法由对层的第一个 __call__()
调用,并提供输入的形状,这些形状在初始化时可能未知。层是递归可组合的:如果您将 Layer 实例分配为另一个 Layer 的属性,则外部层将开始跟踪内部层创建的权重。嵌套层应在 __init__()
方法或 build()
方法中实例化。
用户只需实例化一个层,然后将其视为可调用对象。
参数
keras.DTypePolicy
,它允许计算和权重 dtype 不同。默认为 None
。None
表示使用 keras.config.dtype_policy()
,除非设置为不同的值(通过 keras.config.set_dtype_policy()
),否则为 float32
策略。属性
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="mean",
name=None,
)
向层添加权重变量。
参数
None
条目)。如果未指定,则默认为 ()
(标量)。"random_normal"
)。如果未指定,则对于浮点变量默认为 "glorot_uniform"
,对于所有其他类型(例如 int、bool)默认为 "zeros"
。"float32"
。如果未指定,则默认为层的变量 dtype(如果未指定,则默认为 "float32"
)。True
。True
。None
。None
。'mean'
、'sum'
、'only_first_replica'
之一。使用此变量编写自定义数据并行训练循环时,使用此变量注释变量的多副本聚合类型。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
、正则化器和子层的标量损失列表。