Keras深度学习框架基础第二讲:层接口(layers API)“层权重初始化器”

80 篇文章 0 订阅
50 篇文章 0 订阅

1、概述

在深度学习和神经网络中,“Layer weight initializers”(层权重初始化器)是用于初始化神经网络层权重的算法或策略。权重是连接神经网络层中神经元的参数,它们需要在训练之前被赋予初始值。这些初始值的选择对网络的训练速度和最终性能有着重要影响。

初始化器定义了Keras层中初始随机权重的设置方式。

用于将初始化器传递给层的关键字参数取决于具体的层。通常,它们仅仅是kernel_initializerbias_initializer

在Keras中,当你创建一个神经网络层(如DenseConv2D等)时,你需要为该层的权重和偏置项设置初始值。这些初始值是通过所谓的“初始化器”来设定的。

  • kernel_initializer:用于设置层中的权重(或称为“核”)的初始值。这些权重决定了层中神经元之间的连接强度。
  • bias_initializer:用于设置层中偏置项的初始值。偏置项是神经元输出中的一个附加项,它允许神经元在没有输入的情况下也有一定的输出。

通过为这些参数指定不同的初始化器,你可以控制网络权重的初始分布,这可能会影响到网络的训练速度和最终性能。例如,keras.initializers.RandomNormal会从一个正态分布中抽取初始权重,而keras.initializers.HeNormal则特别为ReLU激活函数设计的,以保持激活值的方差在传播过程中相对稳定。

from keras import layers
from keras import initializers

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

所有内置初始化器也可以通过它们的字符串标识符来传递:

在Keras中,除了可以直接传递初始化器对象(如keras.initializers.RandomNormal())外,还可以使用这些初始化器的字符串标识符(如'random_normal')来简化代码。当使用字符串标识符时,Keras会根据该标识符自动创建相应的初始化器对象。这提供了一种更为简洁和直观的方式来设置层的权重和偏置项的初始值。

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

2、可用的初始化器

2.1 RandomNormal类

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

随机正态初始化器。

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

这里描述的是一个随机正态初始化器(Random Normal Initializer),它在神经网络中常用于初始化层的权重。当使用这种初始化器时,它会根据指定的正态分布参数(如均值和标准差)来生成随机数值,并将这些数值用作网络层的初始权重。默认情况下,正态分布的均值通常为0,标准差则根据具体的初始化策略或用户定义来设定。这种初始化方法有助于神经网络在训练开始时能够更有效地学习数据的特征。

>>> # 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:定义了生成随机值时的均值。对于正态分布,这通常是中心点的位置。
  • stddev:定义了生成随机值时的标准差。它决定了数据分布的范围和形状。
  • seed:是一个可选参数,用于控制随机数生成器的种子。如果设置了种子,那么每次使用相同的种子初始化时,都会得到相同的随机值序列。这对于确保实验的可重复性很有用。但是,如果你希望每次初始化时都得到不同的随机值,那么可以使用keras.backend.SeedGenerator的实例作为种子,这样每次都会生成新的随机种子。

2.2 RandomUniform类

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

随机均匀初始化器。根据给定的参数从均匀分布中抽取样本。
随机均匀初始化器(Random Uniform Initializer),它常用于神经网络中初始化层的权重。当使用这种初始化器时,它会根据指定的均匀分布参数(如最小值、最大值)来生成随机数值,并将这些数值用作网络层的初始权重。这种初始化方法有助于神经网络在训练开始时能够更有效地学习数据的特征。

>>> # 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, maxval)范围内抽取均匀分布的随机样本。minval是包含在内的最小值,而maxval是不包含在内的最大值。

  • minval:指定了随机值范围的下限,包括这个值。
  • maxval:指定了随机值范围的上限,但不包括这个值。
  • seed:是一个可选参数,用于控制随机数生成器的种子。如果设置了种子,那么每次使用相同的种子初始化时,都会得到相同的随机值序列。这对于确保实验的可重复性很有用。但是,如果你希望每次初始化时都得到不同的随机值,那么可以使用keras.backend.SeedGenerator的实例作为种子,这样每次都会生成新的随机种子。

2.3 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(均值):定义了随机值生成的中心点。对于正态分布,这决定了分布曲线的对称轴位置。
  • stddev(标准差):定义了随机值生成的离散程度。它决定了分布曲线的宽度,标准差越大,分布越宽,随机值越可能远离均值。
  • seed(种子):是一个可选参数,用于控制随机数生成器的行为。如果设置了种子,那么每次使用相同的种子初始化时,都会得到相同的随机值序列。这对于确保实验的可重复性非常有用。然而,如果你希望每次初始化时都得到不同的随机值,可以使用keras.backend.SeedGenerator的实例作为种子,这样每次都会生成新的随机种子。

