Layer
classkeras.layers.Layer(
activity_regularizer=None,
trainable=True,
dtype=None,
autocast=True,
name=None,
**kwargs
)
这是所有层继承的类.
层是一个可调用对象,它接受一个或多个张量作为输入,并输出一个或多个张量.它涉及计算,定义在call()
方法中,以及一个状态(权重变量).状态可以被创建:
__init__()
中,例如通过self.add_weight()
;build()
方法中,该方法由层的第一次__call__()
调用,并提供输入的形状,这些形状在初始化时可能未知.层是递归可组合的:如果你将一个层实例分配为另一个层的属性,外部层将开始跟踪内部层创建的权重.嵌套层应在__init__()
方法或build()
方法中实例化.
用户只需实例化一个层,然后将其视为可调用对象.
参数:
trainable:布尔值,表示层的变量是否应可训练.
name:层的字符串名称.
dtype:层的计算和权重的数据类型.也可以是keras.DTypePolicy
,允许计算和权重数据类型不同.默认为None
.None
表示使用keras.config.dtype_policy()
,这是一个float32
策略,除非设置为不同值(通过keras.config.set_dtype_policy()
).
属性:
name:层的名称(字符串).
dtype:层权重的数据类型.layer.variable_dtype
的别名.
variable_dtype:层权重的数据类型.
compute_dtype:层的计算数据类型.层会自动将输入转换为此数据类型,这会导致计算和输出也在此数据类型中.当使用混合精度时,如果使用keras.DTypePolicy
,这将不同于variable_dtype
.
trainable_weights:在反向传播中包含的变量列表.
non_trainable_weights:不应包含在反向传播中的变量列表.
weights:trainable_weights和non_trainable_weights列表的连接(按此顺序).
trainable:层是否应被训练(布尔值),即其潜在可训练的权重是否应作为layer.trainable_weights
的一部分返回.
input_spec:可选的(列表)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
# 创建层的状态(权重)
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",
)
# 定义计算
def call(self, inputs):
return ops.matmul(inputs, self.kernel) + self.bias
# 实例化层
linear_layer = SimpleDense(4)
# 这将调用`build(input_shape)`并创建权重
y = linear_layer(ops.ones((2, 2)))
assert len(linear_layer.weights) == 2
# 这些权重是可训练的,所以它们列在`trainable_weights`中
assert len(linear_layer.trainable_weights) == 2
除了通过训练期间反向传播更新的可训练权重外,层还可以有不可训练的权重.这些权重应在call()
期间手动更新.以下是一个计算其输入运行总和的层示例:
class ComputeSum(Layer):
def __init__(self, input_dim):
super(ComputeSum, self).__init__()
# 创建一个不可训练的权重
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
propertykeras.layers.Layer.weights
所有层的权重变量的列表.
与 layer.variables
不同,这不包括指标状态和随机种子.
trainable_weights
propertykeras.layers.Layer.trainable_weights
可训练权重变量的列表.
这些权重在训练过程中由优化器更新.
non_trainable_weights
propertykeras.layers.Layer.non_trainable_weights
不可训练的层权重变量列表.
这些权重在训练期间不应由优化器更新.与 layer.non_trainable_variables
不同,这不包括指标状态和随机种子.
add_weight
methodLayer.add_weight(
shape=None,
initializer=None,
dtype=None,
trainable=True,
autocast=True,
regularizer=None,
constraint=None,
aggregation="mean",
name=None,
)
添加一个权重变量到层.
参数:
shape: 变量的形状元组.必须是完全定义的(没有None
条目).如果未指定,默认为()
(标量).
initializer: 用于填充初始变量值的初始化器对象,或内置初始化器的字符串名称(例如"random_normal"
).如果未指定,浮点变量默认为"glorot_uniform"
,其他类型(例如int、bool)默认为"zeros"
.
dtype: 要创建的变量的数据类型,例如"float32"
.如果未指定,默认为层的变量数据类型(如果未指定,则默认为"float32"
).
trainable: 布尔值,表示变量是否应通过反向传播进行训练,或者其更新是否手动管理.默认为True
.
autocast: 布尔值,表示访问层变量时是否自动转换.默认为True
.
regularizer: 正则化器对象,用于在权重上应用惩罚.这些惩罚在优化过程中被累加到损失函数中.默认为None
.
constraint: 在任何优化器更新后调用的约束对象,或内置约束的字符串名称.默认为None
.
aggregation: 字符串,取值为'mean'
、'sum'
、'only_first_replica'
.注释变量在编写自定义数据并行训练循环时用于此变量的多副本聚合类型.
name: 变量的字符串名称.有助于调试.
trainable
propertykeras.layers.Layer.trainable
可设置的布尔值,指示该层是否可以训练.
get_weights
methodLayer.get_weights()
返回 layer.weights
的值,形式为一个 NumPy 数组列表.
set_weights
methodLayer.set_weights(weights)
从一个NumPy数组列表中设置layer.weights
的值.
get_config
methodModel.get_config()
返回对象的配置.
对象配置是一个Python字典(可序列化), 包含重新实例化它所需的信息.
add_loss
methodLayer.add_loss(loss)
可以在 call()
方法内部调用来添加一个标量损失.
示例:
class MyLayer(Layer):
...
def call(self, x):
self.add_loss(ops.sum(x))
return x
losses
propertykeras.layers.Layer.losses
来自 add_loss
、正则化器和子层的标量损失列表.