You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@singa.apache.org by wa...@apache.org on 2017/07/13 07:01:10 UTC

[4/6] incubator-singa git commit: udpate inception_v4 for the final and aux endpoints; update the meta.yml as the protobuf binary file is not backward compatible. singa compiled on protobuf3.0 cannot run with protobuf 3.2 runtime.

udpate inception_v4 for the final and aux endpoints; update the meta.yml as the protobuf binary file is not backward compatible. singa compiled on protobuf3.0 cannot run with protobuf 3.2 runtime.


Project: http://git-wip-us.apache.org/repos/asf/incubator-singa/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-singa/commit/40124db7
Tree: http://git-wip-us.apache.org/repos/asf/incubator-singa/tree/40124db7
Diff: http://git-wip-us.apache.org/repos/asf/incubator-singa/diff/40124db7

Branch: refs/heads/master
Commit: 40124db7f6f1bb59ed33ea9b39c3fcb31b3fd02d
Parents: 59b0167
Author: wang wei <wa...@comp.nus.edu.sg>
Authored: Fri Jul 7 12:26:20 2017 +0800
Committer: wang wei <wa...@comp.nus.edu.sg>
Committed: Fri Jul 7 12:26:20 2017 +0800

----------------------------------------------------------------------
 examples/imagenet/inception/convert.py      |  23 +-
 examples/imagenet/inception/inception_v4.py | 346 +++++++++++++----------
 tool/conda/meta.yaml                        |  16 +-
 3 files changed, 222 insertions(+), 163 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-singa/blob/40124db7/examples/imagenet/inception/convert.py
----------------------------------------------------------------------
diff --git a/examples/imagenet/inception/convert.py b/examples/imagenet/inception/convert.py
index e3f5adc..c9f92e4 100644
--- a/examples/imagenet/inception/convert.py
+++ b/examples/imagenet/inception/convert.py
@@ -12,7 +12,7 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 # ==============================================================================
-"""A simple script for inspect checkpoint files."""
+"""Converting tensorflow checkpoint file to key-val pkl file."""
 from __future__ import absolute_import
 from __future__ import division
 from __future__ import print_function
@@ -25,7 +25,8 @@ import os
 import numpy as np
 from tensorflow.python import pywrap_tensorflow
 from tensorflow.python.platform import app
-import model
+import inception_v4
+import inception_v3
 
 
 FLAGS = None
@@ -38,8 +39,11 @@ def rename(name, suffix):
     return name[0:p+1] + suffix
 
 
-def convert(file_name):
-    net, _ = model.create_net()
+def convert(model, file_name):
+    if model == 'v3':
+        net, _ = inception_v3.create_net()
+    else:
+        net, _ = inception_v4.create_net()
     params = {'SINGA_VERSION': 1101}
     try:
         reader = pywrap_tensorflow.NewCheckpointReader(file_name)
@@ -61,7 +65,8 @@ def convert(file_name):
                 val = np.ones(pval.shape)
             else:
                 print('not matched param %s' % pname)
-            assert val.shape == pval.shape, ('the shapes not match ', val.shape, pval.shape)
+            assert val.shape == pval.shape, ('the shapes not match ',
+                    val.shape, pval.shape)
             params[pname] = val.astype(np.float32)
             print('converting:', pname, pval.shape)
         var_to_shape_map = reader.get_variable_to_shape_map()
@@ -103,15 +108,13 @@ def main(unused_argv):
         print("Usage: convert.py --file_name=checkpoint_file_name ")
         sys.exit(1)
     else:
-        convert(FLAGS.file_name)
+        convert(FLAGS.model, FLAGS.file_name)
 
 
 if __name__ == "__main__":
     parser = argparse.ArgumentParser()
     parser.register("type", "bool", lambda v: v.lower() == "true")
-    parser.add_argument(
-        "--file_name", type=str, default="", help="Checkpoint filename. "
-                        "Note, if using Checkpoint V2 format, file_name is the "
-                        "shared prefix between all files in the checkpoint.")
+    parser.add_argument("model", choices=['v3', 'v4'], help="inception version")
+    parser.add_argument("file_name", help="Checkpoint path")
     FLAGS, unparsed = parser.parse_known_args()
     app.run(main=main, argv=[sys.argv[0]] + unparsed)