2.4 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)

2.5 Ones类

keras.initializers.Ones()

一个初始化器,用于生成初始化为1的张量。也可以通过快捷函数ones来使用。

这个初始化器生成的所有张量的元素值都会被设置为1。在神经网络中,虽然不常见直接将所有权重初始化为1,但可能在某些特定场景或层(如偏置项在某些情况下)中有其用途。另外,这个初始化器通常也通过Keras等深度学习库中的ones快捷函数来访问和使用,这使得初始化张量为1变得更加方便。

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

2.6 GlorotNormal类

keras.initializers.GlorotNormal(seed=None)

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

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

Glorot初始化器(也称为Xavier初始化器)是一种权重初始化方法,常用于神经网络的权重初始化。它的设计目的是使输入和输出的方差保持一致,这有助于网络在训练时更好地收敛。

具体来说,它使用截断的正态分布来生成权重,其中分布的均值是0,标准差(stddev)是根据输入和输出单元的数量来计算的。这里的fan_in指的是权重张量中连接到当前层的上一层神经元的数量,fan_out指的是当前层连接到下一层的神经元数量。这种初始化方法使得权重在训练开始时既不会太大也不会太小,有助于避免梯度消失或梯度爆炸的问题。

>>> # Standalone usage:
>>> initializer = GlorotNormal()
>>> values = initializer(shape=(2, 2))
>>> # Standalone usage:
>>> initializer = GlorotNormal()
>>> values = initializer(shape=(2, 2))

2.7 GlorotUniform类

keras.initializers.GlorotUniform(seed=None)

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

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

Glorot均匀初始化器(也称为Xavier均匀初始化器)是一种权重初始化方法,用于神经网络中的权重初始化。这种方法基于权重张量的输入和输出单元数量来计算一个范围,并从该范围内的均匀分布中抽取样本作为权重值。

具体来说,该初始化器首先计算limit值,它是根据权重张量的fan_in(输入单元数量)和fan_out(输出单元数量)计算得出的。然后,它从这个[-limit, limit]的范围内抽取样本作为权重值。

这种初始化方法有助于保持网络在训练过程中输入和输出的方差一致,从而有助于网络更好地收敛。

>>> # 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的实例作为种子。

2.8 HeNormal类

keras.initializers.HeNormal(seed=None)

He正态初始化器。

它从以0为中心、标准差为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的实例作为种子。

2.9 HeUniform类

keras.initializers.HeUniform(seed=None)

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

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

He均匀方差缩放初始化器(也称为He均匀初始化器)是一种权重初始化方法,它基于输入单元的数量(fan_in)来计算一个范围,并从该范围内的均匀分布中抽取样本作为权重值。这种初始化方法通常与ReLU(及其变种)激活函数一起使用,因为ReLU在输入值为正时保持不变,而在输入值为负时输出为0,这可能导致某些神经元在训练过程中“死亡”(即权重不再更新)。He初始化器通过考虑这种激活函数的特性来更好地初始化权重,有助于网络的训练。

在这种方法中,limit是通过对输入单元数量fan_in的倒数乘以6再取平方根来计算的。这个值决定了从均匀分布中抽取样本的范围。然后,从这个[-limit, limit]的范围内抽取样本作为权重值。

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

参数
seed种子

2.10 OrthogonalInitializer类

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

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

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

如果要初始化的张量的形状超过二维,则会初始化一个形状为 (shape[0] * … * shape[n - 2], shape[n - 1]) 的矩阵,其中 n 是形状向量的长度。随后,该矩阵将被重新整形为所需形状的张量。

正交矩阵初始化器确保生成的矩阵中的行(或列,取决于矩阵的维度)是彼此正交的,即它们的点积为零。这在神经网络中特别有用,因为正交权重可以加速训练并改善泛化性能。

在二维情况下,这个初始化器会生成一个正交矩阵,该矩阵通过从正态分布中抽取的随机数字的矩阵的QR分解获得。QR分解是一种将一个矩阵分解为一个正交矩阵Q和一个上三角矩阵R的方法。在这里,我们只使用Q部分,因为它是一个正交矩阵。

如果张量的形状超过二维,初始化器会先生成一个二维矩阵,其形状由除最后一个维度外的所有维度的大小乘积与最后一个维度的大小组成。然后,该二维矩阵会被重新整形为所需的张量形状。通过这种方式,可以确保生成的张量中的某些维度(对应于二维矩阵的行或列)是正交的。

