Compute the layer output on a single minibatch. Parameters ---------- X : :py:class:`ndarray ` of shape `(n_ex, n_in)` Layer input, representing the `n_in`-dimensional features for a minibatch of `n_ex` examples. retain
(self, X, retain_derived=True)
| 1340 | self.parameters["running_var"] = np.ones(self.n_in) |
| 1341 | |
| 1342 | def forward(self, X, retain_derived=True): |
| 1343 | """ |
| 1344 | Compute the layer output on a single minibatch. |
| 1345 | |
| 1346 | Parameters |
| 1347 | ---------- |
| 1348 | X : :py:class:`ndarray <numpy.ndarray>` of shape `(n_ex, n_in)` |
| 1349 | Layer input, representing the `n_in`-dimensional features for a |
| 1350 | minibatch of `n_ex` examples. |
| 1351 | retain_derived : bool |
| 1352 | Whether to use the current intput to adjust the running mean and |
| 1353 | running_var computations. Setting this to True is the same as |
| 1354 | freezing the layer for the current input. Default is True. |
| 1355 | |
| 1356 | Returns |
| 1357 | ------- |
| 1358 | Y : :py:class:`ndarray <numpy.ndarray>` of shape `(n_ex, n_in)` |
| 1359 | Layer output for each of the `n_ex` examples |
| 1360 | """ |
| 1361 | if not self.is_initialized: |
| 1362 | self.n_in = self.n_out = X.shape[1] |
| 1363 | self._init_params() |
| 1364 | |
| 1365 | ep = self.hyperparameters["epsilon"] |
| 1366 | mm = self.hyperparameters["momentum"] |
| 1367 | rm = self.parameters["running_mean"] |
| 1368 | rv = self.parameters["running_var"] |
| 1369 | |
| 1370 | scaler = self.parameters["scaler"] |
| 1371 | intercept = self.parameters["intercept"] |
| 1372 | |
| 1373 | # if the layer is frozen, use our running mean/std values rather |
| 1374 | # than the mean/std values for the new batch |
| 1375 | X_mean = self.parameters["running_mean"] |
| 1376 | X_var = self.parameters["running_var"] |
| 1377 | |
| 1378 | if self.trainable and retain_derived: |
| 1379 | X_mean, X_var = X.mean(axis=0), X.var(axis=0) # , ddof=1) |
| 1380 | self.parameters["running_mean"] = mm * rm + (1.0 - mm) * X_mean |
| 1381 | self.parameters["running_var"] = mm * rv + (1.0 - mm) * X_var |
| 1382 | |
| 1383 | if retain_derived: |
| 1384 | self.X.append(X) |
| 1385 | |
| 1386 | N = (X - X_mean) / np.sqrt(X_var + ep) |
| 1387 | y = scaler * N + intercept |
| 1388 | return y |
| 1389 | |
| 1390 | def backward(self, dLdy, retain_grads=True): |
| 1391 | """ |