http://git-wip-us.apache.org/repos/asf/incubator-singa/blob/40124db7/examples/imagenet/inception/inception_v4.py
----------------------------------------------------------------------
diff --git a/examples/imagenet/inception/inception_v4.py b/examples/imagenet/inception/inception_v4.py
index baab522..b641706 100644
--- a/examples/imagenet/inception/inception_v4.py
+++ b/examples/imagenet/inception/inception_v4.py
@@ -39,193 +39,245 @@ from singa import net as ffnet
 
 ffnet.verbose = True
 
-def conv2d(net, name, nb_filter, k, s=1, padding='SAME', src=None):
-    net.add(Conv2D(name, nb_filter, k, s, border_mode=padding, use_bias=False), src)
+def conv2d(net, name, nb_filter, k, s=1, border_mode='SAME', src=None):
+    net.add(Conv2D(name, nb_filter, k, s, border_mode=border_mode,
+        use_bias=False), src)
     net.add(BatchNormalization('%s/BatchNorm' % name))
     return net.add(Activation(name+'/relu'))
 
 
-def block_inception_a(name, net):
+def block_inception_a(blk, net):
     """Builds Inception-A block for Inception v4 network."""
     # By default use stride=1 and SAME padding
-    split = net.add(Split('%s/Split' % name, 4))
-    br0 = conv2d(net, '%s/Branch_0/Conv2d_0a_1x1' % name, 96, 1, src=split)
-    conv2d(net, '%s/Branch_1/Conv2d_0a_1x1' % name, 64, 1, src=split)
-    br1 = conv2d(net, '%s/Branch_1/Conv2d_0b_3x3' % name, 96, 3)
-    conv2d(net, '%s/Branch_2/Conv2d_0a_1x1' % name, 64, 1, src=split)
-    conv2d(net, '%s/Branch_2/Conv2d_0b_3x3' % name, 96, 3)
-    br2 = conv2d(net, '%s/Branch_2/Conv2d_0c_3x3' % name, 96, 3)
-    net.add(AvgPooling2D('%s/Branch_3/AvgPool_0a_3x3' % name, 3, stride=1), split)
-    br3 = conv2d(net, '%s/Branch_3/Conv2d_0b_1x1' % name, 96, 1)
-    return net.add(Concat('%s/Concat' % name, 1), [br0, br1, br2, br3])
-
-
-def block_reduction_a(name, net):
+    s = net.add(Split('%s/Split' % blk, 4))
+    br0 = conv2d(net, '%s/Branch_0/Conv2d_0a_1x1' % blk, 96, 1, src=s)
+    conv2d(net, '%s/Branch_1/Conv2d_0a_1x1' % blk, 64, 1, src=s)
+    br1 = conv2d(net, '%s/Branch_1/Conv2d_0b_3x3' % blk, 96, 3)
+    conv2d(net, '%s/Branch_2/Conv2d_0a_1x1' % blk, 64, 1, src=s)
+    conv2d(net, '%s/Branch_2/Conv2d_0b_3x3' % blk, 96, 3)
+    br2 = conv2d(net, '%s/Branch_2/Conv2d_0c_3x3' % blk, 96, 3)
+    net.add(AvgPooling2D('%s/Branch_3/AvgPool_0a_3x3' % blk, 3, stride=1), s)
+    br3 = conv2d(net, '%s/Branch_3/Conv2d_0b_1x1' % blk, 96, 1)
+    return net.add(Concat('%s/Concat' % blk, 1), [br0, br1, br2, br3])
+
+
+def block_reduction_a(blk, net):
     """Builds Reduction-A block for Inception v4 network."""
     # By default use stride=1 and SAME padding
-    split = net.add(Split('%s/Split' % name, 3))
-    br0 = conv2d(net, '%s/Branch_0/Conv2d_1a_3x3' % name, 384, 3, 2, padding='VALID', src=split)
-    conv2d(net, '%s/Branch_1/Conv2d_0a_1x1' % name, 192, 1, src=split)
-    conv2d(net, '%s/Branch_1/Conv2d_0b_3x3' % name, 224, 3)
-    br1 = conv2d(net, '%s/Branch_1/Conv2d_1a_3x3' % name, 256, 3, 2, padding='VALID')
-    br2 = net.add(MaxPooling2D('%s/Branch_2/MaxPool_1a_3x3' % name, 3, 2, border_mode='VALID'), split)
-    return net.add(Concat('%s/Concat' % name, 1), [br0, br1, br2])
-
-
-def block_inception_b(name, net):
+    s = net.add(Split('%s/Split' % blk, 3))
+    br0 = conv2d(net, '%s/Branch_0/Conv2d_1a_3x3' % blk, 384, 3, 2,
+            border_mode='VALID', src=s)
+    br1 = conv2d(net, '%s/Branch_1/Conv2d_0a_1x1' % blk, 192, 1, src=s)
+    br1 = conv2d(net, '%s/Branch_1/Conv2d_0b_3x3' % blk, 224, 3)
+    br1 = conv2d(net, '%s/Branch_1/Conv2d_1a_3x3' % blk, 256, 3, 2,
+            border_mode='VALID')
+    br2 = net.add(MaxPooling2D('%s/Branch_2/MaxPool_1a_3x3' % blk, 3, 2,
+        border_mode='VALID'), s)
+    return net.add(Concat('%s/Concat' % blk, 1), [br0, br1, br2])
+
+
+def block_inception_b(blk, net):
     """Builds Inception-B block for Inception v4 network."""
     # By default use stride=1 and SAME padding
