def test_mobile_exporter(self): model = ModelHelper(name="mobile_exporter_test_model") # Test LeNet brew.conv(model, 'data', 'conv1', dim_in=1, dim_out=20, kernel=5) brew.max_pool(model, 'conv1', 'pool1', kernel=2, stride=2) brew.conv(model, 'pool1', 'conv2', dim_in=20, dim_out=50, kernel=5) brew.max_pool(model, 'conv2', 'pool2', kernel=2, stride=2) brew.fc(model, 'pool2', 'fc3', dim_in=50 * 4 * 4, dim_out=500) brew.relu(model, 'fc3', 'fc3') brew.fc(model, 'fc3', 'pred', 500, 10) brew.softmax(model, 'pred', 'out') # Create our mobile exportable networks workspace.RunNetOnce(model.param_init_net) init_net, predict_net = mobile_exporter.Export( workspace, model.net, model.params ) # Populate the workspace with data np_data = np.random.rand(1, 1, 28, 28).astype(np.float32) workspace.FeedBlob("data", np_data) workspace.CreateNet(model.net) workspace.RunNet(model.net) ref_out = workspace.FetchBlob("out") # Clear the workspace workspace.ResetWorkspace() # Populate the workspace with data workspace.RunNetOnce(init_net) # Fake "data" is populated by init_net, we have to replace it workspace.FeedBlob("data", np_data) # Overwrite the old net workspace.CreateNet(predict_net, True) workspace.RunNet(predict_net.name) manual_run_out = workspace.FetchBlob("out") np.testing.assert_allclose( ref_out, manual_run_out, atol=1e-10, rtol=1e-10 ) # Clear the workspace workspace.ResetWorkspace() # Predictor interface test (simulates writing to disk) predictor = workspace.Predictor( init_net.SerializeToString(), predict_net.SerializeToString() ) # Output is a vector of outputs but we only care about the first and only result predictor_out = predictor.run([np_data]) assert len(predictor_out) == 1 predictor_out = predictor_out[0] np.testing.assert_allclose( ref_out, predictor_out, atol=1e-10, rtol=1e-10 )
def test_mobile_exporter(self): model = ModelHelper(name="mobile_exporter_test_model") # Test LeNet brew.conv(model, 'data', 'conv1', dim_in=1, dim_out=20, kernel=5) brew.max_pool(model, 'conv1', 'pool1', kernel=2, stride=2) brew.conv(model, 'pool1', 'conv2', dim_in=20, dim_out=50, kernel=5) brew.max_pool(model, 'conv2', 'pool2', kernel=2, stride=2) brew.fc(model, 'pool2', 'fc3', dim_in=50 * 4 * 4, dim_out=500) brew.relu(model, 'fc3', 'fc3') brew.fc(model, 'fc3', 'pred', 500, 10) brew.softmax(model, 'pred', 'out') # Create our mobile exportable networks workspace.RunNetOnce(model.param_init_net) init_net, predict_net = mobile_exporter.Export(workspace, model.net, model.params) # Populate the workspace with data np_data = np.random.rand(1, 1, 28, 28).astype(np.float32) workspace.FeedBlob("data", np_data) workspace.CreateNet(model.net) workspace.RunNet(model.net) ref_out = workspace.FetchBlob("out") # Clear the workspace workspace.ResetWorkspace() # Populate the workspace with data workspace.RunNetOnce(init_net) # Fake "data" is populated by init_net, we have to replace it workspace.FeedBlob("data", np_data) # Overwrite the old net workspace.CreateNet(predict_net, True) workspace.RunNet(predict_net.name) manual_run_out = workspace.FetchBlob("out") np.testing.assert_allclose(ref_out, manual_run_out, atol=1e-10, rtol=1e-10) # Clear the workspace workspace.ResetWorkspace() # Predictor interface test (simulates writing to disk) predictor = workspace.Predictor(init_net.SerializeToString(), predict_net.SerializeToString()) # Output is a vector of outputs but we only care about the first and only result predictor_out = predictor.run([np_data]) assert len(predictor_out) == 1 predictor_out = predictor_out[0] np.testing.assert_allclose(ref_out, predictor_out, atol=1e-10, rtol=1e-10)
def testShapeInferenceConvNet(self): model = model_helper.ModelHelper(name="convtest") model.NHWC2NCHW("data", "data_nchw") brew.conv(model, "data_nchw", 'conv1', 3, 64, weight_init=("MSRAFill", {}), kernel=7, stride=2, pad=3, no_bias=0) brew.spatial_bn(model, 'conv1', 'conv1_spatbn_relu', 64, epsilon=1e-3, is_test=False) brew.relu(model, 'conv1_spatbn_relu', 'conv1_spatbn_relu') brew.max_pool(model, 'conv1_spatbn_relu', 'pool1', kernel=3, stride=2) brew.fc(model, 'pool1', 'fc', dim_in=(64 * 56 * 56), dim_out=100) brew.dropout(model, 'fc', 'fc_drop', is_test=False) model.Sigmoid('fc_drop', 'fc_sigm') brew.softmax(model, 'fc_sigm', 'softmax') model.LabelCrossEntropy(['softmax', 'label'], 'xent') loss = model.AveragedLoss('xent', 'loss') model.AddGradientOperators([loss]) LR = model.param_init_net.ConstantFill([], 'LR', shape=[1], value=0.1) for param in model.GetParams(): param_grad = model.param_to_grad[param] param_momentum = model.param_init_net.ConstantFill([param], param + '_momentum', value=0.0) model.net.MomentumSGDUpdate( [param_grad, param_momentum, LR, param], [param_grad, param_momentum, param], ) workspace.FeedBlob( "data", np.random.rand(16, 227, 227, 3).astype(np.float32), ) workspace.FeedBlob( "label", (100 * np.random.rand(16)).astype(np.int32), ) workspace.FeedBlob( "label", (100 * np.random.rand(16)).astype(np.int32), ) # Then do automatic comparison test: run the next once to # initialize everything self.InferTensorRunAndCompare(model)
def model_build_fun_deploy(model, loss_scale): last_out = create_resnet(model=model, data='data', num_input_channels=config.IMG_CHANNELS, num_groups=args.groups, num_labels=config.CLASS_NUM, is_test=True) brew.softmax(model, last_out, "softmax") return []
def test_extract_simple(self): from caffe2.python import brew from caffe2.python.model_helper import ModelHelper, ExtractPredictorNet model = ModelHelper(name="test", arg_scope={'order': 'NCHW'}) [data, label] = brew.image_input( model, "reader", ["xx/data", "label"], is_test=1, ) cnv = brew.conv(model, data, 'cnv', 32, 32, 4) a = brew.fc(model, cnv, 'a', 100, 200) pred = brew.fc(model, a, 'pred', 200, 5) brew.softmax(model, [pred, label], "softmax") (predict_net, export_blobs) = ExtractPredictorNet( net_proto=model.net.Proto(), input_blobs=["xx/data"], output_blobs=["pred"], renames={"xx/data": "image"}, ) export_blobs = set(export_blobs) ops = list(predict_net.Proto().op) for op in ops: self.assertFalse(op.type == "Softmax") self.assertFalse("xx/data" in op.input) # Note: image input should not be included self.assertEquals(ops[0].type, "Conv") self.assertEquals(ops[1].type, "FC") self.assertEquals(ops[2].type, "FC") self.assertEquals(len(ops), 3) # test rename happened self.assertEquals(ops[0].input[0], "image") # Check export blobs self.assertTrue("image" not in export_blobs) self.assertTrue("xx/data" not in export_blobs) self.assertEqual(set([str(p) for p in model.params]), export_blobs) # Check external inputs/outputs self.assertTrue("image" in predict_net.Proto().external_input) self.assertEquals(set(["pred"]), set(predict_net.Proto().external_output)) self.assertEqual( set(predict_net.Proto().external_input) - set([str(p) for p in model.params]), set(["image"]))
def test_extract_simple(self): from caffe2.python import brew from caffe2.python.model_helper import ModelHelper, ExtractPredictorNet model = ModelHelper(name="test", arg_scope={'order': 'NCHW'}) [data, label] = brew.image_input( model, "reader", ["xx/data", "label"], is_test=1, ) cnv = brew.conv(model, data, 'cnv', 32, 32, 4) a = brew.fc(model, cnv, 'a', 100, 200) pred = brew.fc(model, a, 'pred', 200, 5) brew.softmax(model, [pred, label], "softmax") (predict_net, export_blobs) = ExtractPredictorNet( net_proto=model.net.Proto(), input_blobs=["xx/data"], output_blobs=["pred"], renames={"xx/data": "image"}, ) export_blobs = set(export_blobs) ops = list(predict_net.Proto().op) for op in ops: self.assertFalse(op.type == "Softmax") self.assertFalse("xx/data" in op.input) # Note: image input should not be included self.assertEquals(ops[0].type, "Conv") self.assertEquals(ops[1].type, "FC") self.assertEquals(ops[2].type, "FC") self.assertEquals(len(ops), 3) # test rename happened self.assertEquals(ops[0].input[0], "image") # Check export blobs self.assertTrue("image" not in export_blobs) self.assertTrue("xx/data" not in export_blobs) self.assertEqual(set([str(p) for p in model.params]), export_blobs) # Check external inputs/outputs self.assertTrue("image" in predict_net.Proto().external_input) self.assertEquals(set(["pred"]), set(predict_net.Proto().external_output)) self.assertEqual( set(predict_net.Proto().external_input) - set([str(p) for p in model.params]), set(["image"]) )
def add_head_nodes(self, model, v, dim_in, fc_name, loss_scale=1.0): """Adds dense and softmax head nodes. :param model_helper.ModelHelper model: Current model to use. :param obj v: Input blobs. :param int dim_in: Number of input features. :param str fc_name: Name of a fully connected operator. :param float loss_scale: For multi-GPU case. :return: List with one head node. A softmax node if `phase` is `inference` else `loss`. """ v = brew.fc(model, v, fc_name, dim_in=dim_in, dim_out=self.num_classes) if self.dtype == 'float16': print( "[INFO] Converting logits from float16 to float32 for softmax layer" ) v = model.net.HalfToFloat(v, v + '_fp32') if self.phase == 'inference': softmax = brew.softmax(model, v, 'softmax') head_nodes = [softmax] else: softmax, loss = model.SoftmaxWithLoss([v, 'softmax_label'], ['softmax', 'loss']) prefix = model.net.Proto().name loss = model.Scale(loss, prefix + "_loss", scale=loss_scale) head_nodes = [loss] return head_nodes
def AddLeNetModel(model, data): ''' This part is the standard LeNet model: from data to the softmax prediction. For each convolutional layer we specify dim_in - number of input channels and dim_out - number or output channels. Also each Conv and MaxPool layer changes the image size. For example, kernel of size 5 reduces each side of an image by 4. While when we have kernel and stride sizes equal 2 in a MaxPool layer, it divides each side in half. Para encadenar layers, la dimension de salida tiene que coincidir con a dimension de entrada de la siguiente layer (sin contar las pool, solo las conv) ''' #Each layer is created using brew, which in turn is using its operator hooks to instantiate each Op. # Image size: 28 x 28 -> 24 x 24 conv1 = brew.conv(model, data, 'conv1', dim_in=1, dim_out=20, kernel=5) # Image size: 24 x 24 -> 12 x 12 pool1 = brew.max_pool(model, conv1, 'pool1', kernel=2, stride=2) # Image size: 12 x 12 -> 8 x 8 conv2 = brew.conv(model, pool1, 'conv2', dim_in=20, dim_out=100, kernel=5) # Image size: 8 x 8 -> 4 x 4 pool2 = brew.max_pool(model, conv2, 'pool2', kernel=2, stride=2) # 100 * 4 * 4 stands for dim_out from previous layer multiplied by the image size fc3 = brew.fc(model, pool2, 'fc3', dim_in=100 * 4 * 4, dim_out=500) #TODO: RELU despues de cada conv layer -> no mejora mucho la accuracy relu = brew.relu(model, fc3, fc3) pred = brew.fc(model, relu, 'pred', 500, 10) softmax = brew.softmax(model, pred, 'softmax') return softmax
def test_caffe2_simple_model(self): model = ModelHelper(name="mnist") # how come those inputs don't break the forward pass =.=a workspace.FeedBlob("data", np.random.randn(1, 3, 64, 64).astype(np.float32)) workspace.FeedBlob("label", np.random.randn(1, 1000).astype(np.int)) with core.NameScope("conv1"): conv1 = brew.conv(model, "data", 'conv1', dim_in=1, dim_out=20, kernel=5) # Image size: 24 x 24 -> 12 x 12 pool1 = brew.max_pool(model, conv1, 'pool1', kernel=2, stride=2) # Image size: 12 x 12 -> 8 x 8 conv2 = brew.conv(model, pool1, 'conv2', dim_in=20, dim_out=100, kernel=5) # Image size: 8 x 8 -> 4 x 4 pool2 = brew.max_pool(model, conv2, 'pool2', kernel=2, stride=2) with core.NameScope("classifier"): # 50 * 4 * 4 stands for dim_out from previous layer multiplied by the image size fc3 = brew.fc(model, pool2, 'fc3', dim_in=100 * 4 * 4, dim_out=500) relu = brew.relu(model, fc3, fc3) pred = brew.fc(model, relu, 'pred', 500, 10) softmax = brew.softmax(model, pred, 'softmax') xent = model.LabelCrossEntropy([softmax, "label"], 'xent') # compute the expected loss loss = model.AveragedLoss(xent, "loss") model.net.RunAllOnMKL() model.param_init_net.RunAllOnMKL() model.AddGradientOperators([loss], skip=1) blob_name_tracker = {} graph = c2_graph.model_to_graph_def( model, blob_name_tracker=blob_name_tracker, shapes={}, show_simplified=False, ) compare_proto(graph, self)
def AddLeNetModel(model, data): ''' This part is the standard LeNet model: from data to the softmax prediction. For each convolutional layer we specify dim_in - number of input channels and dim_out - number or output channels. Also each Conv and MaxPool layer changes the image size. For example, kernel of size 5 reduces each side of an image by 4. While when we have kernel and stride sizes equal 2 in a MaxPool layer, it divides each side in half. ''' # Image size: 28 x 28 -> 24 x 24 / 350 x 350 -> 346 x 346 conv1 = brew.conv(model, data, 'conv1', dim_in=1, dim_out=20, kernel=3) # Image size: 346 x 346 -> 173 x 173 pool1 = brew.max_pool(model, conv1, 'pool1', kernel=2, stride=2) # Image size: 174 x 174 conv2 = brew.conv(model, pool1, 'conv2', dim_in=20, dim_out=50, kernel=5) # Image size: 174 x 174 -> 87 x 87 pool2 = brew.max_pool(model, conv2, 'pool2', kernel=2, stride=2) # 50 * 4 * 4 stands for dim_out from previous layer multiplied by the image size # Here, the data is flattened from a tensor of dimension 50x4x4 to a vector of length 50*4*4 fc3 = brew.fc(model, pool2, 'fc3', dim_in=50 * 87 * 87, dim_out=500) relu3 = brew.relu(model, fc3, 'relu3') # Last FC Layer pred = brew.fc(model, relu3, 'pred', dim_in=500, dim_out=10) # Softmax Layer softmax = brew.softmax(model, pred, 'softmax') return softmax
def AddLeNetModel(model, data): ''' This part is the standard LeNet model: from data to the softmax prediction. For each convolutional layer we specify dim_in - number of input channels and dim_out - number or output channels. Also each Conv and MaxPool layer changes the image size. For example, kernel of size 5 reduces each side of an image by 4. While when we have kernel and stride sizes equal 2 in a MaxPool layer, it divides each side in half. ''' # Image size: 28 x 28 -> 24 x 24 conv1 = brew.conv(model, data, 'conv1', dim_in=1, dim_out=20, kernel=5) # Image size: 24 x 24 -> 12 x 12 pool1 = brew.max_pool(model, conv1, 'pool1', kernel=2, stride=2) # Image size: 12 x 12 -> 8 x 8 conv2 = brew.conv(model, pool1, 'conv2', dim_in=20, dim_out=50, kernel=5) # Image size: 8 x 8 -> 4 x 4 pool2 = brew.max_pool(model, conv2, 'pool2', kernel=2, stride=2) # 50 * 4 * 4 stands for dim_out from previous layer multiplied by the image size fc3 = brew.fc(model, pool2, 'fc3', dim_in=50 * 4 * 4, dim_out=500) fc3 = brew.relu(model, fc3, fc3) pred = brew.fc(model, fc3, 'pred', 500, 10) softmax = brew.softmax(model, pred, 'softmax') return softmax
def AddLeNetModel(model, data, num_classes, image_height, image_width, image_channels): # Image size: 28 x 28 -> 24 x 24 ############# Change dim_in value if images are more than 1 color channel conv1 = brew.conv(model, data, 'conv1', dim_in=1, dim_out=20, kernel=5) h, w = update_dims(height=image_height, width=image_width, kernel=5, stride=1, pad=0) # Image size: 24 x 24 -> 12 x 12 pool1 = brew.max_pool(model, conv1, 'pool1', kernel=2, stride=2) h, w = update_dims(height=h, width=w, kernel=2, stride=2, pad=0) # Image size: 12 x 12 -> 8 x 8 conv2 = brew.conv(model, pool1, 'conv2', dim_in=20, dim_out=50, kernel=5) h, w = update_dims(height=h, width=w, kernel=5, stride=1, pad=0) # Image size: 8 x 8 -> 4 x 4 pool2 = brew.max_pool(model, conv2, 'pool2', kernel=2, stride=2) h, w = update_dims(height=h, width=w, kernel=2, stride=2, pad=0) # 50 * 4 * 4 stands for dim_out from previous layer multiplied by the image size ############# Change dim_in value if images are not 28x28 fc3 = brew.fc(model, pool2, 'fc3', dim_in=50 * h * w, dim_out=500) fc3 = brew.relu(model, fc3, fc3) pred = brew.fc(model, fc3, 'pred', 500, num_classes) softmax = brew.softmax(model, pred, 'softmax') return softmax
def AddLeNetModel(model, data): conv1 = brew.conv(model, data, 'conv1', dim_in=1, dim_out=32, kernel=3, pad=1) conv1 = brew.relu(model, conv1, conv1) conv2 = brew.conv(model, conv1, 'conv2', dim_in=32, dim_out=128, kernel=3, pad=1) conv2 = brew.relu(model, conv2, conv2) conv3 = brew.conv(model, conv2, 'conv3', dim_in=128, dim_out=256, kernel=3, pad=1) conv3 = brew.relu(model, conv3, conv3) fc3 = brew.fc(model, conv3, 'fc3', dim_in=256 * 28 * 28, dim_out=512) fc3 = brew.relu(model, fc3, fc3) pred = brew.fc(model, fc3, 'pred', 512, 10) softmax = brew.softmax(model, pred, 'softmax') return softmax
def add_lenet_fc_topk(model, data, **kwargs): ''' Based on original LeNet structure, according to meProp, we add topk gradient selecting layer for fc layers ''' # resolving arguments k = kwargs.get('k', 10) # Image size: 28 x 28 -> 24 x 24 conv1 = brew.conv(model, data, 'conv1', dim_in=3, dim_out=20, kernel=5) # Image size: 24 x 24 -> 12 x 12 pool1 = brew.max_pool(model, conv1, 'pool1', kernel=2, stride=2) # Image size: 12 x 12 -> 8 x 8 conv2 = brew.conv(model, pool1, 'conv2', dim_in=20, dim_out=50, kernel=5) # Image size: 8 x 8 -> 4 x 4 pool2 = brew.max_pool(model, conv2, 'pool2', kernel=2, stride=2) # DEBUG PRINT model.net.Print(pool2, []) # set topkgradhook for the hidden fc layers fc3 = brew.fc(model, pool2, 'fc3', dim_in=50 * 4 * 4, dim_out=500) fc3_hook = model.net.TopKGradHook(fc3, 'fc3_hook', k=k) relu = brew.relu(model, fc3_hook, fc3_hook) # don't set topkgradhook for the output fc layer pred = brew.fc(model, relu, 'pred', 500, 10) softmax = brew.softmax(model, pred, 'softmax') return softmax
def add_lenet_conv_topk(model, data, **kwargs): ''' Based on original LeNet structure, according to meProp, we add topk gradient selecting layer for conv layers ''' # resolving arguments config = kwargs.get('config', {}) k = kwargs.get('k', 10) # Image size: 28 x 28 -> 24 x 24 conv1 = brew.conv(model, data, 'conv1', dim_in=3, dim_out=20, kernel=5) conv1_hook = model.net.TopKGradHook(conv1, 'conv1_hook', k=k) # Image size: 24 x 24 -> 12 x 12 pool1 = brew.max_pool(model, conv1_hook, 'pool1', kernel=2, stride=2) # Image size: 12 x 12 -> 8 x 8 conv2 = brew.conv(model, pool1, 'conv2', dim_in=20, dim_out=50, kernel=5) conv2_hook = model.net.TopKGradHook(conv2, 'conv2_hook', k=k) # Image size: 8 x 8 -> 4 x 4 pool2 = brew.max_pool(model, conv2_hook, 'pool2', kernel=2, stride=2) # 50 * 4 * 4 stands for dim_out from previous layer multiplied by the image size fc3 = brew.fc(model, pool2, 'fc3', dim_in=50 * 4 * 4, dim_out=500) relu = brew.relu(model, fc3, fc3) pred = brew.fc(model, relu, 'pred', 500, config['model_arch']['num_classes']) softmax = brew.softmax(model, pred, 'softmax') return softmax
def AddModel(model, data): conv1 = brew.conv(model, data, 'conv1', dim_in=input_channels, dim_out=10, kernel=3, stride=1, pad=1, training_mode=1) deconv1 = brew.conv_transpose(model, conv1, 'deconv1', dim_in=10, dim_out=10, kernel=2, stride=2, pad=0, training_mode=1) fc1 = brew.fc(model, deconv1, 'fc1', dim_in=10 * 56 * 56, dim_out=3) softmax = brew.softmax(model, fc1, 'softmax') return softmax
def ScaffoldModelCNN_AlexNet(model, classCount, data, imageDimension, amountOfChannels): brew.conv(model, data, 'conv1', amountOfChannels, 96, 11, stride=4, pad=0) brew.relu(model, 'conv1', 'conv1') brew.max_pool(model, 'norm1', 'pool1', kernel=3, stride=2, pad=0) brew.conv(model, 'pool1', 'conv2', 48, 256, 5, stride=1, pad=2) brew.relu(model, 'conv2', 'conv2') brew.max_pool(model, 'norm2', 'pool2', kernel=3, stride=2, pad=0) brew.conv(model, 'pool2', 'conv3', 256, 384, 3, stride=1, pad=1) brew.relu(model, 'conv3', 'conv3') brew.conv(model, 'conv3', 'conv4', 192, 384, 3, stride=1, pad=1) brew.relu(model, 'conv4', 'conv4') brew.conv(model, 'conv4', 'conv5', 192, 256, 3, stride=1, pad=1) brew.relu(model, 'conv5', 'conv5') brew.max_pool(model, 'conv5', 'pool5', kernel=3, stride=2, pad=1) brew.fc(model, 'pool5', 'fc6', 9216, 4096) brew.relu(model, 'fc6', 'fc6') brew.fc(model, 'fc6', 'fc7', 4096, 4096) brew.relu(model, 'fc7', 'fc7') brew.fc(model, 'fc7', 'fc8', 4096, 1000) return brew.softmax(model, 'fc8', 'softmax')
def add_layers(model, data): # Image size: 32 x 32 x 3 -> 30 x 30 x 60 conv1 = brew.conv(model, data, 'conv1', dim_in=3, dim_out=64, kernel=3) #add relu conv1 = brew.relu(model, conv1, conv1) # Image size: 30 x 30 -> 15 x 15 pool1 = brew.max_pool(model, conv1, 'pool1', kernel=2, stride=2) # Image size: 15 x 15 -> 12 x 12 conv2 = brew.conv(model, pool1, 'conv2', dim_in=64, dim_out=128, kernel=3) #add relu conv2 = brew.relu(model, conv2, conv2) # Image size: 12 x 12 -> 6 x 6 pool2 = brew.max_pool(model, conv2, 'pool2', kernel=2, stride=2) # 32 * 6 * 6 stands for dim_out from previous layer multiplied by the image size # Hidden layer fc3 = brew.fc(model, pool2, 'fc3', dim_in=128 * 6 * 6, dim_out=512) #add relu fc3 = brew.relu(model, fc3, fc3) #CO = model.param_init_net.ConstantFill([], "CO", shape=[1], value=0.18) #fc3 = brew.prelu(model, fc3, fc3) #output layer pred = brew.fc(model, fc3, 'pred', 512, 10) #add softmax probs = brew.softmax(model, pred, 'probs') return probs
def AddNet(model, data): # image size: 28x28 -> 24x24 conv1 = brew.conv(model, data, "conv1", dim_in=1, dim_out=20, kernel=5, stride=1) # image size: 24x24 -> 12x12 pool1 = brew.max_pool(model, conv1, "pool1", kernel=2, stride=2) # image size: 12x12 -> 8x8 conv2 = brew.conv(model, pool1, "conv2", dim_in=20, dim_out=100, kernel=5, stride=1) # image size: 8x8 -> 4x4 pool2 = brew.max_pool(model, conv2, "pool2", kernel=2, stride=2) # image size: 100x4x4 -> 500 fc3 = brew.fc(model, pool2, "fc3", dim_in=100 * 4 * 4, dim_out=500) relu = brew.relu(model, fc3, fc3) # image size: 500 -> 10 fc4 = brew.fc(model, fc3, "fc4", dim_in=500, dim_out=10) # softmax softmax = brew.softmax(model, fc4, "softmax") return softmax
def AddMLP_BN(model, data): ''' Implement MLP model on MNIST ''' # number of nuerons in fc layer num_units = 4096 # NCHW: 64 x 1 x 28 x 28 -> 64 x 1 x 28 x 28 drop1 = brew.dropout(model, data, 'drop1', ratio=0.5, is_test=0) # NCHW: 64 x 1 x 28 x 28 -> 64 x 4096 fc2 = brew.fc(model, drop1, 'fc2', dim_in=1 * 28 * 28, dim_out=num_units) fc2_reshaped = model.Reshape([fc2], ['fc2_reshaped'], shape=(4, 2)) # bn2 = brew.spatial_bn(model, fc2, 'bn2', num_units, epsilon=1e-3, momentum=0.9, is_test=is_test) #relu2 = brew.relu(model, fc2, 'relu2') #fc3 = brew.fc(model, relu2, 'fc3', dim_in=num_units, dim_out=num_units) # bn3 = brew.spatial_bn(model, fc3, 'bn3', bn_units, epsilon=1e-3, momentum=0.9, is_test=is_test) #relu3 = brew.relu(model, fc3, 'relu3') #fc4 = brew.fc(model, relu3, 'fc4', dim_in=num_units, dim_out=num_units) # bn4 = brew.spatial_bn(model, fc4, 'bn4', bn_units, epsilon=1e-3, momentum=0.9, is_test=is_test) #relu4 = brew.relu(model, fc4, 'relu4') #fc5 = brew.fc(model, relu4, 'fc5', dim_in=num_units, dim_out=10) # 10 for 10-classes # bn5 = brew.spatial_bn(model, fc5, 'bn5', 10, epsilon=1e-3, momentum=0.9, is_test=is_test) softmax = brew.softmax(model, fc2, 'softmax') return softmax
def AddLeNetModel(model, data, save_png=True): """This part is the standard LeNet model: from data to the softmax prediction. For each convolutional layer we specify dim_in - number of input channels and dim_out - number or output channels. Also each Conv and MaxPool layer changes the image size. For example, kernel of size 5 reduces each side of an image by 4. While when we have kernel and stride sizes equal 2 in a MaxPool layer, it divides each side in half. """ conv1 = brew.conv(model, data, 'conv1', dim_in=1, dim_out=20, kernel=5) pool1 = brew.max_pool(model, conv1, 'pool1', kernel=2, stride=2) conv2 = brew.conv(model, pool1, 'conv2', dim_in=20, dim_out=50, kernel=5) pool2 = brew.max_pool(model, conv2, 'pool2', kernel=2, stride=2) fc3 = brew.fc(model, pool2, 'fc3', dim_in=50 * 4 * 4, dim_out=500) relu3 = brew.relu(model, fc3, 'relu3') pred = brew.fc(model, relu3, 'pred', dim_in=500, dim_out=10) softmax = brew.softmax(model, pred, 'softmax') if save_png: graph = net_drawer.GetPydotGraph(model.net) graph.write_png("LeNet.png") return softmax
def testShapeInferenceConvNet(self): model = model_helper.ModelHelper(name="convtest") model.NHWC2NCHW("data", "data_nchw") brew.conv(model, "data_nchw", 'conv1', 3, 64, weight_init=("MSRAFill", {}), kernel=7, stride=2, pad=3, no_bias=0) brew.spatial_bn(model, 'conv1', 'conv1_spatbn_relu', 64, epsilon=1e-3, is_test=False) brew.relu(model, 'conv1_spatbn_relu', 'conv1_spatbn_relu') brew.max_pool(model, 'conv1_spatbn_relu', 'pool1', kernel=3, stride=2) brew.fc(model, 'pool1', 'fc', dim_in=(64 * 56 * 56), dim_out=100) brew.dropout(model, 'fc', 'fc_drop', is_test=False) model.Sigmoid('fc_drop', 'fc_sigm') brew.softmax(model, 'fc_sigm', 'softmax') model.LabelCrossEntropy(['softmax', 'label'], 'xent') loss = model.AveragedLoss('xent', 'loss') model.AddGradientOperators([loss]) LR = model.param_init_net.ConstantFill( [], 'LR', shape=[1], value=0.1 ) for param in model.GetParams(): param_grad = model.param_to_grad[param] param_momentum = model.param_init_net.ConstantFill( [param], param + '_momentum', value=0.0 ) model.net.MomentumSGDUpdate( [param_grad, param_momentum, LR, param], [param_grad, param_momentum, param], ) workspace.FeedBlob( "data", np.random.rand(16, 227, 227, 3).astype(np.float32), ) workspace.FeedBlob( "label", (100 * np.random.rand(16)).astype(np.int32), ) workspace.FeedBlob( "label", (100 * np.random.rand(16)).astype(np.int32), ) # Then do automatic comparison test: run the next once to # initialize everything self.InferTensorRunAndCompare(model)
def OverFeat(order, cudnn_ws, mkl): my_arg_scope = { 'order': order, 'use_cudnn': True, 'cudnn_exhaustive_search': True, 'ws_nbytes_limit': str(cudnn_ws) } model = ModelHelper(name='overfeat', arg_scope=my_arg_scope) conv1 = brew.conv(model, "data", "conv1", 3, 96, 11, ('XavierFill', {}), ('ConstantFill', {}), stride=4) relu1 = brew.relu(model, conv1, "conv1") pool1 = brew.max_pool(model, relu1, "pool1", kernel=2, stride=2) conv2 = brew.conv(model, pool1, "conv2", 96, 256, 5, ('XavierFill', {}), ('ConstantFill', {})) relu2 = brew.relu(model, conv2, "conv2") pool2 = brew.max_pool(model, relu2, "pool2", kernel=2, stride=2) conv3 = brew.conv(model, pool2, "conv3", 256, 512, 3, ('XavierFill', {}), ('ConstantFill', {}), pad=1) relu3 = brew.relu(model, conv3, "conv3") conv4 = brew.conv(model, relu3, "conv4", 512, 1024, 3, ('XavierFill', {}), ('ConstantFill', {}), pad=1) relu4 = brew.relu(model, conv4, "conv4") conv5 = brew.conv(model, relu4, "conv5", 1024, 1024, 3, ('XavierFill', {}), ('ConstantFill', {}), pad=1) relu5 = brew.relu(model, conv5, "conv5") pool5 = brew.max_pool(model, relu5, "pool5", kernel=2, stride=2) fc6 = brew.fc(model, pool5, "fc6", 1024 * 6 * 6, 3072, ('XavierFill', {}), ('ConstantFill', {})) relu6 = brew.relu(model, fc6, "fc6") fc7 = brew.fc(model, relu6, "fc7", 3072, 4096, ('XavierFill', {}), ('ConstantFill', {})) relu7 = brew.relu(model, fc7, "fc7") fc8 = brew.fc(model, relu7, "fc8", 4096, 1000, ('XavierFill', {}), ('ConstantFill', {})) pred = brew.softmax(model, fc8, "pred") xent = model.LabelCrossEntropy([pred, "label"], "xent") if not mkl: loss = model.AveragedLoss(xent, "loss") return model, 231
def test_simple_model(self): model = model_helper.ModelHelper(name="mnist") data, label = brew.image_input(model, ["db"], ["data", "label"], order="NCHW", use_gpu_transform=False, is_test=0) with core.NameScope("conv1"): conv1 = brew.conv(model, data, 'conv1', dim_in=1, dim_out=20, kernel=5) # Image size: 24 x 24 -> 12 x 12 pool1 = brew.max_pool(model, conv1, 'pool1', kernel=2, stride=2) # Image size: 12 x 12 -> 8 x 8 conv2 = brew.conv(model, pool1, 'conv2', dim_in=20, dim_out=100, kernel=5) # Image size: 8 x 8 -> 4 x 4 pool2 = brew.max_pool(model, conv2, 'pool2', kernel=2, stride=2) with core.NameScope("classifier"): # 50 * 4 * 4 stands for dim_out from previous layer multiplied by the image size fc3 = brew.fc(model, pool2, 'fc3', dim_in=100 * 4 * 4, dim_out=500) relu = brew.relu(model, fc3, fc3) pred = brew.fc(model, relu, 'pred', 500, 10) softmax = brew.softmax(model, pred, 'softmax') xent = model.LabelCrossEntropy([softmax, label], 'xent') # compute the expected loss loss = model.AveragedLoss(xent, "loss") model.net.RunAllOnGPU() model.param_init_net.RunAllOnGPU() model.AddGradientOperators([loss], skip=1) blob_name_tracker = {} graph = tb.model_to_graph_def( model, blob_name_tracker=blob_name_tracker, shapes={}, show_simplified=False, ) self.assertEqual( blob_name_tracker['GRADIENTS/conv1/conv1_b_grad'], 'conv1/conv1_b_grad', ) self.maxDiff = None # We can't guarantee the order in which they appear, so we sort # both before we compare them sep = "node {" expected = "\n".join( sorted(sep + "\n " + part.strip() for part in EXPECTED_MNIST.strip().split(sep) if part.strip())) actual = "\n".join( sorted(sep + "\n " + part.strip() for part in str(graph).strip().split(sep) if part.strip())) self.assertMultiLineEqual(actual, expected)
def AddLeNetModel(model, data): fc1 = brew.fc(model, data, 'fc1', dim_in=784, dim_out=1000) fc1 = brew.relu(model, fc1, fc1) fc2 = brew.fc(model, fc1, 'fc2', dim_in=1000, dim_out=1000) fc2 = brew.relu(model, fc2, fc2) pred = brew.fc(model, fc2, 'fc3', dim_in=1000, dim_out=10) softmax = brew.softmax(model, pred, 'softmax') return softmax
def Add_Original_CIFAR10_Model(model, data, num_classes, image_height, image_width, image_channels, save_png=True): conv1 = brew.conv(model, data, 'conv1', dim_in=image_channels, dim_out=32, kernel=5, stride=1, pad=2) h, w = update_dims(height=image_height, width=image_width, kernel=5, stride=1, pad=2) pool1 = brew.max_pool(model, conv1, 'pool1', kernel=3, stride=2) h, w = update_dims(height=h, width=w, kernel=3, stride=2, pad=0) relu1 = brew.relu(model, pool1, 'relu1') conv2 = brew.conv(model, relu1, 'conv2', dim_in=32, dim_out=32, kernel=5, stride=1, pad=2) h, w = update_dims(height=h, width=w, kernel=5, stride=1, pad=2) relu2 = brew.relu(model, conv2, 'relu2') pool2 = brew.average_pool(model, relu2, 'pool2', kernel=3, stride=2) h, w = update_dims(height=h, width=w, kernel=3, stride=2, pad=0) conv3 = brew.conv(model, pool2, 'conv3', dim_in=32, dim_out=64, kernel=5, stride=1, pad=2) h, w = update_dims(height=h, width=w, kernel=5, stride=1, pad=2) relu3 = brew.relu(model, conv3, 'relu3') pool3 = brew.average_pool(model, relu3, 'pool3', kernel=3, stride=2) h, w = update_dims(height=h, width=w, kernel=3, stride=2, pad=0) fc1 = brew.fc(model, pool3, 'fc1', dim_in=64 * h * w, dim_out=64) fc2 = brew.fc(model, fc1, 'fc2', dim_in=64, dim_out=num_classes) softmax = brew.softmax(model, fc2, 'softmax') if save_png: graph = net_drawer.GetPydotGraph(model.net, rankdir="LR") graph.write_png("CIFAR10_Model.png") return softmax
def AddMLPModel(model, data): size = INPUT_WIDTH * INPUT_HEIGHT * INPUT_LAYERS sizes = [INPUT_WIDTH, INPUT_HEIGHT * 2, size * 2, CLASSES] layer = data for i in range(len(sizes) - 1): layer = brew.fc(model, layer, 'dense_{}'.format(i), dim_in=sizes[i], dim_out=sizes[i + 1]) layer = brew.relu(model, layer, 'relu_{}'.format(i)) softmax = brew.softmax(model, layer, 'softmax') return softmax
def AddMLPModel(model, data): size = 28 * 28 * 1 sizes = [size, size * 2, size * 2, 10] layer = data for i in range(len(sizes) - 1): layer = brew.fc(model, layer, 'dense_{}'.format(i), dim_in=sizes[i], dim_out=sizes[i + 1]) layer = brew.relu(model, layer, 'relu_{}'.format(i)) softmax = brew.softmax(model, layer, 'softmax') return softmax
def AddLeNetModel(model, data): conv1 = brew.conv(model, data, 'conv1', dim_in=1, dim_out=20, kernel=5) pool1 = brew.max_pool(model, conv1, 'pool1', kernel=2, stride=2) conv2 = brew.conv(model, pool1, 'conv2', dim_in=20, dim_out=50, kernel=5) pool2 = brew.max_pool(model, conv2, 'pool2', kernel=2, stride=2) fc3 = brew.fc(model, pool2, 'fc3', dim_in=50 * 4 * 4, dim_out=500) fc3 = brew.relu(model, fc3, fc3) pred = brew.fc(model, fc3, 'pred', 500, 10) softmax = brew.softmax(model, pred, 'softmax')
def add_softmax(self, prev_blob, label=None): if label is not None: (softmax, loss) = self.model.SoftmaxWithLoss( [prev_blob, label], ['softmax', 'loss'], ) return (softmax, loss) else: return brew.softmax(self.model, prev_blob, 'softmax')
def AddAlexNet(model, data): conv1 = brew.conv(model, data, "conv1", 3, 64, 11, ('XavierFill', {}), ('ConstantFill', {}), stride=4, pad=2) relu1 = brew.relu(model, conv1, "conv1") pool1 = brew.max_pool(model, relu1, "pool1", kernel=3, stride=2) conv2 = brew.conv(model, pool1, "conv2", 64, 192, 5, ('XavierFill', {}), ('ConstantFill', {}), pad=2) relu2 = brew.relu(model, conv2, "conv2") pool2 = brew.max_pool(model, relu2, "pool2", kernel=3, stride=2) conv3 = brew.conv(model, pool2, "conv3", 192, 384, 3, ('XavierFill', {}), ('ConstantFill', {}), pad=1) relu3 = brew.relu(model, conv3, "conv3") conv4 = brew.conv(model, relu3, "conv4", 384, 256, 3, ('XavierFill', {}), ('ConstantFill', {}), pad=1) relu4 = brew.relu(model, conv4, "conv4") conv5 = brew.conv(model, relu4, "conv5", 256, 256, 3, ('XavierFill', {}), ('ConstantFill', {}), pad=1) relu5 = brew.relu(model, conv5, "conv5") pool5 = brew.max_pool(model, relu5, "pool5", kernel=3, stride=2) fc6 = brew.fc(model, pool5, "fc6", 256 * 6 * 6, 4096, ('XavierFill', {}), ('ConstantFill', {})) relu6 = brew.relu(model, fc6, "fc6") fc7 = brew.fc(model, relu6, "fc7", 4096, 4096, ('XavierFill', {}), ('ConstantFill', {})) relu7 = brew.relu(model, fc7, "fc7") fc8 = brew.fc(model, relu7, "fc8", 4096, 10, ('XavierFill', {}), ('ConstantFill', {})) pred = brew.softmax(model, fc8, "pred") return pred
def AddLeNetModel(model, data, device_opts): ''' This part is the standard LeNet model: from data to the softmax prediction. For each convolutional layer we specify dim_in - number of input channels and dim_out - number or output channels. Also each Conv and MaxPool layer changes the image size. For example, kernel of size 5 reduces each side of an image by 4. While when we have kernel and stride sizes equal 2 in a MaxPool layer, it divides each side in half. ''' with core.DeviceScope(device_opts): ############# Change dim_in value if images are more than 1 color channel # Image size: 64x64 conv1 = brew.conv(model, data, 'conv1', dim_in=1, dim_out=32, kernel=5) h, w = update_dims(height=image_height, width=image_width, kernel=5, stride=1, pad=0) # Image size: 60x60 pool1 = brew.max_pool(model, conv1, 'pool1', kernel=2, stride=2) h, w = update_dims(height=h, width=w, kernel=2, stride=2, pad=0) relu1 = brew.relu(model, pool1, 'relu1') # Image size: 30x30 conv2 = brew.conv(model, relu1, 'conv2', dim_in=32, dim_out=64, kernel=5) h, w = update_dims(height=h, width=w, kernel=5, stride=1, pad=0) # Image size: 26x26 pool2 = brew.max_pool(model, conv2, 'pool2', kernel=2, stride=2) h, w = update_dims(height=h, width=w, kernel=2, stride=2, pad=0) relu2 = brew.relu(model, pool2, 'relu2') # Image size: 13x13 conv3 = brew.conv(model, relu2, 'conv3', dim_in=64, dim_out=64, kernel=5) h, w = update_dims(height=h, width=w, kernel=5, stride=1, pad=0) # Image size: 9x9 pool3 = brew.max_pool(model, conv3, 'pool3', kernel=2, stride=2) h, w = update_dims(height=h, width=w, kernel=2, stride=2, pad=0) relu3 = brew.relu(model, pool3, 'relu3') # Image size: 4x4 # 50 * 4 * 4 stands for dim_out from previous layer multiplied by the image size ############# Change dim_in value if images are not 28x28 fc3 = brew.fc(model, relu3, 'fc3', dim_in=64 * h * w, dim_out=500) fc3 = brew.relu(model, fc3, fc3) pred = brew.fc(model, fc3, 'pred', 500, num_classes) softmax = brew.softmax(model, pred, 'softmax') return softmax
def test_get_complete_net(self): model = model_helper.ModelHelper("test_orig") conv = brew.conv( model, "input", "conv", dim_in=3, dim_out=16, weight_init=("MSRAFill", {}), kernel=3, stride=1, pad=0, ) conv = brew.spatial_bn(model, conv, "conv_bn", 16, epsilon=1e-3, is_test=False) conv = brew.relu(model, conv, "conv_relu") pred = brew.fc(model, conv, "pred", dim_in=16 * 3 * 3, dim_out=10) brew.softmax(model, pred, "softmax") net = model.GetCompleteNet() model2 = model_helper.ModelHelper("test_new") model2.ConstructInitTrainNetfromNet(net) net = model.param_init_net net2 = model2.param_init_net for op1, op2 in zip(net.Proto().op, net2.Proto().op): op1.debug_info = op1.debug_info + "/param_init_net" self.assertEqual( op1, op2, "op mismatch between {}\n and {}\n".format(op1, op2)) net = model.net net2 = model2.net for op1, op2 in zip(net.Proto().op, net2.Proto().op): self.assertEqual( op1, op2, "op mismatch between {}\n and {}\n".format(op1, op2)) # this is not guaranteed in other situations where user define own net self.assertEqual( sorted(map(str, net.external_inputs)), sorted(map(str, net2.external_inputs)), )
def test_tensorboard_graphs(self): model = model_helper.ModelHelper(name="overfeat") data, label = brew.image_input( model, ["db"], ["data", "label"], is_test=0 ) with core.NameScope("conv1"): conv1 = brew.conv(model, data, "conv1", 3, 96, 11, stride=4) relu1 = brew.relu(model, conv1, conv1) pool1 = brew.max_pool(model, relu1, "pool1", kernel=2, stride=2) with core.NameScope("classifier"): fc = brew.fc(model, pool1, "fc", 4096, 1000) pred = brew.softmax(model, fc, "pred") xent = model.LabelCrossEntropy([pred, label], "xent") loss = model.AveragedLoss(xent, "loss") model.AddGradientOperators([loss], skip=1) c2_dir = tempfile.mkdtemp() tf_dir = tempfile.mkdtemp() with open(os.path.join(c2_dir, "init"), "w") as f: f.write(str(model.param_init_net.Proto())) with open(os.path.join(c2_dir, "net"), "w") as f: f.write(str(model.net.Proto())) runner = click.testing.CliRunner() result = runner.invoke( tb.cli, ["tensorboard-graphs", "--c2-netdef", os.path.join(c2_dir, "init"), "--c2-netdef", os.path.join(c2_dir, "net"), "--tf-dir", tf_dir]) self.assertEqual(result.exit_code, 0) entries = list(os.walk(tf_dir)) self.assertEqual(len(entries), 1) ((d, _, (fname,)),) = entries self.assertEqual(tf_dir, d) events = list(tf.train.summary_iterator(os.path.join(tf_dir, fname))) self.assertEqual(len(events), 3) events = events[1:] nets = [model.param_init_net, model.net] for i, (event, net) in enumerate(zip(events, nets), start=1): self.assertEqual(event.step, i) self.assertEqual(event.wall_time, i) g = tf.GraphDef() g.ParseFromString(event.graph_def) self.assertMultiLineEqual( str(g), str(tb_exporter.nets_to_graph_def([net])))
def _calc_attention_weights( model, attention_logits_transposed, scope, encoder_lengths=None, ): if encoder_lengths is not None: attention_logits_transposed = model.net.SequenceMask( [attention_logits_transposed, encoder_lengths], ['masked_attention_logits'], mode='sequence', ) # [batch_size, encoder_length, 1] attention_weights_3d = brew.softmax( model, attention_logits_transposed, s(scope, 'attention_weights_3d'), engine='CUDNN', axis=1, ) return attention_weights_3d
def create_resnet_32x32( model, data, num_input_channels, num_groups, num_labels, is_test=False ): ''' Create residual net for smaller images (sec 4.2 of He et. al (2015)) num_groups = 'n' in the paper ''' # conv1 + maxpool brew.conv( model, data, 'conv1', num_input_channels, 16, kernel=3, stride=1 ) brew.spatial_bn( model, 'conv1', 'conv1_spatbn', 16, epsilon=1e-3, is_test=is_test ) brew.relu(model, 'conv1_spatbn', 'relu1') # Number of blocks as described in sec 4.2 filters = [16, 32, 64] builder = ResNetBuilder(model, 'relu1', is_test=is_test) prev_filters = 16 for groupidx in range(0, 3): for blockidx in range(0, 2 * num_groups): builder.add_simple_block( prev_filters if blockidx == 0 else filters[groupidx], filters[groupidx], down_sampling=(True if blockidx == 0 and groupidx > 0 else False)) prev_filters = filters[groupidx] # Final layers brew.average_pool( model, builder.prev_blob, 'final_avg', kernel=8, stride=1 ) brew.fc(model, 'final_avg', 'last_out', 64, num_labels) softmax = brew.softmax(model, 'last_out', 'softmax') return softmax
def _calc_attention_weights( model, attention_logits_transposed, scope, encoder_lengths=None, ): if encoder_lengths is not None: attention_logits = model.net.Squeeze( [attention_logits_transposed], [attention_logits_transposed], dims=[2], ) flat_attention_logits = model.net.UnpackSegments( [encoder_lengths, attention_logits], 'flat_attention_logits', ) masked_attention_logits = model.net.PackSegments( [encoder_lengths, flat_attention_logits], 'masked_attention_logits', pad_minf=True, ) attention_logits_transposed = model.net.ExpandDims( [masked_attention_logits], [masked_attention_logits], dims=[2], ) # [batch_size, encoder_length, 1] attention_weights_3d = brew.softmax( model, attention_logits_transposed, s(scope, 'attention_weights_3d'), engine='CUDNN', axis=1, ) return attention_weights_3d
def Softmax(self, *args, **kwargs): return brew.softmax(self, *args, use_cudnn=self.use_cudnn, **kwargs)
def AlexNet(order, cudnn_ws): my_arg_scope = { 'order': order, 'use_cudnn': True, 'cudnn_exhaustive_search': True, } if cudnn_ws: my_arg_scope['ws_nbytes_limit'] = cudnn_ws model = model_helper.ModelHelper( name="alexnet", arg_scope=my_arg_scope, ) conv1 = brew.conv( model, "data", "conv1", 3, 64, 11, ('XavierFill', {}), ('ConstantFill', {}), stride=4, pad=2 ) relu1 = brew.relu(model, conv1, "conv1") pool1 = brew.max_pool(model, relu1, "pool1", kernel=3, stride=2) conv2 = brew.conv( model, pool1, "conv2", 64, 192, 5, ('XavierFill', {}), ('ConstantFill', {}), pad=2 ) relu2 = brew.relu(model, conv2, "conv2") pool2 = brew.max_pool(model, relu2, "pool2", kernel=3, stride=2) conv3 = brew.conv( model, pool2, "conv3", 192, 384, 3, ('XavierFill', {}), ('ConstantFill', {}), pad=1 ) relu3 = brew.relu(model, conv3, "conv3") conv4 = brew.conv( model, relu3, "conv4", 384, 256, 3, ('XavierFill', {}), ('ConstantFill', {}), pad=1 ) relu4 = brew.relu(model, conv4, "conv4") conv5 = brew.conv( model, relu4, "conv5", 256, 256, 3, ('XavierFill', {}), ('ConstantFill', {}), pad=1 ) relu5 = brew.relu(model, conv5, "conv5") pool5 = brew.max_pool(model, relu5, "pool5", kernel=3, stride=2) fc6 = brew.fc( model, pool5, "fc6", 256 * 6 * 6, 4096, ('XavierFill', {}), ('ConstantFill', {}) ) relu6 = brew.relu(model, fc6, "fc6") fc7 = brew.fc( model, relu6, "fc7", 4096, 4096, ('XavierFill', {}), ('ConstantFill', {}) ) relu7 = brew.relu(model, fc7, "fc7") fc8 = brew.fc( model, relu7, "fc8", 4096, 1000, ('XavierFill', {}), ('ConstantFill', {}) ) pred = brew.softmax(model, fc8, "pred") xent = model.net.LabelCrossEntropy([pred, "label"], "xent") model.net.AveragedLoss(xent, "loss") return model, 224
def OverFeat(order, cudnn_ws, device): my_arg_scope = {'order': order, 'use_cudnn': True, 'cudnn_exhaustive_search': True, 'ws_nbytes_limit': str(cudnn_ws)} model = ModelHelper(name='overfeat', arg_scope=my_arg_scope) conv1 = brew.conv( model, "data", "conv1", 3, 96, 11, ('XavierFill', {}), ('ConstantFill', {}), stride=4 ) relu1 = brew.relu(model, conv1, "conv1") pool1 = brew.max_pool(model, relu1, "pool1", kernel=2, stride=2) conv2 = brew.conv( model, pool1, "conv2", 96, 256, 5, ('XavierFill', {}), ('ConstantFill', {}) ) relu2 = brew.relu(model, conv2, "conv2") pool2 = brew.max_pool(model, relu2, "pool2", kernel=2, stride=2) conv3 = brew.conv( model, pool2, "conv3", 256, 512, 3, ('XavierFill', {}), ('ConstantFill', {}), pad=1 ) relu3 = brew.relu(model, conv3, "conv3") conv4 = brew.conv( model, relu3, "conv4", 512, 1024, 3, ('XavierFill', {}), ('ConstantFill', {}), pad=1 ) relu4 = brew.relu(model, conv4, "conv4") conv5 = brew.conv( model, relu4, "conv5", 1024, 1024, 3, ('XavierFill', {}), ('ConstantFill', {}), pad=1 ) relu5 = brew.relu(model, conv5, "conv5") pool5 = brew.max_pool(model, relu5, "pool5", kernel=2, stride=2) fc6 = brew.fc( model, pool5, "fc6", 1024 * 6 * 6, 3072, ('XavierFill', {}), ('ConstantFill', {}) ) relu6 = brew.relu(model, fc6, "fc6") fc7 = brew.fc( model, relu6, "fc7", 3072, 4096, ('XavierFill', {}), ('ConstantFill', {}) ) relu7 = brew.relu(model, fc7, "fc7") fc8 = brew.fc( model, relu7, "fc8", 4096, 1000, ('XavierFill', {}), ('ConstantFill', {}) ) pred = brew.softmax(model, fc8, "pred") xent = model.LabelCrossEntropy([pred, "label"], "xent") if device != 'MKL': loss = model.AveragedLoss(xent, "loss") return model, 231
def VGGA(order, cudnn_ws, device): my_arg_scope = {'order': order, 'use_cudnn': True, 'cudnn_exhaustive_search': True, 'ws_nbytes_limit': str(cudnn_ws)} model = ModelHelper(name='vgg-a', arg_scope=my_arg_scope) conv1 = brew.conv( model, "data", "conv1", 3, 64, 3, ('XavierFill', {}), ('ConstantFill', {}), pad=1 ) relu1 = brew.relu(model, conv1, "conv1") pool1 = brew.max_pool(model, relu1, "pool1", kernel=2, stride=2) conv2 = brew.conv( model, pool1, "conv2", 64, 128, 3, ('XavierFill', {}), ('ConstantFill', {}), pad=1 ) relu2 = brew.relu(model, conv2, "conv2") pool2 = brew.max_pool(model, relu2, "pool2", kernel=2, stride=2) conv3 = brew.conv( model, pool2, "conv3", 128, 256, 3, ('XavierFill', {}), ('ConstantFill', {}), pad=1 ) relu3 = brew.relu(model, conv3, "conv3") conv4 = brew.conv( model, relu3, "conv4", 256, 256, 3, ('XavierFill', {}), ('ConstantFill', {}), pad=1 ) relu4 = brew.relu(model, conv4, "conv4") pool4 = brew.max_pool(model, relu4, "pool4", kernel=2, stride=2) conv5 = brew.conv( model, pool4, "conv5", 256, 512, 3, ('XavierFill', {}), ('ConstantFill', {}), pad=1 ) relu5 = brew.relu(model, conv5, "conv5") conv6 = brew.conv( model, relu5, "conv6", 512, 512, 3, ('XavierFill', {}), ('ConstantFill', {}), pad=1 ) relu6 = brew.relu(model, conv6, "conv6") pool6 = brew.max_pool(model, relu6, "pool6", kernel=2, stride=2) conv7 = brew.conv( model, pool6, "conv7", 512, 512, 3, ('XavierFill', {}), ('ConstantFill', {}), pad=1 ) relu7 = brew.relu(model, conv7, "conv7") conv8 = brew.conv( model, relu7, "conv8", 512, 512, 3, ('XavierFill', {}), ('ConstantFill', {}), pad=1 ) relu8 = brew.relu(model, conv8, "conv8") pool8 = brew.max_pool(model, relu8, "pool8", kernel=2, stride=2) fcix = brew.fc( model, pool8, "fcix", 512 * 7 * 7, 4096, ('XavierFill', {}), ('ConstantFill', {}) ) reluix = brew.relu(model, fcix, "fcix") fcx = brew.fc( model, reluix, "fcx", 4096, 4096, ('XavierFill', {}), ('ConstantFill', {}) ) relux = brew.relu(model, fcx, "fcx") fcxi = brew.fc( model, relux, "fcxi", 4096, 1000, ('XavierFill', {}), ('ConstantFill', {}) ) pred = brew.softmax(model, fcxi, "pred") xent = model.LabelCrossEntropy([pred, "label"], "xent") if device != 'MKL': loss = model.AveragedLoss(xent, "loss") return model, 231
def create_resnet50( model, data, num_input_channels, num_labels, label=None, is_test=False, no_loss=False, no_bias=0, conv1_kernel=7, conv1_stride=2, final_avg_kernel=7, ): # conv1 + maxpool brew.conv( model, data, 'conv1', num_input_channels, 64, weight_init=("MSRAFill", {}), kernel=conv1_kernel, stride=conv1_stride, pad=3, no_bias=no_bias ) brew.spatial_bn( model, 'conv1', 'conv1_spatbn_relu', 64, epsilon=1e-3, momentum=0.1, is_test=is_test ) brew.relu(model, 'conv1_spatbn_relu', 'conv1_spatbn_relu') brew.max_pool(model, 'conv1_spatbn_relu', 'pool1', kernel=3, stride=2) # Residual blocks... builder = ResNetBuilder(model, 'pool1', no_bias=no_bias, is_test=is_test, spatial_bn_mom=0.1) # conv2_x (ref Table 1 in He et al. (2015)) builder.add_bottleneck(64, 64, 256) builder.add_bottleneck(256, 64, 256) builder.add_bottleneck(256, 64, 256) # conv3_x builder.add_bottleneck(256, 128, 512, down_sampling=True) for _ in range(1, 4): builder.add_bottleneck(512, 128, 512) # conv4_x builder.add_bottleneck(512, 256, 1024, down_sampling=True) for _ in range(1, 6): builder.add_bottleneck(1024, 256, 1024) # conv5_x builder.add_bottleneck(1024, 512, 2048, down_sampling=True) builder.add_bottleneck(2048, 512, 2048) builder.add_bottleneck(2048, 512, 2048) # Final layers final_avg = brew.average_pool( model, builder.prev_blob, 'final_avg', kernel=final_avg_kernel, stride=1, ) # Final dimension of the "image" is reduced to 7x7 last_out = brew.fc( model, final_avg, 'last_out_L{}'.format(num_labels), 2048, num_labels ) if no_loss: return last_out # If we create model for training, use softmax-with-loss if (label is not None): (softmax, loss) = model.SoftmaxWithLoss( [last_out, label], ["softmax", "loss"], ) return (softmax, loss) else: # For inference, we just return softmax return brew.softmax(model, last_out, "softmax")
def Inception(order, cudnn_ws, device): my_arg_scope = {'order': order, 'use_cudnn': True, 'cudnn_exhaustive_search': True, 'ws_nbytes_limit': str(cudnn_ws)} model = ModelHelper(name="inception", arg_scope=my_arg_scope) conv1 = brew.conv( model, "data", "conv1", 3, 64, 7, ('XavierFill', {}), ('ConstantFill', {}), stride=2, pad=3 ) relu1 = brew.relu(model, conv1, "conv1") pool1 = brew.max_pool(model, relu1, "pool1", kernel=3, stride=2, pad=1) conv2a = brew.conv( model, pool1, "conv2a", 64, 64, 1, ('XavierFill', {}), ('ConstantFill', {}) ) conv2a = brew.relu(model, conv2a, conv2a) conv2 = brew.conv( model, conv2a, "conv2", 64, 192, 3, ('XavierFill', {}), ('ConstantFill', {}), pad=1 ) relu2 = brew.relu(model, conv2, "conv2") pool2 = brew.max_pool(model, relu2, "pool2", kernel=3, stride=2, pad=1) # Inception modules inc3 = _InceptionModule( model, pool2, 192, "inc3", 64, [96, 128], [16, 32], 32 ) inc4 = _InceptionModule( model, inc3, 256, "inc4", 128, [128, 192], [32, 96], 64 ) pool5 = brew.max_pool(model, inc4, "pool5", kernel=3, stride=2, pad=1) inc5 = _InceptionModule( model, pool5, 480, "inc5", 192, [96, 208], [16, 48], 64 ) inc6 = _InceptionModule( model, inc5, 512, "inc6", 160, [112, 224], [24, 64], 64 ) inc7 = _InceptionModule( model, inc6, 512, "inc7", 128, [128, 256], [24, 64], 64 ) inc8 = _InceptionModule( model, inc7, 512, "inc8", 112, [144, 288], [32, 64], 64 ) inc9 = _InceptionModule( model, inc8, 528, "inc9", 256, [160, 320], [32, 128], 128 ) pool9 = brew.max_pool(model, inc9, "pool9", kernel=3, stride=2, pad=1) inc10 = _InceptionModule( model, pool9, 832, "inc10", 256, [160, 320], [32, 128], 128 ) inc11 = _InceptionModule( model, inc10, 832, "inc11", 384, [192, 384], [48, 128], 128 ) pool11 = brew.average_pool(model, inc11, "pool11", kernel=7, stride=1) fc = brew.fc( model, pool11, "fc", 1024, 1000, ('XavierFill', {}), ('ConstantFill', {}) ) # It seems that Soumith's benchmark does not have softmax on top # for Inception. We will add it anyway so we can have a proper # backward pass. pred = brew.softmax(model, fc, "pred") xent = model.LabelCrossEntropy([pred, "label"], "xent") if device != 'MKL': loss = model.AveragedLoss(xent, "loss") return model, 224
def _MiniAlexNetNoDropout(self, order): # First, AlexNet using the cnn wrapper. model = model_helper.ModelHelper(name="alexnet") conv1 = brew.conv( model, "data", "conv1", 3, 16, 11, ("XavierFill", {}), ("ConstantFill", {}), stride=4, pad=0 ) relu1 = brew.relu(model, conv1, "relu1") norm1 = brew.lrn(model, relu1, "norm1", size=5, alpha=0.0001, beta=0.75) pool1 = brew.max_pool(model, norm1, "pool1", kernel=3, stride=2) conv2 = brew.group_conv( model, pool1, "conv2", 16, 32, 5, ("XavierFill", {}), ("ConstantFill", {"value": 0.1}), group=2, stride=1, pad=2 ) relu2 = brew.relu(model, conv2, "relu2") norm2 = brew.lrn(model, relu2, "norm2", size=5, alpha=0.0001, beta=0.75) pool2 = brew.max_pool(model, norm2, "pool2", kernel=3, stride=2) conv3 = brew.conv( model, pool2, "conv3", 32, 64, 3, ("XavierFill", {'std': 0.01}), ("ConstantFill", {}), pad=1 ) relu3 = brew.relu(model, conv3, "relu3") conv4 = brew.group_conv( model, relu3, "conv4", 64, 64, 3, ("XavierFill", {}), ("ConstantFill", {"value": 0.1}), group=2, pad=1 ) relu4 = brew.relu(model, conv4, "relu4") conv5 = brew.group_conv( model, relu4, "conv5", 64, 32, 3, ("XavierFill", {}), ("ConstantFill", {"value": 0.1}), group=2, pad=1 ) relu5 = brew.relu(model, conv5, "relu5") pool5 = brew.max_pool(model, relu5, "pool5", kernel=3, stride=2) fc6 = brew.fc( model, pool5, "fc6", 1152, 1024, ("XavierFill", {}), ("ConstantFill", {"value": 0.1}) ) relu6 = brew.relu(model, fc6, "relu6") fc7 = brew.fc( model, relu6, "fc7", 1024, 1024, ("XavierFill", {}), ("ConstantFill", {"value": 0.1}) ) relu7 = brew.relu(model, fc7, "relu7") fc8 = brew.fc( model, relu7, "fc8", 1024, 5, ("XavierFill", {}), ("ConstantFill", {"value": 0.0}) ) pred = brew.softmax(model, fc8, "pred") xent = model.LabelCrossEntropy([pred, "label"], "xent") loss = model.AveragedLoss([xent], ["loss"]) model.AddGradientOperators([loss]) return model