def test_variable_dict(self): xv = np.array([0.5, 0.1, 0.5]) yv = np.array([0.2, 0.4, 0.5]) valin = ['x', 'y'] x = Input(valin, 'x') y = Input(valin, 'y') xyv = [xv, yv] Wxv = np.array([[2.1, 3.1, 2.2], [2.2, 3.2, 4.2], [2.2, 5.2, 4.2]]) Wyv = np.array([[2.1, 2.1, 2.2], [1.6, 1.2, 6.2], [2.1, 3.1, 2.2]]) Wx = MWeight(3, 3, weights=Wxv) Wy = MWeight(3, 3, weights=Wyv) net = ComputationalGraphLayer(Sigmoid(Wx.dot(x)) + Tanh(Wy.dot(y))) netDict = Sequential(VariableDictLayer(valin), net) out = net.forward(xyv) self.assertEqual(out.shape, (3, )) assert_almost_equal(out, sigmoid(Wxv.dot(xv)) + np.tanh(Wyv.dot(yv))) dJdy = net.backward(np.array([1.0, 1.0, 1.0])) self.assertEqual(len(dJdy), 2) for ind, key in enumerate(dJdy): self.assertEqual(dJdy[ind].shape, xyv[ind].shape) assert_almost_equal(dJdy[ind], np.sum(net.numeric_gradient(xyv)[ind], 0)) auxdict = {'x': 0, 'y': 1} out = netDict.forward({'x': xv, 'y': yv}) self.assertEqual(out.shape, (3, )) assert_almost_equal(out, sigmoid(Wxv.dot(xv)) + np.tanh(Wyv.dot(yv))) dJdy = netDict.backward(np.array([1.0, 1.0, 1.0])) self.assertEqual(len(dJdy), 2) for key in dJdy: self.assertEqual(dJdy[key].shape, xyv[auxdict[key]].shape) assert_almost_equal( dJdy[key], np.sum(net.numeric_gradient(xyv)[auxdict[key]], 0))
def test_neuron_one_input(self): xv = np.array([0.5, 0.1, 0.5]) x = Input(['x'], 'x') Wv = np.array([[0.1, 0.1, 0.2], [0.5, 0.2, 0.2]]) W = MWeight(3, 2, weights=Wv) bv = np.array([0.3, 0.1]) b = VWeight(2, weights=bv) net = ComputationalGraphLayer(Sigmoid(W.dot(x) + b)) out = net.forward(xv) self.assertEqual(out.shape, (2, )) check_out = 1.0 / (1.0 + np.exp(-Wv.dot(xv) - bv)) assert_almost_equal(out, check_out) dJdy = net.backward(np.array([1.0, 1.0])) self.assertEqual(dJdy.shape, (3, )) assert_almost_equal(dJdy, np.sum(net.numeric_gradient(xv), 0)) assert_almost_equal(dJdy, (check_out * (1 - check_out)).dot(Wv)) net2 = Sequential( LinearLayer(3, 2, weights=np.hstack([Wv, bv.reshape(2, 1)])), SigmoidLayer) out2 = net2.forward(xv) assert_almost_equal(out, out2) dJdy2 = net.backward(np.array([1.0, 1.0])) assert_almost_equal(dJdy, dJdy2)