-    split = net.add(Split('%s/Split' % name, 4))
-    br0 = conv2d(net, '%s/Branch_0/Conv2d_0a_1x1' % name, 384, 1, src=split)
-    conv2d(net, '%s/Branch_1/Conv2d_0a_1x1' % name, 192, 1, src=split)
-    conv2d(net, '%s/Branch_1/Conv2d_0b_1x7' % name, 224, (1, 7))
-    br1 = conv2d(net, '%s/Branch_1/Conv2d_0c_7x1' % name, 256, (7, 1))
-    conv2d(net, '%s/Branch_2/Conv2d_0a_1x1' % name, 192, 1, src=split)
-    conv2d(net, '%s/Branch_2/Conv2d_0b_7x1' % name, 192, (7, 1))
-    conv2d(net, '%s/Branch_2/Conv2d_0c_1x7' % name, 224, (1, 7))
-    conv2d(net, '%s/Branch_2/Conv2d_0d_7x1' % name, 224, (7, 1))
-    br2 = conv2d(net, '%s/Branch_2/Conv2d_0e_1x7' % name, 256, (1, 7))
-    net.add(AvgPooling2D('%s/Branch_3/AvgPool_0a_3x3' % name, 3, 1), split)
-    br3 = conv2d(net, '%s/Branch_3/Conv2d_0b_1x1' % name, 128, 1)
-    return net.add(Concat('%s/Concat' % name, 1), [br0, br1, br2, br3])
-
-
-def block_reduction_b(name, net):
+    s = net.add(Split('%s/Split' % blk, 4))
+    br0 = conv2d(net, '%s/Branch_0/Conv2d_0a_1x1' % blk, 384, 1, src=s)
+    br1 = conv2d(net, '%s/Branch_1/Conv2d_0a_1x1' % blk, 192, 1, src=s)
+    br1 = conv2d(net, '%s/Branch_1/Conv2d_0b_1x7' % blk, 224, (1, 7))
+    br1 = conv2d(net, '%s/Branch_1/Conv2d_0c_7x1' % blk, 256, (7, 1))
+    br2 = conv2d(net, '%s/Branch_2/Conv2d_0a_1x1' % blk, 192, 1, src=s)
+    br2 = conv2d(net, '%s/Branch_2/Conv2d_0b_7x1' % blk, 192, (7, 1))
+    br2 = conv2d(net, '%s/Branch_2/Conv2d_0c_1x7' % blk, 224, (1, 7))
+    br2 = conv2d(net, '%s/Branch_2/Conv2d_0d_7x1' % blk, 224, (7, 1))
+    br2 = conv2d(net, '%s/Branch_2/Conv2d_0e_1x7' % blk, 256, (1, 7))
+    br3 = net.add(AvgPooling2D('%s/Branch_3/AvgPool_0a_3x3' % blk, 3, 1), s)
+    br3 = conv2d(net, '%s/Branch_3/Conv2d_0b_1x1' % blk, 128, 1)
+    return net.add(Concat('%s/Concat' % blk, 1), [br0, br1, br2, br3])
+
+
+def block_reduction_b(blk, net):
     """Builds Reduction-B block for Inception v4 network."""
     # By default use stride=1 and SAME padding
