def test_arg_scope_single(self): X = np.random.rand(64, 3, 32, 32).astype(np.float32) - 0.5 workspace.FeedBlob("x", X) model = ModelHelper(name="test_model") with brew.arg_scope(brew.conv, stride=2, pad=2, weight_init=('XavierFill', {}), bias_init=('ConstantFill', {})): brew.conv( model=model, blob_in="x", blob_out="out", dim_in=3, dim_out=64, kernel=3, ) model.Validate() workspace.RunNetOnce(model.param_init_net) workspace.RunNetOnce(model.net) out = workspace.FetchBlob("out") self.assertEqual(out.shape, (64, 64, 17, 17))
class BrewTest(unittest.TestCase): def setUp(self): def myhelper(model, val=-1): return val if not brew.has_helper(myhelper): brew.Register(myhelper) self.myhelper = myhelper def myhelper2(model, val=-1): return val if not brew.has_helper(myhelper2): brew.Register(myhelper2) self.myhelper2 = myhelper2 self.model = ModelHelper(name="test_model") def test_dropout(self): p = 0.2 X = np.ones((100, 100)).astype(np.float32) - p workspace.FeedBlob("x", X) model = ModelHelper(name="test_model") brew.dropout(model, "x", "out") workspace.RunNetOnce(model.param_init_net) workspace.RunNetOnce(model.net) out = workspace.FetchBlob("out") self.assertLess(abs(out.mean() - (1 - p)), 0.05) def test_fc(self): m, n, k = (15, 15, 15) X = np.random.rand(m, k).astype(np.float32) - 0.5 workspace.FeedBlob("x", X) model = ModelHelper(name="test_model") brew.fc(model, "x", "out_1", k, n) model.Validate() workspace.RunNetOnce(model.param_init_net) workspace.RunNetOnce(model.net) def test_relu(self): Xpos = np.ones((5, 5)).astype(np.float32) - 0.5 Xneg = np.ones((5, 5)).astype(np.float32) - 1.5 workspace.FeedBlob("xpos", Xpos) workspace.FeedBlob("xneg", Xneg) model = ModelHelper(name="test_model") brew.relu(model, "xpos", "out_xpos") brew.relu(model, "xneg", "out_xneg") model.Validate() workspace.RunNetOnce(model.param_init_net) workspace.RunNetOnce(model.net) pos = workspace.FetchBlob("out_xpos") self.assertAlmostEqual(pos.mean(), 0.5) neg = workspace.FetchBlob("out_xneg") self.assertAlmostEqual(neg.mean(), 0) def test_tanh(self): X = np.ones((5, 5)).astype(np.float32) - 0.5 workspace.FeedBlob("x", X) model = ModelHelper(name="test_model") brew.tanh(model, "x", "out_tanh") model.Validate() workspace.RunNetOnce(model.param_init_net) workspace.RunNetOnce(model.net) out = workspace.FetchBlob("out_tanh") self.assertAlmostEqual(out.mean(), 0.46211711) def test_validate(self): model = ModelHelper(name="test_model") model.params.append("aaa") model.params.append("bbb") self.assertEqual(model._Validate(), []) model.params.append("xxx") model.params.append("bbb") self.assertEqual(model._Validate(), ["bbb"]) def test_arg_scope(self): myhelper = self.myhelper myhelper2 = self.myhelper2 n = 15 with brew.arg_scope([myhelper], val=n): res = brew.myhelper(self.model) self.assertEqual(n, res) with brew.arg_scope([myhelper, myhelper2], val=n): res1 = brew.myhelper(self.model) res2 = brew.myhelper2(self.model) self.assertEqual([n, n], [res1, res2]) def test_arg_scope_single(self): X = np.random.rand(64, 3, 32, 32).astype(np.float32) - 0.5 workspace.FeedBlob("x", X) model = ModelHelper(name="test_model") with brew.arg_scope(brew.conv, stride=2, pad=2, weight_init=('XavierFill', {}), bias_init=('ConstantFill', {})): brew.conv( model=model, blob_in="x", blob_out="out", dim_in=3, dim_out=64, kernel=3, ) model.Validate() workspace.RunNetOnce(model.param_init_net) workspace.RunNetOnce(model.net) out = workspace.FetchBlob("out") self.assertEqual(out.shape, (64, 64, 17, 17)) def test_arg_scope_nested(self): myhelper = self.myhelper n = 16 with brew.arg_scope([myhelper], val=-3), \ brew.arg_scope([myhelper], val=-2): with brew.arg_scope([myhelper], val=n): res = brew.myhelper(self.model) self.assertEqual(n, res) res = brew.myhelper(self.model) self.assertEqual(res, -2) res = brew.myhelper(self.model, val=15) self.model.Validate() self.assertEqual(res, 15) def test_double_register(self): myhelper = self.myhelper with self.assertRaises(AttributeError): brew.Register(myhelper) def test_has_helper(self): self.assertTrue(brew.has_helper(brew.conv)) self.assertTrue(brew.has_helper("conv")) def myhelper3(): pass self.assertFalse(brew.has_helper(myhelper3)) def test_model_helper(self): X = np.random.rand(64, 32, 32, 3).astype(np.float32) - 0.5 workspace.FeedBlob("x", X) my_arg_scope = {'order': 'NHWC'} model = ModelHelper(name="test_model", arg_scope=my_arg_scope) with brew.arg_scope(brew.conv, stride=2, pad=2, weight_init=('XavierFill', {}), bias_init=('ConstantFill', {})): brew.conv( model=model, blob_in="x", blob_out="out", dim_in=3, dim_out=64, kernel=3, ) model.Validate() workspace.RunNetOnce(model.param_init_net) workspace.RunNetOnce(model.net) out = workspace.FetchBlob("out") self.assertEqual(out.shape, (64, 17, 17, 64)) def test_cnn_model_helper_deprecated(self): X = np.random.rand(64, 32, 32, 3).astype(np.float32) - 0.5 workspace.FeedBlob("x", X) # CNNModelHelper is going to be deprecated soon. This test is only # covering some CNNModelHelper logic model = CNNModelHelper(name="test_model", order='NHWC') self.assertEqual(model.arg_scope['order'], 'NHWC') def test_get_params(self): def param(x): return core.ScopedBlobReference(x) def to_str_list(x): return sorted([str(p) for p in x]) model = ModelHelper(name="test_model") model.AddParameter(param("a")) model.AddParameter(param("b"), tags=ParameterTags.COMPUTED_PARAM) with scope.NameScope("c"): model.AddParameter(param("a")) model.AddParameter(param("d"), tags=ParameterTags.COMPUTED_PARAM) self.assertEqual(to_str_list(model.GetParams()), ['c/a']) self.assertEqual(to_str_list(model.GetComputedParams()), ['c/d']) self.assertEqual(to_str_list(model.GetAllParams()), ['c/a', 'c/d']) # Get AllParams from the global Scope self.assertEqual(to_str_list(model.GetAllParams('')), ['a', 'b', 'c/a', 'c/d']) self.assertEqual(to_str_list(model.GetParams()), ['a', 'c/a']) self.assertEqual(to_str_list(model.GetComputedParams()), ['b', 'c/d']) self.assertEqual(to_str_list(model.GetAllParams()), ['a', 'b', 'c/a', 'c/d']) self.assertEqual(to_str_list(model.GetAllParams('')), ['a', 'b', 'c/a', 'c/d']) # Get AllParams from the scope 'c' self.assertEqual(to_str_list(model.GetAllParams('c')), ['c/a', 'c/d']) self.assertEqual(to_str_list(model.GetAllParams('c/')), ['c/a', 'c/d']) def test_param_consistence(self): model = ModelHelper(name='test_mode') cnv = brew.conv(model, 'data', 'cnv', 32, 32, 4) step_model = ModelHelper(name='step_model', param_model=model) a = brew.fc(step_model, cnv, 'a', 100, 200) brew.fc(model, a, 'b', 200, 5) # test the _parameters_info is shared between model and step_model self.assertEqual(model._parameters_info, step_model._parameters_info)
from caffe2.python.cnn import CNNModelHelper import unittest import numpy as np m, k, n = (1, 28 * 28, 10) # [m][k] * [k][n] = [m][n] x = np.random.rand(m, k).astype(np.float32) - 0.5 # x = m*k 2D tensor workspace.ResetWorkspace() # clear workspace workspace.FeedBlob("x", x) # feed x as a blob model = ModelHelper(name="test_model") # create model model.Proto() # print model's protocol buffer before add operator brew.fc( model, "x", "y", k, n ) # fully connected NN, weight = k*n 2D tensor /// bias, y = m*n 2D tensor brew.softmax(model, "y", "z") model.Validate() model.Proto() # print model's protocol buffer after add operator workspace.RunNetOnce( model.param_init_net) # init [y_w(weight), y_b(bias) (randomize)] # weight is 2D array, bias is 1D array workspace.Blobs() # print workspace's blobs # workspace.FetchBlob("y_w") # workspace.FetchBlob("y_b") workspace.RunNetOnce(model.net) # y = workspace.FetchBlob("y") # z = workspace.FetchBlob("z")
class BrewTest(unittest.TestCase): def setUp(self): def myhelper(model, val=-1): return val if not brew.has_helper(myhelper): brew.Register(myhelper) self.myhelper = myhelper def myhelper2(model, val=-1): return val if not brew.has_helper(myhelper2): brew.Register(myhelper2) self.myhelper2 = myhelper2 self.model = ModelHelper(name="test_model") def test_dropout(self): p = 0.2 X = np.ones((100, 100)).astype(np.float32) - p workspace.FeedBlob("x", X) model = ModelHelper(name="test_model") brew.dropout(model, "x", "out") workspace.RunNetOnce(model.param_init_net) workspace.RunNetOnce(model.net) out = workspace.FetchBlob("out") self.assertLess(abs(out.mean() - (1 - p)), 0.05) def test_fc(self): m, n, k = (15, 15, 15) X = np.random.rand(m, k).astype(np.float32) - 0.5 workspace.FeedBlob("x", X) model = ModelHelper(name="test_model") brew.fc(model, "x", "out_1", k, n) model.Validate() workspace.RunNetOnce(model.param_init_net) workspace.RunNetOnce(model.net) def test_validate(self): model = ModelHelper(name="test_model") model.params.append("aaa") model.params.append("bbb") self.assertEqual(model._Validate(), []) model.params.append("xxx") model.params.append("bbb") self.assertEqual(model._Validate(), ["bbb"]) def test_arg_scope(self): myhelper = self.myhelper myhelper2 = self.myhelper2 n = 15 with brew.arg_scope([myhelper], val=n): res = brew.myhelper(self.model) self.assertEqual(n, res) with brew.arg_scope([myhelper, myhelper2], val=n): res1 = brew.myhelper(self.model) res2 = brew.myhelper2(self.model) self.assertEqual([n, n], [res1, res2]) def test_arg_scope_single(self): X = np.random.rand(64, 3, 32, 32).astype(np.float32) - 0.5 workspace.FeedBlob("x", X) model = ModelHelper(name="test_model") with brew.arg_scope( brew.conv, stride=2, pad=2, weight_init=('XavierFill', {}), bias_init=('ConstantFill', {}) ): brew.conv( model=model, blob_in="x", blob_out="out", dim_in=3, dim_out=64, kernel=3, ) model.Validate() workspace.RunNetOnce(model.param_init_net) workspace.RunNetOnce(model.net) out = workspace.FetchBlob("out") self.assertEqual(out.shape, (64, 64, 17, 17)) def test_arg_scope_nested(self): myhelper = self.myhelper n = 16 with brew.arg_scope([myhelper], val=-3), \ brew.arg_scope([myhelper], val=-2): with brew.arg_scope([myhelper], val=n): res = brew.myhelper(self.model) self.assertEqual(n, res) res = brew.myhelper(self.model) self.assertEqual(res, -2) res = brew.myhelper(self.model, val=15) self.model.Validate() self.assertEqual(res, 15) def test_double_register(self): myhelper = self.myhelper with self.assertRaises(AttributeError): brew.Register(myhelper) def test_has_helper(self): self.assertTrue(brew.has_helper(brew.conv)) self.assertTrue(brew.has_helper("conv")) def myhelper3(): pass self.assertFalse(brew.has_helper(myhelper3)) def test_model_helper(self): X = np.random.rand(64, 32, 32, 3).astype(np.float32) - 0.5 workspace.FeedBlob("x", X) my_arg_scope = {'order': 'NHWC'} model = ModelHelper(name="test_model", arg_scope=my_arg_scope) with brew.arg_scope( brew.conv, stride=2, pad=2, weight_init=('XavierFill', {}), bias_init=('ConstantFill', {}) ): brew.conv( model=model, blob_in="x", blob_out="out", dim_in=3, dim_out=64, kernel=3, ) model.Validate() workspace.RunNetOnce(model.param_init_net) workspace.RunNetOnce(model.net) out = workspace.FetchBlob("out") self.assertEqual(out.shape, (64, 17, 17, 64)) def test_cnn_model_helper_deprecated(self): X = np.random.rand(64, 32, 32, 3).astype(np.float32) - 0.5 workspace.FeedBlob("x", X) # CNNModelHelper is going to be deprecated soon. This test is only # covering some CNNModelHelper logic model = CNNModelHelper(name="test_model", order='NHWC') self.assertEqual(model.arg_scope['order'], 'NHWC')