Keras 3 API 文档 / 层 API / 层权重初始化器

层权重初始化器

初始化器的使用

初始化器定义了如何设置 Keras 层的初始随机权重。

用于将初始化器传递给层的关键字参数取决于层本身。通常,它只是 kernel_initializerbias_initializer

from keras import layers
from keras import initializers

layer = layers.Dense(
    units=64,
    kernel_initializer=initializers.RandomNormal(stddev=0.01),
    bias_initializer=initializers.Zeros()
)

所有内置初始化器也可以通过其字符串标识符传递

layer = layers.Dense(
    units=64,
    kernel_initializer='random_normal',
    bias_initializer='zeros'
)

可用的初始化器

以下内置初始化器作为 keras.initializers 模块的一部分提供

[源代码]

RandomNormal

keras.initializers.RandomNormal(mean=0.0, stddev=0.05, seed=None)

随机正态初始化器。

根据给定参数从正态分布中抽取样本。

示例

>>> # Standalone usage:
>>> initializer = RandomNormal(mean=0.0, stddev=1.0)
>>> values = initializer(shape=(2, 2))
>>> # Usage in a Keras layer:
>>> initializer = RandomNormal(mean=0.0, stddev=1.0)
>>> layer = Dense(3, kernel_initializer=initializer)

参数

  • mean: Python 标量或标量 Keras 张量。要生成的随机值的均值。
  • stddev: Python 标量或标量 Keras 张量。要生成的随机值的标准差。
  • seed: Python 整数或 keras.backend.SeedGenerator 的实例。用于使初始化器的行为确定性。请注意,使用整数或 None(未设置种子)作为种子的初始化器将在多次调用中产生相同的随机值。为了在多次调用中获得不同的随机值,请使用 keras.backend.SeedGenerator 的实例作为种子。

[源代码]

RandomUniform

keras.initializers.RandomUniform(minval=-0.05, maxval=0.05, seed=None)

随机均匀初始化器。

根据给定参数从均匀分布中抽取样本。

示例

>>> # Standalone usage:
>>> initializer = RandomUniform(minval=0.0, maxval=1.0)
>>> values = initializer(shape=(2, 2))
>>> # Usage in a Keras layer:
>>> initializer = RandomUniform(minval=0.0, maxval=1.0)
>>> layer = Dense(3, kernel_initializer=initializer)

参数

  • minval: Python 标量或标量 Keras 张量。要生成的随机值的范围的下限(包含)。
  • maxval: Python 标量或标量 Keras 张量。要生成的随机值的范围的上限(不包含)。
  • seed: Python 整数或 keras.backend.SeedGenerator 的实例。用于使初始化器的行为确定性。请注意,使用整数或 None(未设置种子)作为种子的初始化器将在多次调用中产生相同的随机值。为了在多次调用中获得不同的随机值,请使用 keras.backend.SeedGenerator 的实例作为种子。

[源代码]

TruncatedNormal

keras.initializers.TruncatedNormal(mean=0.0, stddev=0.05, seed=None)

生成截断正态分布的初始化器。

生成的数值类似于 RandomNormal 初始化器生成的数值,除了大于标准差两倍的数值会被丢弃并重新绘制。

示例

>>> # Standalone usage:
>>> initializer = TruncatedNormal(mean=0., stddev=1.)
>>> values = initializer(shape=(2, 2))
>>> # Usage in a Keras layer:
>>> initializer = TruncatedNormal(mean=0., stddev=1.)
>>> layer = Dense(3, kernel_initializer=initializer)

参数

  • mean: Python 标量或标量 Keras 张量。要生成的随机值的均值。
  • stddev: Python 标量或标量 Keras 张量。要生成的随机值的标准差。
  • seed: Python 整数或 keras.backend.SeedGenerator 的实例。用于使初始化器的行为确定性。请注意,使用整数或 None(未设置种子)作为种子的初始化器将在多次调用中产生相同的随机值。为了在多次调用中获得不同的随机值,请使用 keras.backend.SeedGenerator 的实例作为种子。