-    split = net.add(Split('%s/Split', 3))
-    conv2d(net, '%s/Branch_0/Conv2d_0a_1x1' % name, 192, 1, src=split)
-    br0 = conv2d(net, '%s/Branch_0/Conv2d_1a_3x3' % name, 192, 3, 2, padding='VALID')
-    conv2d(net, '%s/Branch_1/Conv2d_0a_1x1' % name, 256, 1, src=split)
-    conv2d(net, '%s/Branch_1/Conv2d_0b_1x7' % name, 256, (1, 7))
-    conv2d(net, '%s/Branch_1/Conv2d_0c_7x1' % name, 320, (7, 1))
-    br1 = conv2d(net, '%s/Branch_1/Conv2d_1a_3x3' % name, 320, 3, 2, padding='VALID')
-    br2 = net.add(MaxPooling2D('%s/Branch_2/MaxPool_1a_3x3' % name, 3, 2, border_mode='VALID'), split)
-    return net.add(Concat('%s/Concat' % name, 1), [br0, br1, br2])
-
-
-def block_inception_c(name, net):
+    s = net.add(Split('%s/Split' % blk , 3))
+    br0 = conv2d(net, '%s/Branch_0/Conv2d_0a_1x1' % blk, 192, 1, src=s)
+    br0 = conv2d(net, '%s/Branch_0/Conv2d_1a_3x3' % blk, 192, 3, 2,
+            border_mode='VALID')
+    br1 = conv2d(net, '%s/Branch_1/Conv2d_0a_1x1' % blk, 256, 1, src=s)
+    br1 = conv2d(net, '%s/Branch_1/Conv2d_0b_1x7' % blk, 256, (1, 7))
+    br1 = conv2d(net, '%s/Branch_1/Conv2d_0c_7x1' % blk, 320, (7, 1))
+    br1 = conv2d(net, '%s/Branch_1/Conv2d_1a_3x3' % blk, 320, 3, 2,
+            border_mode='VALID')
+    br2 = net.add(MaxPooling2D('%s/Branch_2/MaxPool_1a_3x3' % blk, 3, 2,
+        border_mode='VALID'), s)
+    return net.add(Concat('%s/Concat' % blk, 1), [br0, br1, br2])
+
+
+def block_inception_c(blk, net):
     """Builds Inception-C block for Inception v4 network."""
     # By default use stride=1 and SAME padding
