Layer
类keras.layers.Layer(
activity_regularizer=None,
trainable=True,
dtype=None,
autocast=True,
name=None,
**kwargs
)
这是所有层都继承的类。
层是一个可调用对象,它接受一个或多个张量作为输入,并输出一个或多个张量。它涉及计算,在 call()
方法中定义,以及一个状态(权重变量)。状态可以在以下位置创建
__init__()
中,例如通过 self.add_weight()
;build()
方法中,该方法由对层的第一个 __call__()
调用,并提供输入形状,这些形状在初始化时可能未知。层是可递归组合的:如果您将 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",
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"
。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
、正则化器和子层的标量损失列表。