[源代码]

Zeros

keras.initializers.Zeros()

生成初始化为 0 的张量的初始化器。

示例

>>> # Standalone usage:
>>> initializer = Zeros()
>>> values = initializer(shape=(2, 2))
>>> # Usage in a Keras layer:
>>> initializer = Zeros()
>>> layer = Dense(units=3, kernel_initializer=initializer)

[源代码]

Ones

keras.initializers.Ones()

生成初始化为 1 的张量的初始化器。

也可通过快捷函数 ones 使用。

示例

>>> # Standalone usage:
>>> initializer = Ones()
>>> values = initializer(shape=(2, 2))
>>> # Usage in a Keras layer:
>>> initializer = Ones()
>>> layer = Dense(3, kernel_initializer=initializer)

[源代码]

GlorotNormal

keras.initializers.GlorotNormal(seed=None)

Glorot 正态初始化器,也称为 Xavier 正态初始化器。

从以 0 为中心的截断正态分布中抽取样本,其中 stddev = sqrt(2 / (fan_in + fan_out)),其中 fan_in 是权重张量中输入单元的数量,fan_out 是权重张量中输出单元的数量。

示例

>>> # Standalone usage:
>>> initializer = GlorotNormal()
>>> values = initializer(shape=(2, 2))
>>> # Usage in a Keras layer:
>>> initializer = GlorotNormal()
>>> layer = Dense(3, kernel_initializer=initializer)

参数

  • seed: Python 整数或 keras.backend.SeedGenerator 的实例。用于使初始化器的行为确定性。请注意,使用整数或 None(未设置种子)作为种子的初始化器将在多次调用中产生相同的随机值。为了在多次调用中获得不同的随机值,请使用 keras.backend.SeedGenerator 的实例作为种子。

参考文献


[源代码]

GlorotUniform

keras.initializers.GlorotUniform(seed=None)

Glorot 均匀初始化器,也称为 Xavier 均匀初始化器。

[-limit, limit] 内的均匀分布中抽取样本,其中 limit = sqrt(6 / (fan_in + fan_out))fan_in 是权重张量中输入单元的数量,fan_out 是输出单元的数量)。

示例

>>> # Standalone usage:
>>> initializer = GlorotUniform()
>>> values = initializer(shape=(2, 2))
>>> # Usage in a Keras layer:
>>> initializer = GlorotUniform()
>>> layer = Dense(3, kernel_initializer=initializer)

参数

  • seed: Python 整数或 keras.backend.SeedGenerator 的实例。用于使初始化器的行为确定性。请注意,使用整数或 None(未设置种子)作为种子的初始化器将在多次调用中产生相同的随机值。为了在多次调用中获得不同的随机值,请使用 keras.backend.SeedGenerator 的实例作为种子。

参考文献


[源代码]

HeNormal

keras.initializers.HeNormal(seed=None)

He 正态初始化器。

它从以 0 为中心的截断正态分布中抽取样本,其中 stddev = sqrt(2 / fan_in),其中 fan_in 是权重张量中输入单元的数量。

示例

>>> # Standalone usage:
>>> initializer = HeNormal()
>>> values = initializer(shape=(2, 2))
>>> # Usage in a Keras layer:
>>> initializer = HeNormal()
>>> layer = Dense(3, kernel_initializer=initializer)

参数

  • seed: Python 整数或 keras.backend.SeedGenerator 的实例。用于使初始化器的行为确定性。请注意,使用整数或 None(未设置种子)作为种子的初始化器将在多次调用中产生相同的随机值。为了在多次调用中获得不同的随机值,请使用 keras.backend.SeedGenerator 的实例作为种子。

参考文献


[源代码]

HeUniform

keras.initializers.HeUniform(seed=None)

He 均匀方差缩放初始化器。

[-limit, limit] 内的均匀分布中抽取样本,其中 limit = sqrt(6 / fan_in)fan_in 是权重张量中输入单元的数量)。

