blob: 3c2b115e1422d0a6a31c7c41b72564c81238bb06 [file] [log] [blame]
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
# =============================================================================
import unittest
from singa import singa_wrap
class TestPythonOperation(unittest.TestCase):
def test_conv2d(self):
print("TEST CONV2D FORWARD")
x_shape = [2, 1, 3, 3]
x = singa_wrap.Tensor(x_shape)
x.CopyFloatDataFromHostPtr(
[1, 2, 3, 4, 5, 6, 7, 8, 9, 1, 2, 3, 4, 5, 6, 7, 8, 9])
W_shape = [1, 1, 3, 3]
W = singa_wrap.Tensor(W_shape)
W.CopyFloatDataFromHostPtr([1, 1, 0, 0, 0, -1, 0, 1, 0])
b_shape = [1]
b = singa_wrap.Tensor(b_shape)
b.CopyFloatDataFromHostPtr([1])
dy_shape = [2, 1, 2, 2]
dy = singa_wrap.Tensor(dy_shape)
dy.CopyFloatDataFromHostPtr([0.1, 0.2, 0.3, 0.4, 0.1, 0.2, 0.3, 0.4])
handle = singa_wrap.ConvHandle(x, (3, 3), (2, 2), (1, 1), 1, 1, True)
y = singa_wrap.CpuConvForward(x, W, b, handle)
self.assertListEqual([2, 1, 2, 2], list(y.shape()))
_y = y.GetFloatValue(int(y.Size()))
self.assertAlmostEqual(3.0, _y[0])
self.assertAlmostEqual(7.0, _y[1])
self.assertAlmostEqual(-3.0, _y[2])
self.assertAlmostEqual(12.0, _y[3])
self.assertAlmostEqual(3.0, _y[4])
self.assertAlmostEqual(7.0, _y[5])
self.assertAlmostEqual(-3.0, _y[6])
self.assertAlmostEqual(12.0, _y[7])
print("TEST CONV2D DATA BACKWARD")
dx = singa_wrap.CpuConvBackwardx(dy, W, x, handle)
self.assertListEqual([2, 1, 3, 3], list(dx.shape()))
_dx = dx.GetFloatValue(int(dx.Size()))
self.assertAlmostEqual(0.0, _dx[0])
self.assertAlmostEqual(-0.1, _dx[1])
self.assertAlmostEqual(0.0, _dx[2])
self.assertAlmostEqual(0.4, _dx[3])
self.assertAlmostEqual(0.4, _dx[4])
self.assertAlmostEqual(0.6, _dx[5])
self.assertAlmostEqual(0.0, _dx[6])
self.assertAlmostEqual(-0.3, _dx[7])
print("TEST CONV2D WEIGHT BACKWARD")
dW = singa_wrap.CpuConvBackwardW(dy, x, W, handle)
self.assertListEqual([1, 1, 3, 3], list(dW.shape()))
_dW = dW.GetFloatValue(int(dW.Size()))
self.assertAlmostEqual(4.0, _dW[0], places=5)
self.assertAlmostEqual(7.2, _dW[1], places=5)
self.assertAlmostEqual(3.0, _dW[2], places=5)
self.assertAlmostEqual(7.2, _dW[3], places=5)
self.assertAlmostEqual(12.8, _dW[4], places=5)
self.assertAlmostEqual(5.2, _dW[5], places=5)
self.assertAlmostEqual(2.0, _dW[6], places=5)
self.assertAlmostEqual(3.2, _dW[7], places=5)
self.assertAlmostEqual(1.0, _dW[8], places=5)
print("TEST CONV2D DATA BACKWARD")
db = singa_wrap.CpuConvBackwardb(dy, b, handle)
self.assertEqual(1, dW.shape()[0])
_db = db.GetFloatValue(int(db.Size()))
print(_db)
self.assertAlmostEqual(2.0, _db[0], places=5)
def test_pooling(self):
x_shape = [2, 1, 3, 3]
x = singa_wrap.Tensor(x_shape)
x.CopyFloatDataFromHostPtr(
[1, 2, 3, 4, 5, 6, 7, 8, 9, 1, 2, 3, 4, 5, 6, 7, 8, 9])
y_shape = [2, 1, 2, 2]
dy = singa_wrap.Tensor(y_shape)
dy.CopyFloatDataFromHostPtr([0.1, 0.2, 0.3, 0.4, 0.1, 0.2, 0.3, 0.4])
k_dim = [2, 2]
s_dim = [1, 1]
p_dim = [0, 0]
# max pooling
handle = singa_wrap.PoolingHandle(x, k_dim, s_dim, p_dim, True)
y = singa_wrap.CpuPoolingForward(handle, x)
self.assertListEqual([2, 1, 2, 2], list(y.shape()))
dx = singa_wrap.CpuPoolingBackward(handle, dy, x, y)
self.assertListEqual([2, 1, 3, 3], list(dx.shape()))
# avg pooling
handle = singa_wrap.PoolingHandle(x, k_dim, s_dim, p_dim, False)
y = singa_wrap.CpuPoolingForward(handle, x)
self.assertListEqual([2, 1, 2, 2], list(y.shape()))
dx = singa_wrap.CpuPoolingBackward(handle, dy, x, y)
self.assertListEqual([2, 1, 3, 3], list(dx.shape()))
def test_batch_norm(self):
x_shape = [2, 2]
x = singa_wrap.Tensor(x_shape)
x.CopyFloatDataFromHostPtr([1, 2, 3, 4])
dy_shape = [2, 2]
dy = singa_wrap.Tensor(dy_shape)
dy.CopyFloatDataFromHostPtr([4, 3, 2, 1])
scale_shape = [2]
scale = singa_wrap.Tensor(scale_shape)
scale.CopyFloatDataFromHostPtr([1, 1])
bias_shape = [2]
bias = singa_wrap.Tensor(bias_shape)
bias.CopyFloatDataFromHostPtr([0, 0])
mean_shape = [2]
mean = singa_wrap.Tensor(mean_shape)
mean.CopyFloatDataFromHostPtr([1, 2])
var = singa_wrap.Tensor(mean_shape)
var.CopyFloatDataFromHostPtr([1, 2])
handle = singa_wrap.BatchNormHandle(0.9, x)
# 2D Forward Inference
y = singa_wrap.CpuBatchNormForwardInference(handle, x, scale, bias,
mean, var)
self.assertListEqual([2, 2], list(y.shape()))
# 2D Forward Training
(y, mean_updated, var_updated) = singa_wrap.CpuBatchNormForwardTraining(
handle, x, scale, bias, mean, var)
self.assertListEqual([2, 2], list(y.shape()))
self.assertListEqual([2], list(mean_updated.shape()))
self.assertListEqual([2], list(var_updated.shape()))
# 2D Backward dx
(dx, dscale, dbias) = singa_wrap.CpuBatchNormBackwardx(handle, y, dy, x,
scale, bias,
mean_updated,
var_updated)
self.assertListEqual([2, 2], list(dx.shape()))
self.assertListEqual([2], list(dscale.shape()))
self.assertListEqual([2], list(dbias.shape()))
# 4D Forward Inference
x2_shape = [1, 2, 4, 4]
x2 = singa_wrap.Tensor(x2_shape)
x2.CopyFloatDataFromHostPtr(
[0.0736655, 0.0459045, 0.0779517, 0.0771059, 0.0586862, 0.0561263,
0.0708457, 0.0977273, 0.0405025, -0.170897, 0.0208982, 0.136865,
-0.0367905, -0.0618205, -0.0103908, -0.0522777, -0.122161,
-0.025427, -0.0718576, -0.185941, 0.0166533, 0.178679, -0.0576606,
-0.137817, 0.150676, 0.153442, -0.0929899, -0.148675, -0.112459,
-0.106284, -0.103074, -0.0668811])
handle = singa_wrap.BatchNormHandle(0.9, x)
y2 = singa_wrap.CpuBatchNormForwardInference(handle, x2, scale, bias,
mean, var)
self.assertListEqual([1, 2, 4, 4], list(y2.shape()))
if __name__ == '__main__':
unittest.main()