这是所有层都继承的类。
继承自: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)
,如果层需要,用户可以选择添加training
和mask
。*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.
例子:
这是一个基本示例:具有两个变量 w
和 b
的层,返回 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 == []
有关创建层的更多信息,请参阅通过子类化创建新层和模型指南
相关用法
- Python tf.keras.layers.LayerNormalization用法及代码示例
- Python tf.keras.layers.Layer.add_loss用法及代码示例
- Python tf.keras.layers.Layer.add_metric用法及代码示例
- Python tf.keras.layers.Layer.set_weights用法及代码示例
- Python tf.keras.layers.Layer.get_weights用法及代码示例
- Python tf.keras.layers.Lambda用法及代码示例
- Python tf.keras.layers.LocallyConnected1D用法及代码示例
- Python tf.keras.layers.LSTMCell用法及代码示例
- Python tf.keras.layers.LSTM用法及代码示例
- Python tf.keras.layers.LeakyReLU用法及代码示例
- Python tf.keras.layers.LocallyConnected2D用法及代码示例
- Python tf.keras.layers.InputLayer用法及代码示例
- Python tf.keras.layers.serialize用法及代码示例
- Python tf.keras.layers.Dropout用法及代码示例
- Python tf.keras.layers.maximum用法及代码示例
- Python tf.keras.layers.Conv2D用法及代码示例
- Python tf.keras.layers.RepeatVector用法及代码示例
- Python tf.keras.layers.Multiply用法及代码示例
- Python tf.keras.layers.Activation用法及代码示例
- Python tf.keras.layers.Conv1D用法及代码示例
注:本文由纯净天空筛选整理自tensorflow.org大神的英文原创作品 tf.keras.layers.Layer。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。