示例

>>> # Standalone usage:
>>> initializer = HeUniform()
>>> values = initializer(shape=(2, 2))
>>> # Usage in a Keras layer:
>>> initializer = HeUniform()
>>> layer = Dense(3, kernel_initializer=initializer)

参数

  • seed: Python 整数或 keras.backend.SeedGenerator 的实例。用于使初始化器的行为确定性。请注意,使用整数或 None(未设置种子)作为种子的初始化器将在多次调用中产生相同的随机值。为了在多次调用中获得不同的随机值,请使用 keras.backend.SeedGenerator 的实例作为种子。

参考文献


[源代码]

OrthogonalInitializer

keras.initializers.Orthogonal(gain=1.0, seed=None)

生成正交矩阵的初始化器。

如果要初始化的张量的形状是二维的,则使用从正态分布中抽取的随机数矩阵的 QR 分解获得的正交矩阵对其进行初始化。如果矩阵的行数少于列数,则输出将具有正交的行。否则,输出将具有正交的列。

如果要初始化的张量的形状是多于二维的,则初始化形状为 (shape[0] * ... * shape[n - 2], shape[n - 1]) 的矩阵,其中 n 是形状向量的长度。随后将该矩阵重塑为所需的形状的张量。

示例

>>> # Standalone usage:
>>> initializer = keras.initializers.Orthogonal()
>>> values = initializer(shape=(2, 2))
>>> # Usage in a Keras layer:
>>> initializer = keras.initializers.Orthogonal()
>>> layer = keras.layers.Dense(3, kernel_initializer=initializer)

参数

  • gain: 应用于正交矩阵的乘法因子。
  • seed: Python 整数。用于使初始化器的行为确定性。

参考文献


[源代码]

Constant

keras.initializers.Constant(value=0.0)

生成具有常数值的张量的初始化器。

仅允许标量值。提供的常数值必须可转换为调用初始化器时请求的数据类型。

示例

>>> # Standalone usage:
>>> initializer = Constant(10.)
>>> values = initializer(shape=(2, 2))
>>> # Usage in a Keras layer:
>>> initializer = Constant(10.)
>>> layer = Dense(3, kernel_initializer=initializer)

参数

  • value: Python 标量。

[源代码]

VarianceScaling

keras.initializers.VarianceScaling(
    scale=1.0, mode="fan_in", distribution="truncated_normal", seed=None
)

其尺度适应其输入张量形状的初始化器。

使用 distribution="truncated_normal" or "untruncated_normal" 时,从均值为零且标准差为(如果使用则在截断之后)stddev = sqrt(scale / n) 的截断/未截断正态分布中抽取样本,其中 n

  • 如果 mode="fan_in",则为权重张量中输入单元的数量
  • 如果 mode="fan_out",则为输出单元的数量
  • 如果 mode="fan_avg",则为输入和输出单元数量的平均值

使用 distribution="uniform" 时,从 [-limit, limit] 内的均匀分布中抽取样本,其中 limit = sqrt(3 * scale / n)

示例

>>> # Standalone usage:
>>> initializer = VarianceScaling(
    scale=0.1, mode='fan_in', distribution='uniform')
>>> values = initializer(shape=(2, 2))
>>> # Usage in a Keras layer:
>>> initializer = VarianceScaling(
    scale=0.1, mode='fan_in', distribution='uniform')
>>> layer = Dense(3, kernel_initializer=initializer)

参数

  • scale: 缩放因子(正浮点数)。
  • mode: "fan_in""fan_out""fan_avg" 之一。
  • distribution: 要使用的随机分布。"truncated_normal""untruncated_normal""uniform" 之一。
  • seed: Python 整数或 keras.backend.SeedGenerator 的实例。用于使初始化器的行为确定性。请注意,使用整数或 None(未设置种子)作为种子的初始化器将在多次调用中产生相同的随机值。为了在多次调用中获得不同的随机值,请使用 keras.backend.SeedGenerator 的实例作为种子。