-    split = net.add(Split('%s/Split' % name, 4))
-    br0 = conv2d(net, '%s/Branch_0/Conv2d_0a_1x1' % name, 256, 1, src=split)
-    conv2d(net, '%s/Branch_1/Conv2d_0a_1x1' % name, 384, 1, src=split)
-    br1_split = net.add(Split('%s/Branch_1/Split' % name, 2))
-    br1_0 = conv2d(net, '%s/Branch_1/Conv2d_0b_1x3' % name, 256, (1, 3), src=br1_split)
-    br1_1 = conv2d(net, '%s/Branch_1/Conv2d_0c_3x1' % name, 256, (3, 1), src=br1_split)
-    br1 = net.add(Concat('%s/Branch_1/Concat' % name, 1), [br1_0, br1_1])
-    conv2d(net, '%s/Branch_2/Conv2d_0a_1x1' % name, 384, 1, src=split)
-    conv2d(net, '%s/Branch_2/Conv2d_0b_3x1' % name, 448, (3, 1))
-    conv2d(net, '%s/Branch_2/Conv2d_0c_1x3' % name, 512, (1, 3))
-    br2_split = net.add(Split('%s/Branch_2/Split' % name, 2))
-    br2_0 = conv2d(net, '%s/Branch_2/Conv2d_0d_1x3' % name, 256, (1, 3), src=br2_split)
-    br2_1 = conv2d(net, '%s/Branch_2/Conv2d_0e_3x1' % name, 256, (3, 1), src=br2_split)
-    br2 = net.add(Concat('%s/Branch_2/Concat' % name, 1), [br2_0, br2_1])
-    net.add(AvgPooling2D('%s/Branch_3/AvgPool_0a_3x3' % name, 3, 1), split)
-    br3 = conv2d(net, '%s/Branch_3/Conv2d_0b_1x1' % name, 256, 1)
-    return net.add(Concat('%s/Concat' % name, 1), [br0, br1, br2, br3])
-
-
-def inception_v4_base(name, sample_shape, final_endpoint='Mixed_7d', aux_name=None):
+    s = net.add(Split('%s/Split' % blk, 4))
+    br0 = conv2d(net, '%s/Branch_0/Conv2d_0a_1x1' % blk, 256, 1, src=s)
+
+    br1 = conv2d(net, '%s/Branch_1/Conv2d_0a_1x1' % blk, 384, 1, src=s)
+    br1 = net.add(Split('%s/Branch_1/Split' % blk, 2))
+    br10 = conv2d(net, '%s/Branch_1/Conv2d_0b_1x3' % blk, 256, (1, 3), src=br1)
+    br11 = conv2d(net, '%s/Branch_1/Conv2d_0c_3x1' % blk, 256, (3, 1), src=br1)
+    br1 = net.add(Concat('%s/Branch_1/Concat' % blk, 1), [br10, br11])
+
+    br2 =conv2d(net, '%s/Branch_2/Conv2d_0a_1x1' % blk, 384, 1, src=s)
+    br2 =conv2d(net, '%s/Branch_2/Conv2d_0b_3x1' % blk, 448, (3, 1))
+    br2 =conv2d(net, '%s/Branch_2/Conv2d_0c_1x3' % blk, 512, (1, 3))
+    br2 = net.add(Split('%s/Branch_2/Split' % blk, 2))
+    br20 = conv2d(net, '%s/Branch_2/Conv2d_0d_1x3' % blk, 256, (1, 3), src=br2)
+    br21 = conv2d(net, '%s/Branch_2/Conv2d_0e_3x1' % blk, 256, (3, 1), src=br2)
+    br2 = net.add(Concat('%s/Branch_2/Concat' % blk, 1), [br20, br21])
+
+    br3 = net.add(AvgPooling2D('%s/Branch_3/AvgPool_0a_3x3' % blk, 3, 1), s)
+    br3 = conv2d(net, '%s/Branch_3/Conv2d_0b_1x1' % blk, 256, 1)
+    return net.add(Concat('%s/Concat' % blk, 1), [br0, br1, br2, br3])
+
+
+def inception_v4_base(name, sample_shape, final_endpoint='Inception/Mixed_7d',
+        aux_endpoint='Inception/Mixed_6e'):
     """Creates the Inception V4 network up to the given final endpoint.
 
-    Args:
-        inputs: a 4-D tensor of size [batch_size, height, width, 3].
-        final_endpoint: specifies the endpoint to construct the network up to.
-        It can be one of [ 'Conv2d_1a_3x3', 'Conv2d_2a_3x3', 'Conv2d_2b_3x3',
+    Endpoint name list: 'InceptionV4/' +
+        ['Conv2d_1a_3x3', 'Conv2d_2a_3x3', 'Conv2d_2b_3x3',
         'Mixed_3a', 'Mixed_4a', 'Mixed_5a', 'Mixed_5b', 'Mixed_5c', 'Mixed_5d',
         'Mixed_5e', 'Mixed_6a', 'Mixed_6b', 'Mixed_6c', 'Mixed_6d', 'Mixed_6e',
         'Mixed_6f', 'Mixed_6g', 'Mixed_6h', 'Mixed_7a', 'Mixed_7b', 'Mixed_7c',
         'Mixed_7d']
 
-    Returns:
-        logits: the logits outputs of the model.
-        end_points: the set of end_points from the inception model.
+    Args:
+        inputs: a 4-D tensor of size [batch_size, height, width, 3].
+        final_endpoint: specifies the endpoint to construct the network up to.
+        aux_endpoint: for aux loss.
 
-    Raises:
-        ValueError: if final_endpoint is not set to one of the predefined values,
+    Returns:
+        the neural net
+        the last layer
+        the set of end_points from the inception model.
     """
     end_points = {}
     net = ffnet.FeedForwardNet()
-    def add_and_check_final(name, lyr):
-        end_points[name] = lyr
-        return name == final_endpoint
+    def final_aux_check(block_name):
+        if block_name == final_endpoint:
+            return True
+        if block_name == aux_endpoint:
+            aux = aux_endpoint + '-aux'
+            end_points[aux] = net.add(Split(aux, 2))
+        return False
+
 
     # 299 x 299 x 3
-    net.add(Conv2D('%s/Conv2d_1a_3x3' % name, 32, 3, 2, border_mode='VALID', use_bias=False, input_sample_shape=sample_shape))
-    net.add(BatchNormalization('%s/Conv2d_1a_3x3/BatchNorm' % name))
-    net.add(Activation('%s/Conv2d_1a_3x3/relu' % name))
+    blk = name + 'Conv2d_1a_3x3'
+    net.add(Conv2D(blk, 32, 3, 2, border_mode='VALID', use_bias=False,
+        input_sample_shape=sample_shape))
+    net.add(BatchNormalization('%s/BatchNorm' % blk))
+    end_points[blk] = net.add(Activation('%s/relu' % blk))
+    if final_aux_check(blk):
+        return net, end_points
+
     # 149 x 149 x 32
