- 深度学习
- 机器学习
【免费下载链接】chainer
A flexible framework of neural networks for deep learning
导读
权重初始化是深度神经网络训练成败的关键环节之一:合理的初始化可以稳定前向/反向传播的数值尺度、加速收敛,而不当的初始化则可能导致梯度消失或爆炸。Chainer 以chainer.initializers模块为中心,提供了一套统一、可扩展的初始化体系——既包含Normal、Uniform等基础分布初始化器,也包含 LeCun / Glorot(Xavier)/ He 系列等按「扇入扇出(fan_in / fan_out)」缩放的标准初始化器,以及Constant、Identity、Orthogonal和用于图像上/下采样的卷积核滤波器。本文将围绕 docs/source/reference/initializers.rst 这一官方参考文档,结合仓库源码与测试用例,系统讲解初始化的接受形式、基类契约、dtype约定、各具体初始化器的数学定义与参数、generate_array辅助函数,以及它们如何与Link、Parameter深度集成,帮助你写出可复制、可运行且理解底层原理的初始化代码。
一、什么是权重初始化器:设计意图与可接受形式
Chainer 官方文档对权重初始化器(weight initializer)的定义非常明确:初始化器用于初始化数组,它们以「就地(destructively)修改」的方式填充numpy.ndarray或cupy.ndarray的内容。也就是说,初始化器不是一个「返回新数组」的工厂函数,而是一个array -> None的写入动作。典型的用法是把初始化器传给chainer.Link的子类(如Linear、Convolution2D),由 Link 内部用它来填充权重W与偏置b的数组。
根据 docs/source/reference/initializers.rst,一个权重初始化器可以是以下四种对象之一:
chainer.Initializer类实例——即本模块中定义的各类初始化器对象;- Python / NumPy 标量或
numpy.ndarray——此时会被自动包装为Constant初始化器,用该标量或数组直接填充目标数组(数组场景允许广播); - 可调用对象(callable)——任何接受一个 ndarray 参数并向其中写入初始数据的函数或可调用对象,均可作为初始化器使用;
None——表示使用默认初始化器(the default initializer)。除非某个 Link 在文档中另行明确说明,默认初始化器就是chainer.initializers.LeCunNormal,且scale值为 1。
这一「鸭子类型」设计在源码中有直接印证。查看 chainer/initializers/init.py 中的_get_initializer函数:
def _get_initializer(initializer): if initializer is None: return LeCunNormal() if (isinstance(initializer, chainer.get_array_types()) or numpy.isscalar(initializer)): return Constant(initializer) if not callable(initializer): raise TypeError('invalid type of initializer: %s' % type(initializer)) return initializer可见:
- 传
None时,等价于显式构造LeCunNormal()(默认scale=1.0),这正是文档所说的默认初始化器; - 传标量或 ndarray 时,自动转为
Constant初始化器(对应 chainer/initializers/constant.py 中的Constant类); - 传任何可调用对象时,原样使用,这允许你直接用
lambda a: a[...] = 0.5之类的写法,或传入已经构造好的初始化器实例。
同时,_check_is_initializer_like函数会在校验失败时抛出TypeError('Initializer is of wrong type: ... Allowed types are Initializer, ndarray and scalar.'),从而把不合法的初始化器参数挡在门外。
二、基类契约:chainer.Initializer与dtype约定
2.1 基类定义
所有内置初始化器都继承自chainer.Initializer(位于 chainer/initializer.py)。其核心结构非常简洁:
class Initializer(object): def __init__(self, dtype=None): self.dtype = dtype def __call__(self, array): raise NotImplementedError()基类只做两件事:
- 保存可选的
dtype属性,供__call__内部做类型校验; - 声明
__call__(array)抽象接口——派生类必须实现该方法,并就地修改传入的 array,填充算法由具体派生类决定。
chainer.Initializer会通过 chainer/init.py(from chainer.initializer import Initializer)被导出为顶层 APIchainer.Initializer,因此文档中chainer.Initializer与chainer.initializers下的具体类均可直接使用。
2.2 dtype 约定:显式校验与报告错误
文档中有一段容易被忽视但非常关键的约定:如果初始化器对象带有dtype属性,那么初始化器可以假定「将要被填充的数组」具有该 dtype;若使用场景所要求的 dtype 与初始化器的dtype属性不匹配,Chainer 会报告错误。
这一约定体现在两个层面:
- 初始化器自身的断言:例如 chainer/initializers/normal.py 中
Normal.__call__开头是assert array.dtype == self.dtype,Constant、Orthogonal、Uniform、_SamplingFilter等所有实现类都有相同的类型断言,不匹配时直接抛出 AssertionError。 generate_array的主动校验(见下文第四节):在创建数组之前就检查「外部指定 dtype」与「初始化器自带 dtype」是否一致,不一致则抛出ValueError('dtype mismatch: {} != {}')。
因此在使用初始化器时,请保持初始化器构造参数中的dtype与目标数组的 dtype 一致,或者在创建参数时不显式传 dtype(此时参数数组的 dtype 由其他路径决定),以避免触发类型错误。
三、具体初始化器详解
依据 docs/source/reference/initializers.rst 的列表,内置初始化器共分为四类:常量类(Identity/Constant/Zero/One/NaN)、正态类(Normal/LeCunNormal/GlorotNormal/HeNormal)、均匀类(Uniform/LeCunUniform/GlorotUniform/HeUniform)、矩阵与滤波类(Orthogonal/UpsamplingDeconvFilter/DownsamplingConvFilter)。下面逐一给出数学定义、参数与源码依据。
3.1 常量与确定性初始化器
源码位于 chainer/initializers/constant.py。
| 初始化器 | 行为 | 关键参数与默认值 |
|---|---|---|
Identity(scale=1.0, dtype=None) | 用「常量倍的单位矩阵」填充数组,即array = scale * I。要求数组必须是二维方阵,否则抛ValueError('Identity matrix initialization can only be used for 2D squared matrices.')。实现为array[...] = device.xp.identity(shape[0]) * scale | scale:单位矩阵的缩放倍数,默认 1.0 |
Constant(fill_value, dtype=None) | 用指定的标量或 ndarray 填充数组。若fill_value是数组,会调用backend.copyto将其按目标数组的 dtype 复制到目标设备(保证跨 CPU/GPU/ChainerX 设备正确迁移);若为标量则用xp.asarray赋值,允许广播 | fill_value:标量或 ndarray,必填 |
Zero(dtype=None) | 全零填充,等价于Constant(0.0)(内部fill_value = 0.0) | 无 |
One(dtype=None) | 全一填充,内部fill_value = 1.0 | 无 |
NaN(dtype=None) | 全 NaN 填充,内部fill_value = numpy.nan。该初始化器常用于占位:例如Link.add_param在未显式给定初始化器时会默认使用initializers.NaN(dtype),表示参数尚未被真正初始化(见 chainer/link.py 中add_param的实现) | 无 |
值得注意的底层细节:Constant、Zero、One、NaN都继承自私有基类_Constant,后者在构造时会校验fill_value必须是标量或chainer.get_array_types()之一(numpy / cupy / chainerx ndarray),否则抛出ValueError。测试用例 tests/chainer_tests/initializer_tests/test_constant.py 中对TestIdentityInvalid覆盖了(2, 3)、(2, 2, 4)、()、0等非法形状,验证了Identity对非方阵形状的报错行为。
3.2 正态分布初始化器(Normal 系列)
源码位于 chainer/initializers/normal.py。所有正态系列初始化器共享统一的构造签名:scale(缩放系数)、dtype、以及可选的rng(伪随机数生成器,numpy.random.RandomState实例,通过parse_kwargs解析)。rng参数的用处是可复现性:传入固定种子的RandomState后,多次运行可得到完全相同的初始化结果。
(1)Normal(scale=0.05, dtype=None, rng=None)——最基础的初始化器。每个元素从均值为 0、标准差为scale的高斯分布中独立采样:
array[...] ~ N(0, scale²)实现细节(对应源码Normal.__call__):
- 未指定
rng时,通过backend.get_device_from_array(array)获取数组所在设备,再调用device.xp.random.normal(loc=0.0, scale=self.scale, size=array.shape),因此同一份代码在 NumPy(CPU)、CuPy(GPU)与 ChainerX 上自动适配; - 针对 CuPy 有专门的 dtype 处理:当
self.dtype == float32或float16时,会在args['dtype'] = numpy.float32(因为 cuRAND 不支持 float16,注释里明确写着# float16 is not supported in cuRAND); - 指定
rng时,则用self.rng.normal(...)生成后经backend.copyto写入目标数组。
(2)LeCunNormal(scale=1.0, dtype=None, rng=None)——文档指定的默认初始化器。标准差按输入单元数fan_in缩放:
std = scale × sqrt(1 / fan_in)参考论文为 LeCun 98,Efficient Backprop。实现上先调用initializer.get_fans(array.shape)取得(fan_in, fan_out),再以Normal(scale * sqrt(1./fan_in))完成填充。
(3)GlorotNormal(scale=1.0, dtype=None, rng=None)——即常说的Xavier 正态初始化(参考 Glorot & Bengio, AISTATS 2010)。标准差同时考虑输入与输出单元数:
std = scale × sqrt(2 / (fan_in + fan_out))(4)HeNormal(scale=1.0, dtype=None, fan_option='fan_in', rng=None)——即Kaiming He 初始化(参考 He et al., arXiv:1502.01852),专为 ReLU 类激活函数设计:
std = scale × sqrt(2 / fan)其中fan由fan_option决定:
'fan_in'(默认):fan = fan_in,输入单元数;'fan_out':fan = fan_out,输出单元数;- 其他取值会抛出
ValueError("fan_option should be either 'fan_in' or 'fan_out'.")。
3.3 均匀分布初始化器(Uniform 系列)
源码位于 chainer/initializers/uniform.py。与正态系列一一对应,同样支持scale、dtype、rng三个参数。
| 初始化器 | 采样区间 | 说明 |
|---|---|---|
Uniform(scale=0.05) | [-scale, scale] | 基础均匀分布初始化器,实现为device.xp.random.uniform(low=-scale, high=scale, size=array.shape) |
LeCunUniform(scale=1.0) | [-s, s],其中s = scale × sqrt(3 / fan_in) | 与LeCunNormal对应的均匀版本,保证方差一致(均匀分布U(-s, s)方差为s²/3,恰好抵消常数 3) |
GlorotUniform(scale=1.0) | [-s, s],其中s = scale × sqrt(6 / (fan_in + fan_out)) | 即经典的Xavier 均匀初始化(U(-a, a)且a = sqrt(6/(fan_in+fan_out))),PyTorch 等框架中的xavier_uniform_即源于此 |
HeUniform(scale=1.0) | [-s, s],其中s = scale × sqrt(6 / fan_in) | 与HeNormal对应的均匀版本 |
3.4get_fans:fan_in / fan_out 的计算规则
上面所有「缩放型」初始化器都依赖 chainer/initializer.py 中的get_fans(shape)函数,其计算规则值得单独说明:
def get_fans(shape): if not isinstance(shape, tuple): raise ValueError('shape must be tuple. ...') if len(shape) < 2: raise ValueError('shape must be of length >= 2. ...') receptive_field_size = utils.size_of_shape(shape[2:]) fan_in = shape[1] * receptive_field_size fan_out = shape[0] * receptive_field_size return fan_in, fan_out对于卷积核形状(out_channels, in_channels, k1, k2, ...):
fan_in = in_channels × 感受野大小(k1 × k2 × ...);fan_out = out_channels × 感受野大小。
测试用例 tests/chainer_tests/initializer_tests/test_normal.py 中给出了直观的验证数据:形状(2, 3)对应(fan_in, fan_out) = (2, 3),形状(2, 3, 4)对应(12, 8)。此外,该测试还通过Kolmogorov–Smirnov 统计检验(scipy.stats.kstest,采样 100 组、显著性水平0.01/n)验证了Normal系列初始化器在float16 / float32 / float64以及 CPU、GPU、ChainerX 后端上的经验标准差与理论值一致——这从测试层面证明了各初始化器的数学实现是正确的。
3.5Orthogonal:正交初始化
源码位于 chainer/initializers/orthogonal.py,参考论文为 Saxe et al.(arXiv:1312.6120)。其算法流程为:
- 生成与目标数组同形状的标准高斯随机矩阵;
- 对(转置后的)矩阵做QR 分解,并通过
q *= numpy.copysign(self.scale, numpy.diag(r))强制三角矩阵R的对角元非负,从而保证分解(几乎必然)唯一,同时完成scale缩放; - 用得到的(半)正交矩阵
Q填充目标数组。
关键约束与参数:
- 当数组
ndim > 2时,除第一个轴外的所有轴会被展平合并为一个「向量维度」,即把数组视为(行数, 展平维度)的矩阵; - 正交系统包含的向量个数(形状的第一个元素)必须小于等于每个向量的维度(形状的第二个元素),否则无法构成正交系统;
scale默认值为1.1(这是Orthogonal与众不同的默认值,其他缩放型初始化器默认多为 1.0),参考 Saxe 论文的推荐;mode参数(默认'auto')控制对形状的断言,可取值'auto'、'projection'、'embedding'、'basis',分别对应允许「输出大于输入 / 输入大于输出」的约束组合,非法 mode 会抛ValueError;- 0 维数组(标量)场景会退化处理:以等概率返回
scale或-scale;空数组则抛ValueError('Array to be initialized must be non-empty.')。
3.6 图像上/下采样滤波器:UpsamplingDeconvFilter与DownsamplingConvFilter
源码位于 chainer/initializers/sampling.py,原始实现来自 Berkeley FCN(shelhamer/fcn.berkeleyvision.org 的surgery.py),参考论文为 Long et al.(arXiv:1411.4038)。这两个初始化器用于标准图像线性插值权重:
UpsamplingDeconvFilter(interpolation='linear', dtype=None):通常作为chainer.links.DeconvolutionND的初始权重,期望该层stride = (ksize + 1) // 2;DownsamplingConvFilter(interpolation='linear', dtype=None):通常作为chainer.links.ConvolutionND的初始权重,同样期望stride = (ksize + 1) // 2。
底层实现_get_linear_filter(size, ndim, upsampling)构造三角(线性)核:对奇数核大小取中心center = factor - 1,偶数核大小取center = factor - 0.5,然后对每个维度的ogrid累乘(1 - |og_i - center| / factor);上采样核保持三角形(和为 1 但非归一化),下采样核则除以总和做归一化。写入数组时,in_c与out_c必须满足in_c == out_c或out_c == 1,且核大小在各空间维上必须一致(否则抛ValueError('ksize must be all same: ...'))。目前仅支持'linear'插值,其他值一律抛ValueError('Unsupported interpolation method: ...')。
四、generate_array:从初始化器一步生成已初始化数组
除「就地填充已有数组」外,Chainer 还提供了文档中单列的辅助函数chainer.initializers.generate_array(源码见 chainer/initializers/init.py)。它的作用是根据初始化器直接创建并返回一个已初始化的新数组:
def generate_array(initializer, shape, xp, dtype=None, device=None): # 1. 校验 dtype:若外部指定 dtype 与 initializer.dtype 都存在但不一致,抛 ValueError # 2. dtype 缺省时回退到 initializer.dtype,再回退到 chainer.config.dtype # 3. device 缺省时根据 xp 推断后端设备(_guess_device_from_array_module) # 4. 在目标设备上下文中创建 xp.empty(shape, dtype=dtype),然后调用 initializer(array) # 5. 返回已初始化的数组几个值得注意的行为(均有源码可查):
- dtype 解析优先级:显式
dtype参数 >initializer.dtype属性 >chainer.config.dtype(全局配置); - dtype 冲突检测:
numpy.dtype(dtype) != numpy.dtype(dtype_attr)时抛ValueError('dtype mismatch: ...'),这正是文档「若所需 dtype 与初始化器 dtype 属性不匹配则报错」的落地实现; - device 一致性:若同时给定
device与xp且二者不匹配,会抛ValueError('xp and device arguments are inconsistent.'); - 通用性:
xp可以是numpy、cupy或chainerx,返回类型与xp一致,因此可用于任何后端。
generate_array是Parameter初始化的内部引擎:在 chainer/variable.py 的Parameter.__init__(给定 shape 时)与Parameter.initialize(shape)(延迟初始化时)中,均通过initializers.generate_array(self.initializer, shape, xp, device=device)生成数据数组,并用xp.full_like(data, numpy.nan)生成梯度占位数组(未计算梯度前梯度为 NaN)。
五、与 Link / Parameter 的集成:如何在实际模型中选用初始化器
初始化器的最终价值体现在与chainer.Link、chainer.Parameter的配合上。以下用法在仓库中有直接源码佐证。
5.1 通过Link.add_param或init_scope使用
chainer/link.py 中的add_param(name, shape, dtype, initializer)接口接受InitializerSpec(即「初始化器实例 / 数组 / 标量 / 可调用对象 / None」五者之一),并在内部把标量与数组包装为Constant后交给variable.Parameter。其 docstring 明确写道:
- 传入数组时,数据直接用该数组初始化(此时
dtype参数被忽略); - 传入标量时,数据数组被该标量填满(此时使用 float32);
- 未指定初始化器时,默认使用
initializers.NaN(dtype)占位,表示参数「尚未初始化」,待首次使用时再按需填充(防止未初始化参数被误用产生 NaN 传播)。
5.2 标准 Link 的 initialW / initial_bias 参数
所有常见 Layer 都暴露了initialW/initial_bias参数,例如:
- chainer/links/connection/linear.py 中的
Linear(in_size, out_size, nobias=False, initialW=None, initial_bias=None)。文档与源码均说明:initialW=None时权重用「零均值、标准差sqrt(1/in_size)的高斯 i.i.d. 采样」初始化——这实际就是默认初始化器LeCunNormal(scale=1)作用于fan_in = in_size的W形状(out_size, in_size)时的结果;initial_bias=None时偏置初始化为零。两者均经由initializers._get_initializer归一化后传入variable.Parameter。 - chainer/links/connection/convolution_2d.py 中的
Convolution2D(in_channels, out_channels, ksize, stride=1, pad=0, nobias=False, initialW=None, initial_bias=None, *, dilate=1, groups=1)。此处传入initialW的 ndarray 要求ndim == 4,initial_bias的 ndarray 要求ndim == 1。
一个完整的自定义 Layer 示例(来自 chainer/link.py 的 docstring):
import chainer import chainer.functions as F from chainer import initializers import numpy as np class LinearLayer(chainer.Link): def __init__(self, n_in, n_out): super(LinearLayer, self).__init__() with self.init_scope(): self.W = chainer.Parameter( initializers.Normal(), (n_out, n_in)) # 高斯初始化 self.b = chainer.Parameter( initializers.Zero(), (n_out,)) # 偏置全零 def forward(self, x): return F.linear(x, self.W, self.b)而 chainer/links/activation/simplified_dropconnect.py 展示了真实项目中的选择惯例:权重默认HeNormal(1. / numpy.sqrt(2)),偏置默认Constant(0)——印证了「ReLU 类网络配 He 初始化、偏置置零」这一通行实践。
5.3 选用建议(基于初始化器数学性质)
结合上述定义,可以给出以下选择逻辑(均建立在各初始化器的数学定义与参考论文之上,而非性能断言):
- 全零 / 全一 / 常量:用于偏置项(
Zero)、特定结构的常量填充;NaN用于「占位、标记未初始化」; Normal/Uniform(小 scale):早期简单网络的通用选择,方差不随网络规模调整;- LeCun 系列:适用于 Sigmoid / Tanh 等以
fan_in为尺度基准的场景,也是 Chainer 的默认初始化器; - Glorot(Xavier)系列:同时考虑
fan_in与fan_out,适合 Sigmoid / Tanh 激活的对称网络; - He 系列:专为 ReLU / PReLU 设计,通过
fan_option='fan_in'/'fan_out'适配前向或反向传播的方差需求; Orthogonal:适用于 RNN、深度残差结构等对权重正交性敏感的场景(默认scale=1.1);UpsamplingDeconvFilter/DownsamplingConvFilter:用于语义分割等需要固定线性插值上/下采样的网络(如 FCN、DCGAN 的上采样),配合DeconvolutionND/ConvolutionND且stride=(ksize+1)//2使用。
六、可复现性与跨后端注意事项
6.1 用rng保证可复现
Normal、Uniform、Orthogonal及各自的缩放变体都接受rng参数(numpy.random.RandomState)。传入固定种子的rng后,初始化结果完全确定,这对调参、回归测试和论文复现非常重要:
import numpy as np from chainer import initializers rng = np.random.RandomState(0) init = initializers.HeNormal(scale=1.0, rng=rng)测试用例TestNormal.setUp中即通过kwargs['rng'] = self.rng_class()覆盖了这一分支,且指定rng时实现走「先生成再backend.copyto」的路径(chainer/initializers/normal.py),与未指定rng时「直接在目标设备上采样」的路径不同。
6.2 跨后端一致性
初始化代码对 CPU / GPU / ChainerX 是透明的:
- 未指定
rng时,采样在数组所在设备上进行(device.xp.random.normal/uniform),GPU 上 CuPy 会走 cuRAND(float16 除外,见 3.2 节说明); - 指定
rng时,统一走backend.copyto迁移到目标设备; Constant类在填充数组型fill_value时同样使用backend.copyto保证跨设备迁移;generate_array通过chainer.using_device上下文在目标设备上分配并填充数组。
上述行为均由 tests/chainer_tests/initializer_tests/ 下的测试覆盖(test_normal.py、test_uniform.py、test_constant.py、test_orthogonal.py、test_sampling.py、test_init.py),测试矩阵包含{'use_chainerx': True, 'chainerx_device': 'native:0'}、'cuda:0'、'cuda:1'等组合,验证了初始化器在 NumPy、CuPy 与 ChainerX 各后端上行为一致。
6.3 dtype 匹配
回顾第二节的契约:构造初始化器时若指定了dtype,目标数组必须与其一致(否则触发断言或generate_array的ValueError)。推荐做法是:在generate_array/Parameter场景中让 dtype 由参数 shape 与全局配置决定,或确保两者显式一致。
七、快速参考:初始化器一览表
以下汇总表覆盖 docs/source/reference/initializers.rst 列出的全部 16 个初始化器与 1 个辅助函数:
| 类别 | 初始化器 | 默认 scale | 分布 / 行为 | 适用场景 |
|---|---|---|---|---|
| 常量 | Identity | 1.0 | scale × I(要求 2D 方阵) | 特殊结构、循环连接 |
| 常量 | Constant(fill_value) | — | 标量 / 数组填充(允许广播) | 任意固定值 |
| 常量 | Zero | — | 全零 | 偏置项 |
| 常量 | One | — | 全一 | 特定固定结构 |
| 常量 | NaN | — | 全 NaN | 未初始化占位 |
| 正态 | Normal | 0.05 | N(0, scale²) | 通用基础初始化 |
| 正态 | LeCunNormal | 1.0 | std = scale·sqrt(1/fan_in) | Chainer 默认初始化器,Sigmoid/Tanh 类 |
| 正态 | GlorotNormal | 1.0 | std = scale·sqrt(2/(fan_in+fan_out)) | Xavier 正态,对称激活 |
| 正态 | HeNormal | 1.0 | std = scale·sqrt(2/fan),fan_option='fan_in'/'fan_out' | ReLU 类激活 |
| 均匀 | Uniform | 0.05 | U(-scale, scale) | 通用基础初始化 |
| 均匀 | LeCunUniform | 1.0 | s = scale·sqrt(3/fan_in) | 对应 LeCunNormal |
| 均匀 | GlorotUniform | 1.0 | s = scale·sqrt(6/(fan_in+fan_out)) | 经典 Xavier 均匀初始化 |
| 均匀 | HeUniform | 1.0 | s = scale·sqrt(6/fan_in) | 对应 HeNormal |
| 矩阵 | Orthogonal | 1.1 | 高斯矩阵 QR 分解 → 半正交矩阵 | RNN、残差网络 |
| 滤波 | UpsamplingDeconvFilter | — | 线性上采样核(仅 'linear') | DeconvolutionND上采样 |
| 滤波 | DownsamplingConvFilter | — | 归一化线性下采样核(仅 'linear') | ConvolutionND下采样 |
| 辅助 | generate_array(initializer, shape, xp, dtype=None, device=None) | — | 直接创建并返回已初始化数组 | 手动构造参数数组 |
其中「默认初始化器」与「GlorotUniform 对应经典 Xavier 公式」两处均有源码与测试佐证:_get_initializer中None -> LeCunNormal()(chainer/initializers/init.py),以及GlorotUniform的s = scale * sqrt(6/(fan_in+fan_out))(chainer/initializers/uniform.py)。
八、进一步探索指引
- 官方参考页:docs/source/reference/initializers.rst(本文的骨架来源);
- 基类与 fan 计算:chainer/initializer.py(
Initializer、get_fans); - 模块导出与
generate_array、_get_initializer:chainer/initializers/init.py; - 具体实现:chainer/initializers/constant.py、normal.py、uniform.py、orthogonal.py、sampling.py;
- 与 Link / Parameter 的集成:chainer/link.py(
add_param)、chainer/variable.py(Parameter.initialize)、chainer/links/connection/linear.py 与 convolution_2d.py(initialW/initial_bias用法); - 测试与行为验证:tests/chainer_tests/initializer_tests/test_normal.py(含 KS 统计检验)、test_uniform.py、test_constant.py、test_orthogonal.py、test_sampling.py。
掌握以上内容后,你不仅能熟练地在 Chainer 中为任意 Layer 挑选与配置初始化器,还能理解每个初始化器背后的数学动机、fan 计算规则、dtype 契约与跨后端行为,从而在训练不稳定时精准排查初始化相关的问题。
- 深度学习
- 机器学习
【免费下载链接】chainer
A flexible framework of neural networks for deep learning
相关推荐
Cytoscape.js 初始化完全指南:从容器挂载到全部初始化选项详解
Cytoscape.js 初始化完全指南:从容器挂载到全部初始化选项详解 Cytoscape.js 是一个用于图论(网络)可视化与分析的 JavaScript
数据可视化numpy-ml 神经网络初始化器(Initializers)模块全解:从字符串与参数字典一键实例化激活函数、优化器、学习率调度器与权重初始化
numpy ml 神经网络初始化器(Initializers)模块全解:从字符串与参数字典一键实例化激活函数、优化器、学习率调度器与权重初始化 本篇技术指南围绕
机器学习人工智能TensorLayer 权重初始化指南:从 Zeros 到双线性上采样初始化的完整解析
TensorLayer 权重初始化指南:从 Zeros 到双线性上采样初始化的完整解析 导读 本文围绕 TensorLayer 提供的 initializers
人工智能深度学习机器学习强化学习
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考