>>> # 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整数,用于设置随机数生成器的种子。在深度学习实验中,为了确保实验的可重复性,通常会设置随机数种子。如果设置了相同的种子,则每次初始化都会得到相同的正交矩阵。这有助于比较不同实验条件下的结果。如果不设置种子(即使用默认的None),则每次初始化都会得到不同的正交矩阵。

2.11 Constant类

keras.initializers.Constant(value=0.0)

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

仅允许使用标量值。提供的常数值必须可以在调用初始化器时转换为所请求的dtype。

这个初始化器用于生成所有元素值都相等的张量,即常量张量。这个常数值可以是任何标量值(即单个数值,而不是向量、矩阵或其他多维数组)。当你使用这个初始化器时,你需要指定一个常数值,并且这个值必须能够转换为你在初始化器中指定的数据类型(dtype)。例如,如果你将数据类型指定为float32,但提供了一个整数值,那么这个整数值将被自动转换为float32类型的浮点数值。

>>> # 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标量值。

2.12 VarianceScaling类

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)

这个初始化器可以根据输入张量的形状来调整其尺度,使得权重初始化的值更加合理。它提供了几种不同的权重初始化方法:

  • distribution设置为"truncated_normal"或"untruncated_normal"时,从正态分布中抽取样本。正态分布通常用于权重初始化,因为它能够产生各种大小的权重值,但避免极端大的值。截断的正态分布会进一步限制样本值的范围,以避免过大的权重值。
  • mode参数决定了如何计算n(即标准化中的分母):"fan_in"使用输入单元的数量,"fan_out"使用输出单元的数量,"fan_avg"使用输入和输出单元数量的平均值。
  • distribution设置为"uniform"时,从均匀分布中抽取样本。均匀分布会生成在指定范围内的等概率样本。这种分布方式可以确保权重的绝对值不会过大。

scale是一个可配置的参数,用于控制权重的总体大小。不同的scale值会导致权重有不同的初始大小范围。

>>> # 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: 缩放因子是一个正浮点数,用于调整权重的大小。它通常与distributionmode一起使用,以确定权重的初始分布范围。

  • mode: 确定n(即标准化中的分母)如何计算。"fan_in"使用输入单元的数量,"fan_out"使用输出单元的数量,"fan_avg"使用输入和输出单元数量的平均值。

  • distribution: 选择用于初始化权重的随机分布。"truncated_normal"表示截断的正态分布,"untruncated_normal"表示未截断的正态分布,"uniform"表示均匀分布。

  • seed: 用于控制初始化器行为的随机种子。如果提供一个整数或None作为种子,则多次调用初始化器时将产生相同的随机值。为了获得不同的随机值,应使用keras.backend.SeedGenerator的实例作为种子。这允许在多个初始化器之间或多次调用同一个初始化器时生成不同的随机序列。

2.13 LecunNormal类

keras.initializers.LecunNormal(seed=None)

LeCun正态初始化器。

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

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

LeCun正态初始化器(也称为He正态初始化器,因为在某些文献中也被称为He初始化)是一种常用的权重初始化方法,特别是在神经网络中。这种方法的基本思想是,初始化权重时,应该考虑权重的输入单元数量(fan_in),以确保权重不会过大或过小,从而影响网络的训练。

具体地说,LeCun正态初始化器从截断的正态分布中抽取权重值,该分布以0为中心,标准差为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

2.14 LecunUniform类

keras.initializers.LecunUniform(seed=None)

LeCun均匀初始化器。

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

LeCun均匀初始化器是一种权重初始化方法,它从均匀分布中抽取权重值。这种方法与LeCun正态初始化器类似,但使用的是均匀分布而不是正态分布。在均匀分布中,所有可能的值在指定的范围内具有相同的概率。

在这里,范围被定义为[-limit, limit],其中limit的值是根据输入单元数量(fan_in)计算得出的,具体为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)

2.15 Identity类

keras.initializers.IdentityInitializer(gain=1.0)

一个生成单位矩阵的初始化器。仅可用于生成二维矩阵。

这是一个特殊的初始化器,用于在神经网络或其他需要矩阵的算法中初始化一个单位矩阵。单位矩阵是一个方阵,其对角线上的元素都是1,其他元素都是0。这样的矩阵有一些特殊的性质,如乘以任何向量或矩阵都不会改变其大小或方向(对于向量)或列空间(对于矩阵)。

由于单位矩阵是二维的(即行数和列数相等),所以这个初始化器仅可用于生成二维矩阵。在其他维度(如1D向量或3D及更高维度的张量)上使用此初始化器将没有意义,因为这些结构无法形成单位矩阵。

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

参数

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