-    conv2d(net, '%s/Conv2d_2a_3x3' % name, 32, 3, padding='VALID')
+    blk = name + 'Conv2d_2a_3x3'
+    end_points[blk] = conv2d(net, '%s/Conv2d_2a_3x3' % blk, 32, 3,
+            border_mode='VALID')
+    if final_aux_check(blk):
+        return net, end_points
+
     # 147 x 147 x 32
-    conv2d(net, '%s/Conv2d_2b_3x3' % name, 64, 3)
+    blk = name + 'Conv2d_2b_3x3'
+    end_points[blk] = conv2d(net, '%s/Conv2d_2b_3x3' % blk, 64, 3)
+    if final_aux_check(blk):
+        return net, end_points
+
     # 147 x 147 x 64
-    s = net.add(Split('%s/Mixed_3a/Split' % name, 2))
-    br0 = net.add(MaxPooling2D('%s/Mixed_3a/Branch_0/MaxPool_0a_3x3' % name, 3, 2, border_mode='VALID'), s)
-    br1 = conv2d(net, '%s/Mixed_3a/Branch_1/Conv2d_0a_3x3' % name, 96, 3, 2, padding='VALID', src=s)
-    net.add(Concat('%s/Mixed_3a/Concat' % name, 1), [br0, br1])
+    blk = name + '/Mixed_3a'
+    s = net.add(Split('%s/Split' % blk, 2))
+    br0 = net.add(MaxPooling2D('%s/Branch_0/MaxPool_0a_3x3' % blk, 3,
+        2, border_mode='VALID'), s)
+    br1 = conv2d(net, '%s/Branch_1/Conv2d_0a_3x3' % blk, 96, 3, 2,
+            border_mode='VALID', src=s)
+    end_points[blk] = net.add(Concat('%s/Concat' % blk, 1), [br0, br1])
+    if final_aux_check(blk):
+        return net, end_points
 
     # 73 x 73 x 160
-    s = net.add(Split('%s/Mixed_4a/Split' % name, 2))
-    conv2d(net, '%s/Mixed_4a/Branch_0/Conv2d_0a_1x1' % name, 64, 1, src=s)
-    br0 = conv2d(net, '%s/Mixed_4a/Branch_0/Conv2d_1a_3x3' % name, 96, 3, padding='VALID')
-    conv2d(net, '%s/Mixed_4a/Branch_1/Conv2d_0a_1x1' % name, 64, 1, src=s)
-    conv2d(net, '%s/Mixed_4a/Branch_1/Conv2d_0b_1x7' % name, 64, (1, 7))
-    conv2d(net, '%s/Mixed_4a/Branch_1/Conv2d_0c_7x1' % name, 64, (7, 1))
-    br1 = conv2d(net, '%s/Mixed_4a/Branch_1/Conv2d_1a_3x3' % name, 96, 3, padding='VALID')
-    net.add(Concat('%s/Mixed_4a/Concat' % name, 1), [br0, br1])
-
-      # 71 x 71 x 192
-    s = net.add(Split('%s/Mixed_5a/Split' % name, 2))
-    br0 = conv2d(net, '%s/Mixed_5a/Branch_0/Conv2d_1a_3x3' % name, 192, 3, 2, padding='VALID', src=s)
-    br1 = net.add(MaxPooling2D('%s/Mixed_5a/Branch_1/MaxPool_1a_3x3' % name, 3, 2, border_mode='VALID'), s)
-    net.add(Concat('%s/Mixed_5a/Concat' % name, 1), [br0, br1])
+    blk = name + '/Mixed_4a'
+    s = net.add(Split('%s/Split' % blk, 2))
+    br0 = conv2d(net, '%s/Branch_0/Conv2d_0a_1x1' % blk, 64, 1, src=s)
+    br0 = conv2d(net, '%s/Branch_0/Conv2d_1a_3x3' % blk, 96, 3,
+            border_mode='VALID')
+    br1 = conv2d(net, '%s/Branch_1/Conv2d_0a_1x1' % blk, 64, 1, src=s)
+    br1 = conv2d(net, '%s/Branch_1/Conv2d_0b_1x7' % blk, 64, (1, 7))
+    br1 = conv2d(net, '%s/Branch_1/Conv2d_0c_7x1' % blk, 64, (7, 1))
+    br1 = conv2d(net, '%s/Branch_1/Conv2d_1a_3x3' % blk, 96, 3,
+            border_mode='VALID')
+    end_points[blk] = net.add(Concat('%s/Concat' % blk, 1), [br0, br1])
+    if final_aux_check(blk):
+        return net, end_points
+
+    # 71 x 71 x 192
+    blk = name + '/Mixed_5a'
+    s = net.add(Split('%s/Split' % blk, 2))
+    br0 = conv2d(net, '%s/Branch_0/Conv2d_1a_3x3' % blk, 192, 3, 2,
+            border_mode='VALID', src=s)
+    br1 = net.add(MaxPooling2D('%s/Branch_1/MaxPool_1a_3x3' % blk, 3,
+        2, border_mode='VALID'), s)
+    end_points[blk] = net.add(Concat('%s/Concat' % blk, 1), [br0, br1])
+    if final_aux_check(blk):
+        return net, end_points
 
     # 35 x 35 x 384
     # 4 x Inception-A blocks
     for idx in range(4):
