forked from PaddlePaddle/PaddleSeg
-
Notifications
You must be signed in to change notification settings - Fork 1
/
param_init.py
166 lines (123 loc) · 5.04 KB
/
param_init.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
# Copyright (c) 2020 PaddlePaddle Authors. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
import paddle.nn as nn
def constant_init(param, **kwargs):
"""
Initialize the `param` with constants.
Args:
param (Tensor): Tensor that needs to be initialized.
Examples:
from paddleseg.cvlibs import param_init
import paddle.nn as nn
linear = nn.Linear(2, 4)
param_init.constant_init(linear.weight, value=2.0)
print(linear.weight.numpy())
# result is [[2. 2. 2. 2.], [2. 2. 2. 2.]]
"""
initializer = nn.initializer.Constant(**kwargs)
initializer(param, param.block)
def normal_init(param, **kwargs):
"""
Initialize the `param` with a Normal distribution.
Args:
param (Tensor): Tensor that needs to be initialized.
Examples:
from paddleseg.cvlibs import param_init
import paddle.nn as nn
linear = nn.Linear(2, 4)
param_init.normal_init(linear.weight, loc=0.0, scale=1.0)
"""
initializer = nn.initializer.Normal(**kwargs)
initializer(param, param.block)
def kaiming_normal_init(param, **kwargs):
r"""
Initialize the input tensor with Kaiming Normal initialization.
This function implements the `param` initialization from the paper
`Delving Deep into Rectifiers: Surpassing Human-Level Performance on
ImageNet Classification <https://arxiv.org/abs/1502.01852>`
by Kaiming He, Xiangyu Zhang, Shaoqing Ren and Jian Sun. This is a
robust initialization method that particularly considers the rectifier
nonlinearities. In case of Uniform distribution, the range is [-x, x], where
.. math::
x = \sqrt{\\frac{6.0}{fan\_in}}
In case of Normal distribution, the mean is 0 and the standard deviation
is
.. math::
\sqrt{\\frac{2.0}{fan\_in}}
Args:
param (Tensor): Tensor that needs to be initialized.
Examples:
from paddleseg.cvlibs import param_init
import paddle.nn as nn
linear = nn.Linear(2, 4)
# uniform is used to decide whether to use uniform or normal distribution
param_init.kaiming_normal_init(linear.weight)
"""
initializer = nn.initializer.KaimingNormal(**kwargs)
initializer(param, param.block)
def trunc_normal_init(param, **kwargs):
r"""
Initialize the input tensor with The Random TruncatedNormal (Gaussian) distribution initializer.
Args:
param (Tensor): Tensor that needs to be initialized.
Examples:
from paddleseg.cvlibs import param_init
import paddle.nn as nn
linear = nn.Linear(2, 4)
param_init.trunc_normal_init(linear.weight, mean=0.0, std=0.02)
"""
initializer = nn.initializer.TruncatedNormal(**kwargs)
initializer(param, param.block)
def kaiming_uniform(param, **kwargs):
r"""Implements the Kaiming Uniform initializer
This class implements the weight initialization from the paper
`Delving Deep into Rectifiers: Surpassing Human-Level Performance on
ImageNet Classification <https://arxiv.org/abs/1502.01852>`_
by Kaiming He, Xiangyu Zhang, Shaoqing Ren and Jian Sun. This is a
robust initialization method that particularly considers the rectifier
nonlinearities.
In case of Uniform distribution, the range is [-x, x], where
.. math::
x = \sqrt{\\frac{6.0}{fan\_in}}
Args:
param (Tensor): Tensor that needs to be initialized.
Examples:
from paddleseg.cvlibs import param_init
import paddle.nn as nn
linear = nn.Linear(2, 4)
param_init.kaiming_uniform(linear.weight)
"""
initializer = nn.initializer.KaimingUniform(**kwargs)
initializer(param, param.block)
def xavier_uniform(param, **kwargs):
r"""
This implements the Xavier weight initializer from the paper
`Understanding the difficulty of training deep feedforward neural
networks <http://proceedings.mlr.press/v9/glorot10a/glorot10a.pdf>`_
by Xavier Glorot and Yoshua Bengio.
This initializer is designed to keep the scale of the gradients
approximately same in all the layers. In case of Uniform distribution,
the range is [-x, x], where
.. math::
x = \sqrt{\frac{6.0}{fan\_in + fan\_out}}
Args:
param (Tensor): Tensor that needs to be initialized.
Examples:
from paddleseg.cvlibs import param_init
import paddle.nn as nn
linear = nn.Linear(2, 4)
param_init.xavier_uniform(linear.weight)
"""
initializer = nn.initializer.XavierUniform(**kwargs)
initializer(param, param.block)