print('========== Part 2.4: Gradient Checking ==========') sample_dims = [3, 5, 3] sample_m = 5 X_s = nn.initialize_weights(sample_dims[0] - 1, sample_m, None, debug=True) y_s = 1 + (np.arange(1, sample_m + 1) % sample_dims[-1]) Theta = [ nn.initialize_weights(sample_dims[i], sample_dims[i + 1], None, debug=True) for i in range(len(sample_dims) - 1) ] theta = np.block([t.reshape(t.size, order='F') for t in Theta]) sample_nn = NeuralNetwork(X_s, y_s, Theta, sample_dims) grads = sample_nn.cost_grad(theta) n_grads = sample_nn.cost_grad_numerical(theta) print('----------------------') print('Analytical | Numerical') print('----------------------') for g, n_g in zip(grads, n_grads): print(' {0: .4f} | {1: .4f}'.format(g, n_g)) diff = np.linalg.norm(n_grads - grads) / np.linalg.norm(n_grads + grads) print('Relative difference: {0}'.format(diff)) print('========== Part 2.4: Regularized Neural Networks ==========') Theta = [data['Theta1'], data['Theta2']] theta = np.block([t.reshape(t.size, order='F') for t in Theta]) nn.update_lambda(3) J = nn.cost(theta) print('Regularized cost: {0:0.6f} (expected: 0.576051)'.format(J))