(N=15)
| 798 | |
| 799 | |
| 800 | def test_LayerNorm1D(N=15): |
| 801 | from numpy_ml.neural_nets.layers import LayerNorm1D |
| 802 | |
| 803 | N = np.inf if N is None else N |
| 804 | |
| 805 | np.random.seed(12345) |
| 806 | |
| 807 | i = 1 |
| 808 | while i < N + 1: |
| 809 | n_ex = np.random.randint(2, 1000) |
| 810 | n_in = np.random.randint(1, 1000) |
| 811 | X = random_tensor((n_ex, n_in), standardize=True) |
| 812 | |
| 813 | # initialize BatchNorm1D layer |
| 814 | L1 = LayerNorm1D() |
| 815 | |
| 816 | # forward prop |
| 817 | y_pred = L1.forward(X) |
| 818 | |
| 819 | # backprop |
| 820 | dLdy = np.ones_like(y_pred) |
| 821 | dLdX = L1.backward(dLdy) |
| 822 | |
| 823 | # get gold standard gradients |
| 824 | gold_mod = TorchLayerNormLayer(n_in, L1.parameters, "1D", epsilon=L1.epsilon) |
| 825 | golds = gold_mod.extract_grads(X) |
| 826 | |
| 827 | params = [ |
| 828 | (L1.X[0], "X"), |
| 829 | (y_pred, "y"), |
| 830 | (L1.parameters["scaler"].T, "scaler"), |
| 831 | (L1.parameters["intercept"], "intercept"), |
| 832 | (L1.gradients["scaler"], "dLdScaler"), |
| 833 | (L1.gradients["intercept"], "dLdIntercept"), |
| 834 | (dLdX, "dLdX"), |
| 835 | ] |
| 836 | |
| 837 | print("Trial {}".format(i)) |
| 838 | for ix, (mine, label) in enumerate(params): |
| 839 | assert_almost_equal( |
| 840 | mine, golds[label], err_msg=err_fmt(params, golds, ix), decimal=3 |
| 841 | ) |
| 842 | print("\tPASSED {}".format(label)) |
| 843 | i += 1 |
| 844 | |
| 845 | |
| 846 | def test_LayerNorm2D(N=15): |
nothing calls this directly
no test coverage detected