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 模块的一部分可用:

[source]

RandomNormal class

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

随机正态初始化器.

从给定参数的正态分布中抽取样本.

示例:

>>> # 独立使用:
>>> initializer = RandomNormal(mean=0.0, stddev=1.0)
>>> values = initializer(shape=(2, 2))
>>> # 在Keras层中使用:
>>> 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的实例作为种子.


[source]

RandomUniform class

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

随机均匀初始化器.

从给定参数的均匀分布中抽取样本.

示例:

>>> # 独立使用:
>>> initializer = RandomUniform(minval=0.0, maxval=1.0)
>>> values = initializer(shape=(2, 2))
>>> # 在Keras层中使用:
>>> 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的实例作为种子.


[source]

TruncatedNormal class

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

初始化器生成一个截断正态分布.

生成的值类似于从RandomNormal初始化器生成的值,除了那些超过均值两个标准差的值被丢弃并重新绘制.

示例:

>>> # 独立使用:
>>> initializer = TruncatedNormal(mean=0., stddev=1.)
>>> values = initializer(shape=(2, 2))
>>> # 在Keras层中使用:
>>> 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的实例作为种子.


[source]

Zeros class

keras.initializers.Zeros()

初始化器,生成初始化为0的张量.

示例:

>>> # 独立使用:
>>> 初始化器 = Zeros()
>>>  = 初始化器(形状=(2, 2))
>>> # 在Keras层中使用:
>>> 初始化器 = Zeros()
>>>  = Dense(单位=3, kernel_initializer=初始化器)

[source]

Ones class

keras.initializers.Ones()

初始化器,生成初始化为1的张量.

也可以通过快捷函数 ones 使用.

示例:

>>> # 独立使用:
>>> initializer = Ones()
>>> values = initializer(shape=(2, 2))
>>> # 在Keras层中使用:
>>> initializer = Ones()
>>> layer = Dense(3, kernel_initializer=initializer)

[source]

GlorotNormal class

keras.initializers.GlorotNormal(seed=None)

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

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

示例:

>>> # 独立使用:
>>> initializer = GlorotNormal()
>>> values = initializer(shape=(2, 2))
>>> # 在 Keras 层中使用:
>>> initializer = GlorotNormal()
>>> layer = Dense(3, kernel_initializer=initializer)

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

参考文献:


[source]

GlorotUniform class

keras.initializers.GlorotUniform(seed=None)

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

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

示例:

# 独立使用:
initializer = GlorotUniform()
values = initializer(shape=(2, 2))

# 在Keras层中使用:
initializer = GlorotUniform()
layer = Dense(3, kernel_initializer=initializer)

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

参考:


[source]

HeNormal class

keras.initializers.HeNormal(seed=None)

He 正态初始化器.

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

示例:

# 独立使用:
initializer = HeNormal()
values = initializer(shape=(2, 2))

# 在 Keras 层中使用:
initializer = HeNormal()
layer = Dense(3, kernel_initializer=initializer)

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

参考:


[source]

HeUniform class

keras.initializers.HeUniform(seed=None)

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

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

示例:

>>> # 独立使用:
>>> initializer = HeUniform()
>>> values = initializer(shape=(2, 2))
>>> # 在 Keras 层中使用:
>>> initializer = HeUniform()
>>> layer = Dense(3, kernel_initializer=initializer)

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

参考:


[source]

OrthogonalInitializer class

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

初始化器,生成一个正交矩阵.

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

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

示例:

>>> # 独立使用:
>>> initializer = keras.initializers.Orthogonal()
>>> values = initializer(shape=(2, 2))
>>> # 在Keras层中使用:
>>> initializer = keras.initializers.Orthogonal()
>>> layer = keras.layers.Dense(3, kernel_initializer=initializer)

参数: gain: 应用于正交矩阵的乘法因子. seed: 一个Python整数.用于使初始化器的行为具有确定性.

参考:


[source]

Constant class

keras.initializers.Constant(value=0.0)

初始化器,生成具有常量值的张量.

仅允许标量值. 提供的常量值在调用初始化器时必须能够转换为请求的dtype.

示例:

>>> # 独立使用:
>>> initializer = Constant(10.)
>>> values = initializer(shape=(2, 2))
>>> # 在Keras层中使用:
>>> initializer = Constant(10.)
>>> layer = Dense(3, kernel_initializer=initializer)

参数: value: 一个Python标量.


[source]

VarianceScaling class

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

初始化器,根据输入张量的形状调整其尺度.

distribution="truncated_normal" 或 "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).

示例:

>>> # 独立使用:
>>> initializer = VarianceScaling(
    scale=0.1, mode='fan_in', distribution='uniform')
>>> values = initializer(shape=(2, 2))
>>> # 在 Keras 层中使用:
>>> 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 的实例作为种子.


[source]

LecunNormal class

keras.initializers.LecunNormal(seed=None)

Lecun 正态初始化器.

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

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

示例:

# 独立使用:
initializer = LecunNormal()
values = initializer(shape=(2, 2))

# 在 Keras 层中使用:
initializer = LecunNormal()
layer = Dense(3, kernel_initializer=initializer)

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

参考:


[source]

LecunUniform class

keras.initializers.LecunUniform(seed=None)

Lecun均匀初始化器.

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

示例:

# 独立使用:
initializer = LecunUniform()
values = initializer(shape=(2, 2))

# 在Keras层中使用:
initializer = LecunUniform()
layer = Dense(3, kernel_initializer=initializer)

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

参考:


[source]

Identity class

keras.initializers.IdentityInitializer(gain=1.0)

初始化器生成单位矩阵.

仅适用于生成二维矩阵.

示例:

>>> # 独立使用:
>>> initializer = Identity()
>>> values = initializer(shape=(2, 2))
>>> # 在Keras层中使用:
>>> 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):
    # 返回形状为 `shape` 和 dtype 为 `dtype` 的张量
    # 其中包含从你选择的分布中抽取的值。

可选地,你还可以实现 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):  # 支持序列化
      return {'mean': self.mean, 'stddev': self.stddev}

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