gain 参数是一个乘法因子,用于在初始化单位矩阵时对其进行缩放。通常情况下,单位矩阵的所有对角线元素都是1,其他元素都是0。但是,当给定一个 gain 值时,这个值会乘以单位矩阵的对角线元素,从而得到一个新的矩阵,其中对角线元素的值不再是1,而是 gain

2.16 创建自定义初始化器

简单的可调用对象
程序员可以传递一个自定义的可调用对象作为初始化器。它必须接受两个参数:shape(要初始化的变量的形状)和dtype(生成值的数据类型):

在TensorFlow或类似的深度学习库中,你可以定义自己的初始化器来初始化神经网络的权重和偏置。一种简单的实现方式是传递一个可调用对象(例如函数)作为初始化器。这个可调用对象需要能够处理两个参数:shapedtype

  • shape:这个参数表示需要初始化的变量的形状,通常是一个元组或列表,描述了多维数组的维度。
  • dtype:这个参数表示生成值的数据类型,例如 tf.float32tf.int32

自定义的初始化器函数必须能够根据提供的 shapedtype 返回一个与给定形状相同、数据类型匹配的张量(Tensor),这个张量将用作神经网络中的权重或偏置的初始值。

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

layer = Dense(64, kernel_initializer=my_init)

初始化器子类

如果你需要通过各种参数(例如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.

在Keras框架中,初始化器(Initializer)通常用于设置神经网络中权重和偏置的初始值。如果你想要创建一个具有特定配置选项(如标准差、均值等)的自定义初始化器,你应该通过继承keras.initializers.Initializer类来实现。

当你创建一个自定义的初始化器子类时,你需要实现一个__call__方法。这个方法定义了当调用初始化器实例以生成权重或偏置张量时应该执行的操作。__call__方法通常接受两个参数:shape(表示要初始化的张量的形状)和dtype(表示要生成的值的数据类型)。你的实现应该返回一个与给定shape和dtype匹配的张量,这个张量将用作神经网络中权重或偏置的初始值。

除了__call__方法外,你可能还需要实现get_config方法(尽管这不是必需的,但如果你希望你的初始化器是可序列化的,那么这是必要的)。get_config方法应该返回一个字典,其中包含用于重新创建该初始化器实例的配置参数。

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}

3、总结

在今天的讨论中,我们探讨了神经网络中层权重初始化器(Layer weight initializers)的重要性和实现方法。以下是对该话题的总结:

3.1 权重初始化器的重要性

  • 影响模型训练稳定性:不同的权重初始化策略对神经网络的训练稳定性有着显著的影响。适当的初始化可以使网络在训练初期更快地收敛,减少震荡和梯度消失/爆炸的问题。
  • 影响模型性能:权重初始化不仅影响训练过程,还可能影响模型的最终性能。不同的初始化方法可能会导致模型收敛到不同的局部最优解,进而影响其泛化能力。

3.2 常见的权重初始化器

  • 常数初始化器:将权重初始化为一个常数,如零或某个特定的非零值。但这种方法通常不用于实际网络,因为它可能导致网络对称性和梯度消失问题。
  • 随机初始化器
  • 随机均匀分布初始化:在指定范围内从均匀分布中随机抽取权重值。
  • 随机正态(高斯)分布初始化:从均值为零、方差为指定值的正态分布中抽取权重值。这种方法常用于全连接层。
  • He初始化(也称为Kaiming初始化):针对ReLU等非线性激活函数设计的初始化方法,根据输入神经元的数量自动计算适当的初始化权重值。这有助于减少ReLU函数的零梯度问题,加速模型收敛。
  • Xavier初始化(也称为Glorot初始化):一种基于输入和输出神经元数量来自动计算初始化权重的策略。它旨在保持网络中的激活值和梯度在传播过程中具有适当的尺度。
  • 自定义初始化器:用户可以根据需要实现自定义的初始化器,以满足特定任务或网络结构的要求。

3.3 实现方法

  • 在使用深度学习框架(如TensorFlow、PyTorch等)时,可以直接调用框架提供的初始化器函数或类。
  • 如果需要自定义初始化器,可以通过继承框架提供的初始化器基类(如tf.keras.initializers.Initializer在TensorFlow中),并实现必要的方法(如__call__get_configfrom_config)来完成。

权重初始化器是神经网络训练中的一个重要环节,对模型的稳定性和性能具有重要影响。在选择或实现权重初始化器时,需要考虑网络结构、激活函数、优化算法等多个因素。通过合理的初始化策略,可以显著提高神经网络的训练效果和性能。

  • 15
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

MUKAMO

你的鼓励是我们创作最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值