-        block_scope = name + '/Mixed_5' + chr(ord('b') + idx)
-        lyr = block_inception_a(block_scope, net)
-        if add_and_check_final(block_scope, lyr): return net, lyr, end_points
+        blk = name + '/Mixed_5' + chr(ord('b') + idx)
+        end_points[blk] = block_inception_a(blk, net)
+        if final_aux_check(blk):
+            return net, end_points
 
     # 35 x 35 x 384
     # Reduction-A block
-    block_reduction_a(name + '/Mixed_6a', net)
+    blk = name + '/Mixed_6a'
+    end_points[blk] = block_reduction_a(blk, net)
+    if final_aux_check(blk):
+        return net, end_points[blk], end_points
 
     # 17 x 17 x 1024
     # 7 x Inception-B blocks
     for idx in range(7):
-        block_scope = name + '/Mixed_6' + chr(ord('b') + idx)
-        lyr = block_inception_b(block_scope, net)
-        if add_and_check_final(block_scope, lyr): return net, lyr, end_points
-        if block_scope == aux_name:
-            end_points[aux_name] = net.add(Split('%s/Split' % block_scope, 2))
+        blk = name + '/Mixed_6' + chr(ord('b') + idx)
+        end_points[blk] = block_inception_b(blk, net)
+        if final_aux_check(blk):
+            return net, end_points
 
     # 17 x 17 x 1024
     # Reduction-B block
-    block_reduction_b(name + '/Mixed_7a', net)
+    blk = name + '/Mixed_7a'
+    end_points[blk] = block_reduction_b(blk, net)
+    if final_aux_check(blk):
+        return net, end_points
 
     # 8 x 8 x 1536
     # 3 x Inception-C blocks
     for idx in range(3):
-        block_scope = name + '/Mixed_7' + chr(ord('b') + idx)
-        lyr = block_inception_c(block_scope, net)
-        if add_and_check_final(block_scope, lyr): return net, lyr, end_points
-        if block_scope == aux_name:
-            end_points[aux_name] = net.add(Split('%s/Split' % block_scope, 2))
-    return net, lyr, end_points
+        blk = name + '/Mixed_7' + chr(ord('b') + idx)
+        end_points[blk] = block_inception_c(blk, net)
+        if final_aux_check(blk):
+            return net, end_points
+
+    return net, end_points
 
 
-def create_net(num_classes=1001, sample_shape=(3, 299, 299), is_training=True, dropout_keep_prob=0.8, create_aux_logits=True):
+def create_net(num_classes=1001, sample_shape=(3, 299, 299), is_training=True,
+        dropout_keep_prob=0.8, final_endpoint='InceptionV4/Mixed_7d',
+        aux_endpoint='InceptionV4/Mixed_6e'):
     """Creates the Inception V4 model.
 
     Args:
         num_classes: number of predicted classes.
         is_training: whether is training or not.
         dropout_keep_prob: float, the fraction to keep before final layer.
-        reuse: whether or not the network and its variables should be reused. To be
-        able to reuse 'scope' must be given.
-        create_aux_logits: Whether to include the auxiliary logits.
+        final_endpoint, aux_endpoint: refer to inception_v4_base()
 
     Returns:
         logits: the logits outputs of the model.
@@ -233,29 +285,33 @@ def create_net(num_classes=1001, sample_shape=(3, 299, 299), is_training=True, d
     """
     end_points = {}
     name = 'InceptionV4'
