def test_predict_weights(X, expected): W = numpy.asarray([1.0, 0.0, 0.0, 1.0], dtype="f").reshape((2, 2)) bias = numpy.asarray([0.0, 0.0], dtype="f") model = Linear(W.shape[0], W.shape[1]) model.set_param("W", W) model.set_param("b", bias) scores = model.predict(X.reshape((1, -1))) assert_allclose(scores.ravel(), expected)
def test_predict_extensive(W_b_input): W, b, input_ = W_b_input nr_out, nr_in = W.shape model = Linear(nr_out, nr_in) model.set_param("W", W) model.set_param("b", b) einsummed = numpy.einsum( "bi,oi->bo", numpy.asarray(input_, dtype="float32"), numpy.asarray(W, dtype="float32"), optimize=False, ) expected_output = einsummed + b predicted_output = model.predict(input_) assert_allclose(predicted_output, expected_output, rtol=1e-04, atol=0.0001)
def test_update(): W = numpy.asarray([1.0, 0.0, 0.0, 1.0], dtype="f").reshape((2, 2)) bias = numpy.asarray([0.0, 0.0], dtype="f") model = Linear(2, 2) model.set_param("W", W) model.set_param("b", bias) sgd = SGD(1.0, L2=0.0, grad_clip=0.0) sgd.averages = None ff = numpy.asarray([[0.0, 0.0]], dtype="f") tf = numpy.asarray([[1.0, 0.0]], dtype="f") ft = numpy.asarray([[0.0, 1.0]], dtype="f") # noqa: F841 tt = numpy.asarray([[1.0, 1.0]], dtype="f") # noqa: F841 # ff, i.e. 0, 0 scores, backprop = model.begin_update(ff) assert_allclose(scores[0, 0], scores[0, 1]) # Tell it the answer was 'f' gradient = numpy.asarray([[-1.0, 0.0]], dtype="f") backprop(gradient) for key, (param, d_param) in model.get_gradients().items(): param, d_param = sgd(key, param, d_param) model.set_param(key[1], param) model.set_grad(key[1], d_param) b = model.get_param("b") W = model.get_param("W") assert b[0] == 1.0 assert b[1] == 0.0 # Unchanged -- input was zeros, so can't get gradient for weights. assert W[0, 0] == 1.0 assert W[0, 1] == 0.0 assert W[1, 0] == 0.0 assert W[1, 1] == 1.0 # tf, i.e. 1, 0 scores, finish_update = model.begin_update(tf) # Tell it the answer was 'T' gradient = numpy.asarray([[0.0, -1.0]], dtype="f") finish_update(gradient) for key, (W, dW) in model.get_gradients().items(): sgd(key, W, dW) b = model.get_param("b") W = model.get_param("W") assert b[0] == 1.0 assert b[1] == 1.0 # Gradient for weights should have been outer(gradient, input) # so outer([0, -1.], [1., 0.]) # = [[0., 0.], [-1., 0.]] assert W[0, 0] == 1.0 - 0.0 assert W[0, 1] == 0.0 - 0.0 assert W[1, 0] == 0.0 - -1.0 assert W[1, 1] == 1.0 - 0.0
def get_model(W_values, b_values): model = Linear(W_values.shape[0], W_values.shape[1], ops=NumpyOps()) model.initialize() model.set_param("W", W_values) model.set_param("b", b_values) return model