[源代码]

LecunNormal

keras.initializers.LecunNormal(seed=None)

Lecun 正态初始化器。

初始化器允许您预先指定初始化策略(编码在初始化器对象中),而无需知道要初始化的变量的形状和数据类型。

从以 0 为中心的截断正态分布中抽取样本,其中 stddev = sqrt(1 / fan_in),其中 fan_in 是权重张量中输入单元的数量。

示例

>>> # Standalone usage:
>>> initializer = LecunNormal()
>>> values = initializer(shape=(2, 2))
>>> # Usage in a Keras layer:
>>> initializer = LecunNormal()
>>> layer = Dense(3, kernel_initializer=initializer)

参数

  • seed: Python 整数或 keras.backend.SeedGenerator 的实例。用于使初始化器的行为确定性。请注意,使用整数或 None(未设置种子)作为种子的初始化器将在多次调用中产生相同的随机值。为了在多次调用中获得不同的随机值,请使用 keras.backend.SeedGenerator 的实例作为种子。

参考文献


[源代码]

LecunUniform

keras.initializers.LecunUniform(seed=None)

Lecun 均匀初始化器。

[-limit, limit] 内的均匀分布中抽取样本,其中 limit = sqrt(3 / fan_in)fan_in 是权重张量中输入单元的数量)。

示例

>>> # Standalone usage:
>>> initializer = LecunUniform()
>>> values = initializer(shape=(2, 2))
>>> # Usage in a Keras layer:
>>> initializer = LecunUniform()
>>> layer = Dense(3, kernel_initializer=initializer)

参数

  • seed: Python 整数或 keras.backend.SeedGenerator 的实例。用于使初始化器的行为确定性。请注意,使用整数或 None(未设置种子)作为种子的初始化器将在多次调用中产生相同的随机值。为了在多次调用中获得不同的随机值,请使用 keras.backend.SeedGenerator 的实例作为种子。

参考文献


[源代码]

Identity

keras.initializers.IdentityInitializer(gain=1.0)

生成单位矩阵的初始化器。

仅可用于生成二维矩阵。

示例

>>> # Standalone usage:
>>> initializer = Identity()
>>> values = initializer(shape=(2, 2))
>>> # Usage in a Keras layer:
>>> initializer = Identity()
>>> layer = Dense(3, kernel_initializer=initializer)

参数

  • gain: 应用于单位矩阵的乘法因子。

创建自定义初始化器

简单的可调用对象

您可以将自定义可调用对象作为初始化器传递。它必须接受 shape(要初始化的变量的形状)和 dtype(生成值的 dtype)作为参数

def my_init(shape, dtype=None):
    return keras.random.normal(shape, dtype=dtype)

layer = Dense(64, kernel_initializer=my_init)

Initializer 子类

如果您需要通过各种参数(例如 RandomNormal 中的 stddev 参数)配置您的初始化器,则应将其实现为 keras.initializers.Initializer 的子类。

初始化器应实现一个具有以下签名的 __call__ 方法

def __call__(self, shape, dtype=None)`:
    # returns a tensor of shape `shape` and dtype `dtype`
    # containing values drawn from a distribution of your choice.

可选地,您还可以实现 get_config 方法和类方法 from_config 以支持序列化——就像任何 Keras 对象一样。

这是一个简单的示例:随机正态初始化器。

class ExampleRandomNormal(keras.initializers.Initializer):

    def __init__(self, mean, stddev):
      self.mean = mean
      self.stddev = stddev

    def __call__(self, shape, dtype=None)`:
      return keras.random.normal(
          shape, mean=self.mean, stddev=self.stddev, dtype=dtype)

    def get_config(self):  # To support serialization
      return {'mean': self.mean, 'stddev': self.stddev}

请注意,在上面的示例中,我们不必实现 from_config,因为类的构造函数参数与 get_config 返回的配置中的键相同。在这种情况下,默认的 from_config 可以正常工作。