-    if is_training and create_aux_logits:
-        aux_name = name + '/Mixed_6h'
-    else:
-        aux_name = None
-    net, last_layer, end_points = inception_v4_base(name, sample_shape, aux_name=aux_name)
+    net, end_points = inception_v4_base(name, sample_shape,
+            final_endpoint=final_endpoint, aux_endpoint=aux_endpoint)
     # Auxiliary Head logits
-    if aux_name is not None:
+    if aux_endpoint is not None:
         # 17 x 17 x 1024
-        aux_logits = end_points[aux_name]
-        net.add(AvgPooling2D('%s/AuxLogits/AvgPool_1a_5x5' % name, 5, stride=3, border_mode='VALID'), aux_logits)
-        t = conv2d(net, '%s/AuxLogits/Conv2d_1b_1x1' % name, 128, 1)
-        conv2d(net, '%s/AuxLogits/Conv2d_2a' % name, 768, t.get_output_sample_shape()[1:3], padding='VALID')
-        net.add(Flatten('%s/AuxLogits/flat' % name))
-        end_points['AuxLogits'] = net.add(Dense('%s/AuxLogits/Aux_logits' % name, num_classes))
+        aux_logits = end_points[aux_endpoint + '-aux']
+        blk = 'AuxLogits'
+        net.add(AvgPooling2D('%s/AvgPool_1a_5x5' % blk, 5, stride=3,
+            border_mode='VALID'), aux_logits)
+        t = conv2d(net, '%s/Conv2d_1b_1x1' % blk, 128, 1)
+        conv2d(net, '%s/Conv2d_2a' % blk, 768,
+                t.get_output_sample_shape()[1:3], border_mode='VALID')
+        net.add(Flatten('%s/flat' % blk))
+        end_points[blk] = net.add(Dense('%s/Aux_logits' % blk, num_classes))
 
     # Final pooling and prediction
     # 8 x 8 x 1536
-    net.add(AvgPooling2D('%s/Logits/AvgPool_1a' % name, last_layer.get_output_sample_shape()[1:3], border_mode='VALID'), last_layer)
+    blk = 'Logits'
+    last_layer = end_points[final_endpoint]
+    net.add(AvgPooling2D('%s/AvgPool_1a' % blk,
+        last_layer.get_output_sample_shape()[1:3], border_mode='VALID'),
+        last_layer)
     # 1 x 1 x 1536
-    net.add(Dropout('%s/Logits/Dropout_1b' % name, 1 - dropout_keep_prob))
-    net.add(Flatten('%s/Logits/PreLogitsFlatten' % name))
+    net.add(Dropout('%s/Dropout_1b' % blk, 1 - dropout_keep_prob))
+    net.add(Flatten('%s/PreLogitsFlatten' % blk))
     # 1536
-    end_points['Logits'] = net.add(Dense('%s/Logits/Logits' % name, num_classes))
+    end_points[blk] = net.add(Dense('%s/Logits' % blk, num_classes))
     return net, end_points
 
 

http://git-wip-us.apache.org/repos/asf/incubator-singa/blob/40124db7/tool/conda/meta.yaml
----------------------------------------------------------------------
diff --git a/tool/conda/meta.yaml b/tool/conda/meta.yaml
index ee3aa7a..f0b6dd0 100644
--- a/tool/conda/meta.yaml
+++ b/tool/conda/meta.yaml
@@ -15,26 +15,26 @@ build:
 
 requirements:
   build:
-    - python 2.7*
-    - numpy 1.12.0
     - swig 3.0.2
     - openblas 0.2.18
-    - protobuf 3.0.0
+    - protobuf 3.2.0
     - glog 0.3.4
     - libgfortran 3.0.0 # [osx]
     - gcc 4.8.5 # [linux]
+    - python 2.7*
+    - numpy 1.12.0
 
   run:
+    - openblas 0.2.18
+    - protobuf 3.2.0
+    - glog 0.3.4
+    - libgfortran 3.0.0 # [osx]
+    - libgcc 4.8.5 # [linux]
     - python 2.7*
     - numpy >=1.12.0
-    - protobuf >=3.0.0
-    - glog >=0.3.4
-    - openblas >=0.2.18
     - flask >=0.10.1
     - flask-cors >=3.0.2
     - pillow >=2.3.0
-    - libgfortran >=3.0.0 # [osx]
-    - libgcc 4.8.5 # [linux]
 
 test:
   source_files: