Group normalizes the input, cf. https://arxiv.org/abs/1803.08494.
(model, blob_in, blob_out, dim_in,
init_scale=1., init_bias=0.,
ScaleInitializer=None, BiasInitializer=None,
RunningMeanInitializer=None, RunningVarianceInitializer=None,
order="NCHW", **kwargs)
| 154 | |
| 155 | |
| 156 | def spatial_gn(model, blob_in, blob_out, dim_in, |
| 157 | init_scale=1., init_bias=0., |
| 158 | ScaleInitializer=None, BiasInitializer=None, |
| 159 | RunningMeanInitializer=None, RunningVarianceInitializer=None, |
| 160 | order="NCHW", **kwargs): |
| 161 | ''' |
| 162 | Group normalizes the input, cf. https://arxiv.org/abs/1803.08494. |
| 163 | ''' |
| 164 | |
| 165 | blob_out = blob_out or model.net.NextName() |
| 166 | # Input: input, scale, bias |
| 167 | # Output: output, group_mean, group_inv_std |
| 168 | # scale: initialize with init_scale (default 1.) |
| 169 | # [recommendation: set init_scale = 0. in the last layer for each res block] |
| 170 | # bias: initialize with init_bias (default 0.) |
| 171 | |
| 172 | if model.init_params: |
| 173 | scale_init = ("ConstantFill", {'value': init_scale}) |
| 174 | bias_init = ("ConstantFill", {'value': init_bias}) |
| 175 | |
| 176 | ScaleInitializer = initializers.update_initializer( |
| 177 | ScaleInitializer, scale_init, ("ConstantFill", {}) |
| 178 | ) |
| 179 | BiasInitializer = initializers.update_initializer( |
| 180 | BiasInitializer, bias_init, ("ConstantFill", {}) |
| 181 | ) |
| 182 | else: |
| 183 | ScaleInitializer = initializers.ExternalInitializer() |
| 184 | BiasInitializer = initializers.ExternalInitializer() |
| 185 | |
| 186 | scale = model.create_param( |
| 187 | param_name=blob_out + '_s', |
| 188 | shape=[dim_in], |
| 189 | initializer=ScaleInitializer, |
| 190 | tags=ParameterTags.WEIGHT |
| 191 | ) |
| 192 | |
| 193 | bias = model.create_param( |
| 194 | param_name=blob_out + '_b', |
| 195 | shape=[dim_in], |
| 196 | initializer=BiasInitializer, |
| 197 | tags=ParameterTags.BIAS |
| 198 | ) |
| 199 | |
| 200 | blob_outs = [blob_out, |
| 201 | blob_out + "_mean", blob_out + "_std"] |
| 202 | |
| 203 | blob_outputs = model.net.GroupNorm( |
| 204 | [blob_in, scale, bias], |
| 205 | blob_outs, |
| 206 | **kwargs) |
| 207 | # Return the output |
| 208 | return blob_outputs[0] |
| 209 | |
| 210 | |
| 211 | def layer_norm( |
nothing calls this directly
no test coverage detected
searching dependent graphs…