Merge PR #185 for more py tensor functions. remove Tensor member func to_numpy, and keep global to_numpy
Project: http://git-wip-us.apache.org/repos/asf/incubator-singa/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-singa/commit/cde7dcf6 Tree: http://git-wip-us.apache.org/repos/asf/incubator-singa/tree/cde7dcf6 Diff: http://git-wip-us.apache.org/repos/asf/incubator-singa/diff/cde7dcf6 Branch: refs/heads/dev Commit: cde7dcf6bbee2931ea14cac30edd639dd490c691 Parents: f026b60 d83f5d5 Author: Wei Wang <[email protected]> Authored: Fri Jul 1 16:15:06 2016 +0800 Committer: Wei Wang <[email protected]> Committed: Fri Jul 1 16:22:06 2016 +0800 ---------------------------------------------------------------------- include/singa/core/device.h | 7 +- include/singa/core/tensor.h | 7 + include/singa/model/layer.h | 5 +- src/core/device/device.cc | 2 + src/core/tensor/tensor.cc | 17 +- src/python/swig/core_device.i | 9 +- src/python/swig/core_tensor.i | 167 +- src/python/swig/model_layer.i | 13 +- src/python/swig/numpy.i | 3119 +++++++++++++++++++++++++++++++++++ src/python/tensor.py | 225 ++- test/python/unittest_python.py | 102 +- 11 files changed, 3545 insertions(+), 128 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-singa/blob/cde7dcf6/src/python/tensor.py ---------------------------------------------------------------------- diff --cc src/python/tensor.py index 04e070d,35d6b1f..19af454 --- a/src/python/tensor.py +++ b/src/python/tensor.py @@@ -92,6 -89,29 +89,19 @@@ class Tensor(object) data = np.array(data, dtype=dt).reshape(self.tuple_shape) return data - def to_numpy(self): - ''' this method gets the values of tensor data and - returns it as numpy array - ''' - if self.dtype == kFloat32: - np_array = self.singa_tensor.floatGetValue(int(self.size())) - else: - print 'Not implemented yet for ', self.dtype - return np_array.reshape(self.tuple_shape) - + def copy_from_numpy(self, np_array, offset=0): + ''' this method stores the values of numpy array into tensor data + from the position of offset + ''' + assert np_array.size == self.size(), 'tensor shape should be the same' + if not np_array.ndim == 1: + np_array = np_array.flatten() + dt = np_array.dtype + if dt == np.float32: + self.singa_tensor.floatCopyDataFromHostPtr(np_array, offset) + else: + print 'Not implemented yet for ', dt + def data_type(self): return self.singa_tensor.data_type() @@@ -256,9 -310,19 +300,27 @@@ def reshape(t, s) return _call_singa_func(singa.Reshape, t.singa_tensor, s) - def copy_data_to_from(dst, src, size, src_offset=0, dst_offset=0): + def copy_data_to_from(dst, src, size, dst_offset=0, src_offset=0): singa.CopyDataToFrom(dst.singa_tensor, src.singa_tensor, size, - src_offset, dst_offset) + dst_offset, src_offset) + + + def from_numpy(np_array): + ret = Tensor(np_array.shape) + ret.copy_from_numpy(np_array) + return ret + + + def to_numpy(t): - return t.to_numpy() ++ ''' this method gets the values of tensor data and ++ returns it as numpy array ++ TODO(wangwei) clone t to host ++ ''' ++ if t.dtype == kFloat32: ++ np_array = t.singa_tensor.floatGetValue(int(t.size())) ++ else: ++ print 'Not implemented yet for ', t.dtype ++ return np_array.reshape(t.tuple_shape) def abs(t): http://git-wip-us.apache.org/repos/asf/incubator-singa/blob/cde7dcf6/test/python/unittest_python.py ---------------------------------------------------------------------- diff --cc test/python/unittest_python.py index e1f4b64,320703d..86830a0 --- a/test/python/unittest_python.py +++ b/test/python/unittest_python.py @@@ -36,6 -36,6 +36,7 @@@ sys.path.append(os.path.join(os.path.di '../../build/src')) from core_pb2 import * ++ class TestTensorMethods(unittest.TestCase): def setUp(self): @@@ -57,83 -57,93 +58,98 @@@ def test_unary_operators(self): t = self.t - self.assertAlmostEqual(t.toarray()[0,0], 0.0) - arr = np.array([[1.0,2.0],[2.0,3.0],[3.0,4.0]], dtype=np.float32) ++ arr = np.array([[1.0, 2.0], [2.0, 3.0], [3.0, 4.0]], dtype=np.float32) + t.copy_from_numpy(arr) - self.assertAlmostEqual(t.to_numpy()[0,0], arr[0,0]) - self.assertAlmostEqual(t.to_numpy()[0,1], arr[0,1]) - self.assertAlmostEqual(t.to_numpy()[2,1], arr[2,1]) ++ npary = to_numpy(t) ++ self.assertAlmostEqual(npary[0, 0], arr[0, 0]) ++ self.assertAlmostEqual(npary[0, 1], arr[0, 1]) ++ self.assertAlmostEqual(npary[2, 1], arr[2, 1]) t += 1.23 - self.assertAlmostEqual(t.toarray()[0,0], 1.23) - self.assertAlmostEqual(to_numpy(t)[0,0], 1.0+1.23) ++ npary = to_numpy(t) ++ self.assertAlmostEqual(npary[0, 0], 1.0+1.23) t -= 0.23 - self.assertAlmostEqual(t.toarray()[0,0], 1.23-0.23) - self.assertAlmostEqual(to_numpy(t)[0,0], 2.23-0.23) ++ npary = to_numpy(t) ++ self.assertAlmostEqual(npary[0, 0], 2.23-0.23) t *= 2.5 - self.assertAlmostEqual(t.toarray()[0,0], (1.23-0.23)*2.5) - self.assertAlmostEqual(to_numpy(t)[0,0], (2.23-0.23)*2.5) ++ npary = to_numpy(t) ++ self.assertAlmostEqual(npary[0, 0], (2.23-0.23)*2.5) t /= 2 - self.assertAlmostEqual(t.toarray()[0,0], (1.23-0.23)*2.5/2) - self.assertAlmostEqual(to_numpy(t)[0,0], (2.23-0.23)*2.5/2) ++ npary = to_numpy(t) ++ self.assertAlmostEqual(npary[0, 0], (2.23-0.23)*2.5/2) def test_binary_operators(self): t = self.t - t += 3.2 - arr = np.array([[1.0,2.0],[2.0,3.0],[3.0,4.0]], dtype=np.float32) ++ arr = np.array([[1.0, 2.0], [2.0, 3.0], [3.0, 4.0]], dtype=np.float32) + t.copy_from_numpy(arr) s = self.s - s += 2.1 - arr = np.array([[4.0,3.0],[3.0,2.0],[2.0,1.0]], dtype=np.float32) ++ arr = np.array([[4.0, 3.0], [3.0, 2.0], [2.0, 1.0]], dtype=np.float32) + s.copy_from_numpy(arr) a = t + s - self.assertAlmostEqual(a.toarray()[0,0], 3.2+2.1, 5) - self.assertAlmostEqual(to_numpy(a)[0,0], 1.0+4.0) ++ self.assertAlmostEqual(to_numpy(a)[0, 0], 1.0+4.0) a = t - s - self.assertAlmostEqual(a.toarray()[0,0], 3.2-2.1, 5) - self.assertAlmostEqual(to_numpy(a)[0,0], 1.0-4.0) ++ self.assertAlmostEqual(to_numpy(a)[0, 0], 1.0-4.0) a = t * s - self.assertAlmostEqual(a.toarray()[0,0], 3.2*2.1, 5) - ''' not implemented yet - self.assertAlmostEqual(to_numpy(a)[0,0], 1.0*4.0) ++ self.assertAlmostEqual(to_numpy(a)[0, 0], 1.0*4.0) a = t / s - self.assertAlmostEqual(a.toarray()[0,0], 3.2/2.1, 5) - ''' - self.assertAlmostEqual(to_numpy(a)[0,0], 1.0/4.0) ++ self.assertAlmostEqual(to_numpy(a)[0, 0], 1.0/4.0) def test_comparison_operators(self): t = self.t - t += 3.45 + t.set_value(3.45) a = t < 3.45 - self.assertEqual(a.toarray()[0,0], 0) - self.assertEqual(to_numpy(a)[0,0], 0) ++ self.assertEqual(to_numpy(a)[0, 0], 0) a = t <= 3.45 - self.assertEqual(a.toarray()[0,0], 1) - self.assertEqual(to_numpy(a)[0,0], 1) ++ self.assertEqual(to_numpy(a)[0, 0], 1) a = t > 3.45 - self.assertEqual(a.toarray()[0,0], 0) - self.assertEqual(to_numpy(a)[0,0], 0) ++ self.assertEqual(to_numpy(a)[0, 0], 0) a = t >= 3.45 - self.assertEqual(a.toarray()[0,0], 1) - self.assertEqual(to_numpy(a)[0,0], 1) ++ self.assertEqual(to_numpy(a)[0, 0], 1) a = lt(t, 3.45) - self.assertEqual(a.toarray()[0,0], 0) - self.assertEqual(to_numpy(a)[0,0], 0) ++ self.assertEqual(to_numpy(a)[0, 0], 0) a = le(t, 3.45) - self.assertEqual(a.toarray()[0,0], 1) - self.assertEqual(to_numpy(a)[0,0], 1) ++ self.assertEqual(to_numpy(a)[0, 0], 1) a = gt(t, 3.45) - self.assertEqual(a.toarray()[0,0], 0) - self.assertEqual(to_numpy(a)[0,0], 0) ++ self.assertEqual(to_numpy(a)[0, 0], 0) a = ge(t, 3.45) - self.assertEqual(a.toarray()[0,0], 1) - self.assertEqual(to_numpy(a)[0,0], 1) ++ self.assertEqual(to_numpy(a)[0, 0], 1) + + def test_tensor_manipulation(self): - #TODO(chonho) ++ # TODO(chonho) + pass + def test_random_operations(self): - #TODO(chonho) ++ # TODO(chonho) + pass def test_tensor_copy(self): -- t = Tensor((2,3)) - t += 1.23 - self.assertAlmostEqual(t.toarray()[0,0], 1.23) ++ t = Tensor((2, 3)) + t.set_value(1.23) - self.assertAlmostEqual(to_numpy(t)[0,0], 1.23) ++ self.assertAlmostEqual(to_numpy(t)[0, 0], 1.23) tc = t.copy() tdc = t.deepcopy() - self.assertAlmostEqual(tc.toarray()[0,0], 1.23) - self.assertAlmostEqual(tdc.toarray()[0,0], 1.23) - self.assertAlmostEqual(to_numpy(tc)[0,0], 1.23) - self.assertAlmostEqual(to_numpy(tdc)[0,0], 1.23) ++ self.assertAlmostEqual(to_numpy(tc)[0, 0], 1.23) ++ self.assertAlmostEqual(to_numpy(tdc)[0, 0], 1.23) t += 1.23 - self.assertAlmostEqual(t.toarray()[0,0], 2.46) - self.assertAlmostEqual(tc.toarray()[0,0], 2.46) - self.assertAlmostEqual(tdc.toarray()[0,0], 1.23) - self.assertAlmostEqual(to_numpy(t)[0,0], 2.46) - self.assertAlmostEqual(to_numpy(tc)[0,0], 2.46) - self.assertAlmostEqual(to_numpy(tdc)[0,0], 1.23) ++ self.assertAlmostEqual(to_numpy(t)[0, 0], 2.46) ++ self.assertAlmostEqual(to_numpy(tc)[0, 0], 2.46) ++ self.assertAlmostEqual(to_numpy(tdc)[0, 0], 1.23) def test_copy_data(self): t = self.t - t += 1.23 + t.set_value(1.23) s = self.s - s += 5.43 - self.assertAlmostEqual(t.toarray()[0,0], 1.23) + s.set_value(5.43) - self.assertAlmostEqual(t.to_numpy()[0,0], 1.23) ++ self.assertAlmostEqual(to_numpy(t)[0, 0], 1.23) copy_data_to_from(t, s, 2) - self.assertAlmostEqual(t.toarray()[0,0], 5.43, 5) - self.assertAlmostEqual(t.toarray()[0,1], 5.43, 5) - self.assertAlmostEqual(t.toarray()[0,2], 1.23) - - self.assertAlmostEqual(t.to_numpy()[0,0], 5.43, 5) - self.assertAlmostEqual(t.to_numpy()[0,1], 5.43, 5) - self.assertAlmostEqual(t.to_numpy()[1,0], 1.23, 5) ++ self.assertAlmostEqual(to_numpy(t)[0, 0], 5.43, 5) ++ self.assertAlmostEqual(to_numpy(t)[0, 1], 5.43, 5) ++ self.assertAlmostEqual(to_numpy(t)[1, 0], 1.23, 5) def test_global_method(self): t = self.t - t += 12.34 + t.set_value(12.34) a = log(t) - self.assertAlmostEqual(a.toarray()[0,0], math.log(12.34)) - self.assertAlmostEqual(to_numpy(a)[0,0], math.log(12.34), 5) ++ self.assertAlmostEqual(to_numpy(a)[0, 0], math.log(12.34), 5) if __name__ == '__main__': unittest.main()
