diff --git a/resnet/__init__.py b/resnet/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/resnet/cat.jpg b/resnet/cat.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..b4efc6c98b7e7bed698b10f4b7f06031267d52dd
Binary files /dev/null and b/resnet/cat.jpg differ
diff --git a/resnet/cat2.jpg b/resnet/cat2.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..4ac86b301b0fa8f9c0d7bee2dabb2ceb38b94aae
Binary files /dev/null and b/resnet/cat2.jpg differ
diff --git a/resnet/config.py b/resnet/config.py
new file mode 100644
index 0000000000000000000000000000000000000000..1b31c32f18f2e509c754e80c95e5d7b7f929e3a4
--- /dev/null
+++ b/resnet/config.py
@@ -0,0 +1,82 @@
+# This is a variable scope aware configuation object for TensorFlow
+
+import tensorflow as tf
+
+FLAGS = tf.app.flags.FLAGS
+
+class Config:
+    def __init__(self):
+        root = self.Scope('')
+        for k, v in FLAGS.__dict__['__flags'].iteritems():
+            root[k] = v
+        self.stack = [ root ]
+
+    def _pop_stale(self):
+        var_scope_name = tf.get_variable_scope().name
+        top = self.stack[0]
+        while not top.contains(var_scope_name):
+            # We aren't in this scope anymore
+            self.stack.pop(0)
+            top = self.stack[0]
+
+    def __getitem__(self, name):
+        self._pop_stale()            
+        # Recursively extract value
+        for i in range(len(self.stack)):
+            cs = self.stack[i]
+            if name in cs:
+                return cs[name]
+
+        raise KeyError(name)
+
+    def __setitem__(self, name, value):
+        self._pop_stale()            
+        top = self.stack[0]
+        var_scope_name = tf.get_variable_scope().name
+        assert top.contains(var_scope_name)
+
+        if top.name != var_scope_name:
+            top = self.Scope(var_scope_name)
+            self.stack.insert(0, top)
+
+        top[name] = value
+
+    class Scope(dict):
+        def __init__(self, name):
+            self.name = name
+
+        def contains(self, var_scope_name):
+            return var_scope_name.startswith(self.name)
+
+
+
+# Test
+if __name__ == '__main__':
+
+    def assert_raises(exception, fn):
+        try:
+            fn()
+        except exception:
+            pass
+        else:
+            assert False, "Expected exception"
+
+    c = Config()
+
+    c['hello'] = 1
+    assert c['hello'] == 1
+
+    with tf.variable_scope('foo'):
+        c['bar'] = 2
+        assert c['bar'] == 2
+        assert c['hello'] == 1
+
+        with tf.variable_scope('meow'):
+            c['dog'] = 3
+            assert c['dog'] == 3
+            assert c['bar'] == 2
+            assert c['hello'] == 1
+
+        assert_raises(KeyError, lambda: c['dog'])
+        assert c['bar'] == 2
+        assert c['hello'] == 1
diff --git a/resnet/convert.py b/resnet/convert.py
new file mode 100644
index 0000000000000000000000000000000000000000..9785993a415b6f0c38a5726818d5bf89f4f1ab06
--- /dev/null
+++ b/resnet/convert.py
@@ -0,0 +1,333 @@
+import os
+os.environ["GLOG_minloglevel"] = "2"
+import sys
+import re
+#import caffe
+import numpy as np
+import tensorflow as tf
+#import skimage.io
+#from caffe.proto import caffe_pb2
+#from synset import *
+
+import inference as resnet
+
+
+class CaffeParamProvider():
+    def __init__(self, caffe_net):
+        self.caffe_net = caffe_net
+
+    def conv_kernel(self, name):
+        k = self.caffe_net.params[name][0].data
+        # caffe      [out_channels, in_channels, filter_height, filter_width] 
+        #             0             1            2              3
+        # tensorflow [filter_height, filter_width, in_channels, out_channels]
+        #             2              3             1            0
+        return k.transpose((2, 3, 1, 0))
+        return k
+
+    def bn_gamma(self, name):
+        return self.caffe_net.params[name][0].data
+
+    def bn_beta(self, name):
+        return self.caffe_net.params[name][1].data
+
+    def bn_mean(self, name):
+        return self.caffe_net.params[name][0].data
+
+    def bn_variance(self, name):
+        return self.caffe_net.params[name][1].data
+
+    def fc_weights(self, name):
+        w = self.caffe_net.params[name][0].data
+        w = w.transpose((1, 0))
+        return w
+
+    def fc_biases(self, name):
+        b = self.caffe_net.params[name][1].data
+        return b
+
+
+def preprocess(img):
+    """Changes RGB [0,1] valued image to BGR [0,255] with mean subtracted."""
+    mean_bgr = load_mean_bgr()
+    print 'mean blue', np.mean(mean_bgr[:, :, 0])
+    print 'mean green', np.mean(mean_bgr[:, :, 1])
+    print 'mean red', np.mean(mean_bgr[:, :, 2])
+    out = np.copy(img) * 255.0
+    out = out[:, :, [2, 1, 0]]  # swap channel from RGB to BGR
+    out -= mean_bgr
+    return out
+
+
+def assert_almost_equal(caffe_tensor, tf_tensor):
+    t = tf_tensor[0]
+    c = caffe_tensor[0].transpose((1, 2, 0))
+
+    #for i in range(0, t.shape[-1]):
+    #    print "tf", i,  t[:,i]
+    #    print "caffe", i,  c[:,i]
+
+    if t.shape != c.shape:
+        print "t.shape", t.shape
+        print "c.shape", c.shape
+        sys.exit(1)
+
+    d = np.linalg.norm(t - c)
+    print "d", d
+    assert d < 500
+
+
+# returns image of shape [224, 224, 3]
+# [height, width, depth]
+def load_image(path, size=224):
+    img = skimage.io.imread(path)
+    short_edge = min(img.shape[:2])
+    yy = int((img.shape[0] - short_edge) / 2)
+    xx = int((img.shape[1] - short_edge) / 2)
+    crop_img = img[yy:yy + short_edge, xx:xx + short_edge]
+    resized_img = skimage.transform.resize(crop_img, (size, size))
+    return resized_img
+
+
+def load_mean_bgr():
+    """ bgr mean pixel value image, [0, 255]. [height, width, 3] """
+    with open("data/ResNet_mean.binaryproto", mode='rb') as f:
+        data = f.read()
+    blob = caffe_pb2.BlobProto()
+    blob.ParseFromString(data)
+
+    mean_bgr = caffe.io.blobproto_to_array(blob)[0]
+    assert mean_bgr.shape == (3, 224, 224)
+
+    return mean_bgr.transpose((1, 2, 0))
+
+
+def load_caffe(img_p, layers=50):
+    caffe.set_mode_cpu()
+
+    prototxt = "data/ResNet-%d-deploy.prototxt" % layers
+    caffemodel = "data/ResNet-%d-model.caffemodel" % layers
+    net = caffe.Net(prototxt, caffemodel, caffe.TEST)
+
+    net.blobs['data'].data[0] = img_p.transpose((2, 0, 1))
+    assert net.blobs['data'].data[0].shape == (3, 224, 224)
+    net.forward()
+
+    caffe_prob = net.blobs['prob'].data[0]
+    print_prob(caffe_prob)
+
+    return net
+
+
+# returns the top1 string
+def print_prob(prob):
+    #print prob
+    pred = np.argsort(prob)[::-1]
+
+    # Get top1 label
+    top1 = synset[pred[0]]
+    print "Top1: ", top1
+    # Get top5 label
+    top5 = [synset[pred[i]] for i in range(5)]
+    print "Top5: ", top5
+    return top1
+
+
+def parse_tf_varnames(p, tf_varname, num_layers):
+    if tf_varname == 'scale1/weights':
+        return p.conv_kernel('conv1')
+
+    elif tf_varname == 'scale1/gamma':
+        return p.bn_gamma('scale_conv1')
+
+    elif tf_varname == 'scale1/beta':
+        return p.bn_beta('scale_conv1')
+
+    elif tf_varname == 'scale1/moving_mean':
+        return p.bn_mean('bn_conv1')
+
+    elif tf_varname == 'scale1/moving_variance':
+        return p.bn_variance('bn_conv1')
+
+    elif tf_varname == 'fc/weights':
+        return p.fc_weights('fc1000')
+
+    elif tf_varname == 'fc/biases':
+        return p.fc_biases('fc1000')
+
+    # scale2/block1/shortcut/weights
+    # scale3/block2/c/moving_mean
+    # scale3/block6/c/moving_variance
+    # scale4/block3/c/moving_mean
+    # scale4/block8/a/beta
+    re1 = 'scale(\d+)/block(\d+)/(shortcut|a|b|c|A|B)'
+    m = re.search(re1, tf_varname)
+
+    def letter(i):
+        return chr(ord('a') + i - 1)
+
+    scale_num = int(m.group(1))
+
+    block_num = int(m.group(2))
+    if scale_num == 2:
+        # scale 2 always uses block letters
+        block_str = letter(block_num)
+    elif scale_num == 3 or scale_num == 4:
+        # scale 3 uses block letters for l=50 and numbered blocks for l=101, l=151
+        # scale 4 uses block letters for l=50 and numbered blocks for l=101, l=151
+        if num_layers == 50:
+            block_str = letter(block_num)
+        else:
+            if block_num == 1:
+                block_str = 'a'
+            else:
+                block_str = 'b%d' % (block_num - 1)
+    elif scale_num == 5:
+        # scale 5 always block letters
+        block_str = letter(block_num)
+    else:
+        raise ValueError("unexpected scale_num %d" % scale_num)
+
+    branch = m.group(3)
+    if branch == "shortcut":
+        branch_num = 1
+        conv_letter = ''
+    else:
+        branch_num = 2
+        conv_letter = branch.lower()
+
+    x = (scale_num, block_str, branch_num, conv_letter)
+    #print x
+
+    if 'weights' in tf_varname:
+        return p.conv_kernel('res%d%s_branch%d%s' % x)
+
+    if 'gamma' in tf_varname:
+        return p.bn_gamma('scale%d%s_branch%d%s' % x)
+
+    if 'beta' in tf_varname:
+        return p.bn_beta('scale%d%s_branch%d%s' % x)
+
+    if 'moving_mean' in tf_varname:
+        return p.bn_mean('bn%d%s_branch%d%s' % x)
+
+    if 'moving_variance' in tf_varname:
+        return p.bn_variance('bn%d%s_branch%d%s' % x)
+
+    raise ValueError('unhandled var ' + tf_varname)
+
+
+def checkpoint_fn(layers):
+    return 'ResNet-L%d.ckpt' % layers
+
+
+def meta_fn(layers):
+    return 'ResNet-L%d.meta' % layers
+
+
+def convert(graph, img, img_p, layers):
+    caffe_model = load_caffe(img_p, layers)
+
+    #for i, n in enumerate(caffe_model.params):
+    #    print n
+
+    param_provider = CaffeParamProvider(caffe_model)
+
+    if layers == 50:
+        num_blocks = [3, 4, 6, 3]
+    elif layers == 101:
+        num_blocks = [3, 4, 23, 3]
+    elif layers == 152:
+        num_blocks = [3, 8, 36, 3]
+
+    with tf.device('/cpu:0'):
+        images = tf.placeholder("float32", [None, 224, 224, 3], name="images")
+        logits = resnet.inference(images,
+                                  is_training=False,
+                                  num_blocks=num_blocks,
+                                  preprocess=True,
+                                  bottleneck=True)
+        prob = tf.nn.softmax(logits, name='prob')
+
+    # We write the metagraph first to avoid adding a bunch of
+    # assign ops that are used to set variables from caffe.
+    # The checkpoint is written to at the end.
+    tf.train.export_meta_graph(filename=meta_fn(layers))
+
+    vars_to_restore = tf.all_variables()
+    saver = tf.train.Saver(vars_to_restore)
+
+    sess = tf.Session()
+    sess.run(tf.initialize_all_variables())
+
+    assigns = []
+    for var in vars_to_restore:
+        #print var.op.name
+        data = parse_tf_varnames(param_provider, var.op.name, layers)
+        #print "caffe data shape", data.shape
+        #print "tf shape", var.get_shape()
+        assigns.append(var.assign(data))
+    sess.run(assigns)
+
+    #for op in tf.get_default_graph().get_operations():
+    #    print op.name
+
+    i = [
+        graph.get_tensor_by_name("scale1/Relu:0"),
+        graph.get_tensor_by_name("scale2/MaxPool:0"),
+        graph.get_tensor_by_name("scale2/block1/Relu:0"),
+        graph.get_tensor_by_name("scale2/block2/Relu:0"),
+        graph.get_tensor_by_name("scale2/block3/Relu:0"),
+        graph.get_tensor_by_name("scale3/block1/Relu:0"),
+        graph.get_tensor_by_name("scale5/block3/Relu:0"),
+        graph.get_tensor_by_name("avg_pool:0"),
+        graph.get_tensor_by_name("prob:0"),
+    ]
+
+    o = sess.run(i, {images: img[np.newaxis, :]})
+
+    assert_almost_equal(caffe_model.blobs['conv1'].data, o[0])
+    assert_almost_equal(caffe_model.blobs['pool1'].data, o[1])
+    assert_almost_equal(caffe_model.blobs['res2a'].data, o[2])
+    assert_almost_equal(caffe_model.blobs['res2b'].data, o[3])
+    assert_almost_equal(caffe_model.blobs['res2c'].data, o[4])
+    assert_almost_equal(caffe_model.blobs['res3a'].data, o[5])
+    assert_almost_equal(caffe_model.blobs['res5c'].data, o[6])
+    #assert_almost_equal(np.squeeze(caffe_model.blobs['pool5'].data), o[7])
+
+    print_prob(o[8][0])
+
+    prob_dist = np.linalg.norm(caffe_model.blobs['prob'].data - o[8])
+    print 'prob_dist ', prob_dist
+    assert prob_dist < 0.2  # XXX can this be tightened?
+
+    # We've already written the metagraph to avoid a bunch of assign ops.
+    saver.save(sess, checkpoint_fn(layers), write_meta_graph=False)
+
+
+def save_graph(save_path):
+    graph = tf.get_default_graph()
+    graph_def = graph.as_graph_def()
+    print "graph_def byte size", graph_def.ByteSize()
+    graph_def_s = graph_def.SerializeToString()
+
+    with open(save_path, "wb") as f:
+        f.write(graph_def_s)
+
+    print "saved model to %s" % save_path
+
+
+def main(_):
+    img = load_image("data/cat.jpg")
+    print img
+    img_p = preprocess(img)
+
+    for layers in [50, 101, 152]:
+        g = tf.Graph()
+        with g.as_default():
+            print "CONVERT", layers
+            convert(g, img, img_p, layers)
+
+
+if __name__ == '__main__':
+    tf.app.run()
diff --git a/resnet/dalmatian.jpg b/resnet/dalmatian.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..3c53adfb70065e31c2bcc503fbff99bd8434ffd0
Binary files /dev/null and b/resnet/dalmatian.jpg differ
diff --git a/resnet/inference.py b/resnet/inference.py
new file mode 100644
index 0000000000000000000000000000000000000000..0d04bd4dd93ed52bc6ea8412ec7828de700c1291
--- /dev/null
+++ b/resnet/inference.py
@@ -0,0 +1,333 @@
+# import skimage.io  # bug. need to import this before tensorflow
+# import skimage.transform  # bug. need to import this before tensorflow
+import tensorflow as tf
+from tensorflow.python.ops import control_flow_ops
+from tensorflow.python.training import moving_averages
+
+from config import Config
+
+# import datetime
+import numpy as np
+import os
+import time
+
+MOVING_AVERAGE_DECAY = 0.9997
+BN_DECAY = MOVING_AVERAGE_DECAY
+BN_EPSILON = 0.001
+CONV_WEIGHT_DECAY = 0.00004
+CONV_WEIGHT_STDDEV = 0.1
+FC_WEIGHT_DECAY = 0.00004
+FC_WEIGHT_STDDEV = 0.01
+RESNET_VARIABLES = 'resnet_variables'
+UPDATE_OPS_COLLECTION = 'resnet_update_ops'  # must be grouped with training op
+IMAGENET_MEAN_BGR = [103.062623801, 115.902882574, 123.151630838, ]
+
+tf.app.flags.DEFINE_integer('input_size', 224, "input image size")
+
+
+activation = tf.nn.relu
+
+
+def inference(x, is_training,
+              num_classes=1000,
+              num_blocks=[3, 4, 6, 3],  # defaults to 50-layer network
+              use_bias=False, # defaults to using batch norm
+              bottleneck=True):
+    c = Config()
+    c['bottleneck'] = bottleneck
+    c['is_training'] = tf.convert_to_tensor(is_training,
+                                            dtype='bool',
+                                            name='is_training')
+    c['ksize'] = 3
+    c['stride'] = 1
+    c['use_bias'] = use_bias
+    c['fc_units_out'] = num_classes
+    c['num_blocks'] = num_blocks
+    c['stack_stride'] = 2
+
+    with tf.variable_scope('scale1'):
+        c['conv_filters_out'] = 64
+        c['ksize'] = 7
+        c['stride'] = 2
+        x = conv(x, c)
+        x = bn(x, c)
+        x = activation(x)
+
+    with tf.variable_scope('scale2'):
+        x = _max_pool(x, ksize=3, stride=2)
+        c['num_blocks'] = num_blocks[0]
+        c['stack_stride'] = 1
+        c['block_filters_internal'] = 64
+        x = stack(x, c)
+
+    with tf.variable_scope('scale3'):
+        c['num_blocks'] = num_blocks[1]
+        c['block_filters_internal'] = 128
+        assert c['stack_stride'] == 2
+        x = stack(x, c)
+
+    with tf.variable_scope('scale4'):
+        c['num_blocks'] = num_blocks[2]
+        c['block_filters_internal'] = 256
+        x = stack(x, c)
+
+    with tf.variable_scope('scale5'):
+        c['num_blocks'] = num_blocks[3]
+        c['block_filters_internal'] = 512
+        x = stack(x, c)
+
+    # post-net
+    x = tf.reduce_mean(x, reduction_indices=[1, 2], name="avg_pool")
+
+    if num_classes != None:
+        with tf.variable_scope('fc'):
+            x = fc(x, c)
+
+    return x
+
+
+# This is what they use for CIFAR-10 and 100.
+# See Section 4.2 in http://arxiv.org/abs/1512.03385
+def inference_small(x,
+                    is_training,
+                    num_blocks=3, # 6n+2 total weight layers will be used.
+                    use_bias=False, # defaults to using batch norm
+                    num_classes=10):
+    c = Config()
+    c['is_training'] = tf.convert_to_tensor(is_training,
+                                            dtype='bool',
+                                            name='is_training')
+    c['use_bias'] = use_bias
+    c['fc_units_out'] = num_classes
+    c['num_blocks'] = num_blocks
+    c['num_classes'] = num_classes
+    inference_small_config(x, c)
+
+def inference_small_config(x, c):
+    c['bottleneck'] = False
+    c['ksize'] = 3
+    c['stride'] = 1
+    with tf.variable_scope('scale1'):
+        c['conv_filters_out'] = 16
+        c['block_filters_internal'] = 16
+        c['stack_stride'] = 1
+        x = conv(x, c)
+        x = bn(x, c)
+        x = activation(x)
+        x = stack(x, c)
+
+    with tf.variable_scope('scale2'):
+        c['block_filters_internal'] = 32
+        c['stack_stride'] = 2
+        x = stack(x, c)
+
+    with tf.variable_scope('scale3'):
+        c['block_filters_internal'] = 64
+        c['stack_stride'] = 2
+        x = stack(x, c)
+
+    # post-net
+    x = tf.reduce_mean(x, reduction_indices=[1, 2], name="avg_pool")
+
+    if c['num_classes'] != None:
+        with tf.variable_scope('fc'):
+            x = fc(x, c)
+
+    return x
+
+
+def _imagenet_preprocess(rgb):
+    """Changes RGB [0,1] valued image to BGR [0,255] with mean subtracted."""
+    red, green, blue = tf.split(3, 3, rgb * 255.0)
+    bgr = tf.concat(3, [blue, green, red])
+    bgr -= IMAGENET_MEAN_BGR
+    return bgr
+
+
+def loss(logits, labels):
+    cross_entropy = tf.nn.sparse_softmax_cross_entropy_with_logits(logits, labels)
+    cross_entropy_mean = tf.reduce_mean(cross_entropy)
+ 
+    regularization_losses = tf.get_collection(tf.GraphKeys.REGULARIZATION_LOSSES)
+
+    loss_ = tf.add_n([cross_entropy_mean] + regularization_losses)
+    tf.scalar_summary('loss', loss_)
+
+    return loss_
+
+
+def stack(x, c):
+    for n in range(c['num_blocks']):
+        s = c['stack_stride'] if n == 0 else 1
+        c['block_stride'] = s
+        with tf.variable_scope('block%d' % (n + 1)):
+            x = block(x, c)
+    return x
+
+
+def block(x, c):
+    filters_in = x.get_shape()[-1]
+
+    # Note: filters_out isn't how many filters are outputed. 
+    # That is the case when bottleneck=False but when bottleneck is 
+    # True, filters_internal*4 filters are outputted. filters_internal is how many filters
+    # the 3x3 convs output internally.
+    m = 4 if c['bottleneck'] else 1
+    filters_out = m * c['block_filters_internal']
+
+    shortcut = x  # branch 1
+
+    c['conv_filters_out'] = c['block_filters_internal']
+
+    if c['bottleneck']:
+        with tf.variable_scope('a'):
+            c['ksize'] = 1
+            c['stride'] = c['block_stride']
+            x = conv(x, c)
+            x = bn(x, c)
+            x = activation(x)
+
+        with tf.variable_scope('b'):
+            x = conv(x, c)
+            x = bn(x, c)
+            x = activation(x)
+
+        with tf.variable_scope('c'):
+            c['conv_filters_out'] = filters_out
+            c['ksize'] = 1
+            assert c['stride'] == 1
+            x = conv(x, c)
+            x = bn(x, c)
+    else:
+        with tf.variable_scope('A'):
+            c['stride'] = c['block_stride']
+            assert c['ksize'] == 3
+            x = conv(x, c)
+            x = bn(x, c)
+            x = activation(x)
+
+        with tf.variable_scope('B'):
+            c['conv_filters_out'] = filters_out
+            assert c['ksize'] == 3
+            assert c['stride'] == 1
+            x = conv(x, c)
+            x = bn(x, c)
+
+    with tf.variable_scope('shortcut'):
+        if filters_out != filters_in or c['block_stride'] != 1:
+            c['ksize'] = 1
+            c['stride'] = c['block_stride']
+            c['conv_filters_out'] = filters_out
+            shortcut = conv(shortcut, c)
+            shortcut = bn(shortcut, c)
+
+    return activation(x + shortcut)
+
+
+def bn(x, c):
+    x_shape = x.get_shape()
+    params_shape = x_shape[-1:]
+
+    if c['use_bias']:
+        bias = _get_variable('bias', params_shape,
+                             initializer=tf.zeros_initializer)
+        return x + bias
+
+
+    axis = list(range(len(x_shape) - 1))
+
+    beta = _get_variable('beta',
+                         params_shape,
+                         initializer=tf.zeros_initializer)
+    gamma = _get_variable('gamma',
+                          params_shape,
+                          initializer=tf.ones_initializer)
+
+    moving_mean = _get_variable('moving_mean',
+                                params_shape,
+                                initializer=tf.zeros_initializer,
+                                trainable=False)
+    moving_variance = _get_variable('moving_variance',
+                                    params_shape,
+                                    initializer=tf.ones_initializer,
+                                    trainable=False)
+
+    # These ops will only be preformed when training.
+    mean, variance = tf.nn.moments(x, axis)
+    update_moving_mean = moving_averages.assign_moving_average(moving_mean,
+                                                               mean, BN_DECAY)
+    update_moving_variance = moving_averages.assign_moving_average(
+        moving_variance, variance, BN_DECAY)
+    tf.add_to_collection(UPDATE_OPS_COLLECTION, update_moving_mean)
+    tf.add_to_collection(UPDATE_OPS_COLLECTION, update_moving_variance)
+
+    mean, variance = control_flow_ops.cond(
+        c['is_training'], lambda: (mean, variance),
+        lambda: (moving_mean, moving_variance))
+
+    x = tf.nn.batch_normalization(x, mean, variance, beta, gamma, BN_EPSILON)
+    #x.set_shape(inputs.get_shape()) ??
+
+    return x
+
+
+def fc(x, c):
+    num_units_in = x.get_shape()[1]
+    num_units_out = c['fc_units_out']
+    weights_initializer = tf.truncated_normal_initializer(
+        stddev=FC_WEIGHT_STDDEV)
+
+    weights = _get_variable('weights',
+                            shape=[num_units_in, num_units_out],
+                            initializer=weights_initializer,
+                            weight_decay=FC_WEIGHT_STDDEV)
+    biases = _get_variable('biases',
+                           shape=[num_units_out],
+                           initializer=tf.zeros_initializer)
+    x = tf.nn.xw_plus_b(x, weights, biases)
+    return x
+
+
+def _get_variable(name,
+                  shape,
+                  initializer,
+                  weight_decay=0.0,
+                  dtype='float',
+                  trainable=True):
+    "A little wrapper around tf.get_variable to do weight decay and add to"
+    "resnet collection"
+    if weight_decay > 0:
+        regularizer = tf.contrib.layers.l2_regularizer(weight_decay)
+    else:
+        regularizer = None
+    collections = [tf.GraphKeys.VARIABLES, RESNET_VARIABLES]
+    return tf.get_variable(name,
+                           shape=shape,
+                           initializer=initializer,
+                           dtype=dtype,
+                           regularizer=regularizer,
+                           collections=collections,
+                           trainable=trainable)
+
+
+def conv(x, c):
+    ksize = c['ksize']
+    stride = c['stride']
+    filters_out = c['conv_filters_out']
+
+    filters_in = x.get_shape()[-1]
+    shape = [ksize, ksize, filters_in, filters_out]
+    initializer = tf.truncated_normal_initializer(stddev=CONV_WEIGHT_STDDEV)
+    weights = _get_variable('weights',
+                            shape=shape,
+                            dtype='float',
+                            initializer=initializer,
+                            weight_decay=CONV_WEIGHT_DECAY)
+    return tf.nn.conv2d(x, weights, [1, stride, stride, 1], padding='SAME')
+
+
+def _max_pool(x, ksize=3, stride=2):
+    return tf.nn.max_pool(x,
+                          ksize=[1, ksize, ksize, 1],
+                          strides=[1, stride, stride, 1],
+                          padding='SAME')
diff --git a/resnet/schooner.jpg b/resnet/schooner.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..1c4fc32b15b54c29de9fe5d06be4801fc4ff374d
Binary files /dev/null and b/resnet/schooner.jpg differ
diff --git a/resnet/synset.py b/resnet/synset.py
new file mode 100644
index 0000000000000000000000000000000000000000..74fb9ecea052f0aca253d2f6878d8413dc836f67
--- /dev/null
+++ b/resnet/synset.py
@@ -0,0 +1,1007 @@
+synset = [
+    "n01440764 tench, Tinca tinca",
+    "n01443537 goldfish, Carassius auratus",
+    "n01484850 great white shark, white shark, man-eater, man-eating shark, Carcharodon carcharias",
+    "n01491361 tiger shark, Galeocerdo cuvieri",
+    "n01494475 hammerhead, hammerhead shark",
+    "n01496331 electric ray, crampfish, numbfish, torpedo",
+    "n01498041 stingray",
+    "n01514668 cock",
+    "n01514859 hen",
+    "n01518878 ostrich, Struthio camelus",
+    "n01530575 brambling, Fringilla montifringilla",
+    "n01531178 goldfinch, Carduelis carduelis",
+    "n01532829 house finch, linnet, Carpodacus mexicanus",
+    "n01534433 junco, snowbird",
+    "n01537544 indigo bunting, indigo finch, indigo bird, Passerina cyanea",
+    "n01558993 robin, American robin, Turdus migratorius",
+    "n01560419 bulbul",
+    "n01580077 jay",
+    "n01582220 magpie",
+    "n01592084 chickadee",
+    "n01601694 water ouzel, dipper",
+    "n01608432 kite",
+    "n01614925 bald eagle, American eagle, Haliaeetus leucocephalus",
+    "n01616318 vulture",
+    "n01622779 great grey owl, great gray owl, Strix nebulosa",
+    "n01629819 European fire salamander, Salamandra salamandra",
+    "n01630670 common newt, Triturus vulgaris",
+    "n01631663 eft",
+    "n01632458 spotted salamander, Ambystoma maculatum",
+    "n01632777 axolotl, mud puppy, Ambystoma mexicanum",
+    "n01641577 bullfrog, Rana catesbeiana",
+    "n01644373 tree frog, tree-frog",
+    "n01644900 tailed frog, bell toad, ribbed toad, tailed toad, Ascaphus trui",
+    "n01664065 loggerhead, loggerhead turtle, Caretta caretta",
+    "n01665541 leatherback turtle, leatherback, leathery turtle, Dermochelys coriacea",
+    "n01667114 mud turtle",
+    "n01667778 terrapin",
+    "n01669191 box turtle, box tortoise",
+    "n01675722 banded gecko",
+    "n01677366 common iguana, iguana, Iguana iguana",
+    "n01682714 American chameleon, anole, Anolis carolinensis",
+    "n01685808 whiptail, whiptail lizard",
+    "n01687978 agama",
+    "n01688243 frilled lizard, Chlamydosaurus kingi",
+    "n01689811 alligator lizard",
+    "n01692333 Gila monster, Heloderma suspectum",
+    "n01693334 green lizard, Lacerta viridis",
+    "n01694178 African chameleon, Chamaeleo chamaeleon",
+    "n01695060 Komodo dragon, Komodo lizard, dragon lizard, giant lizard, Varanus komodoensis",
+    "n01697457 African crocodile, Nile crocodile, Crocodylus niloticus",
+    "n01698640 American alligator, Alligator mississipiensis",
+    "n01704323 triceratops",
+    "n01728572 thunder snake, worm snake, Carphophis amoenus",
+    "n01728920 ringneck snake, ring-necked snake, ring snake",
+    "n01729322 hognose snake, puff adder, sand viper",
+    "n01729977 green snake, grass snake",
+    "n01734418 king snake, kingsnake",
+    "n01735189 garter snake, grass snake",
+    "n01737021 water snake",
+    "n01739381 vine snake",
+    "n01740131 night snake, Hypsiglena torquata",
+    "n01742172 boa constrictor, Constrictor constrictor",
+    "n01744401 rock python, rock snake, Python sebae",
+    "n01748264 Indian cobra, Naja naja",
+    "n01749939 green mamba",
+    "n01751748 sea snake",
+    "n01753488 horned viper, cerastes, sand viper, horned asp, Cerastes cornutus",
+    "n01755581 diamondback, diamondback rattlesnake, Crotalus adamanteus",
+    "n01756291 sidewinder, horned rattlesnake, Crotalus cerastes",
+    "n01768244 trilobite",
+    "n01770081 harvestman, daddy longlegs, Phalangium opilio",
+    "n01770393 scorpion",
+    "n01773157 black and gold garden spider, Argiope aurantia",
+    "n01773549 barn spider, Araneus cavaticus",
+    "n01773797 garden spider, Aranea diademata",
+    "n01774384 black widow, Latrodectus mactans",
+    "n01774750 tarantula",
+    "n01775062 wolf spider, hunting spider",
+    "n01776313 tick",
+    "n01784675 centipede",
+    "n01795545 black grouse",
+    "n01796340 ptarmigan",
+    "n01797886 ruffed grouse, partridge, Bonasa umbellus",
+    "n01798484 prairie chicken, prairie grouse, prairie fowl",
+    "n01806143 peacock",
+    "n01806567 quail",
+    "n01807496 partridge",
+    "n01817953 African grey, African gray, Psittacus erithacus",
+    "n01818515 macaw",
+    "n01819313 sulphur-crested cockatoo, Kakatoe galerita, Cacatua galerita",
+    "n01820546 lorikeet",
+    "n01824575 coucal",
+    "n01828970 bee eater",
+    "n01829413 hornbill",
+    "n01833805 hummingbird",
+    "n01843065 jacamar",
+    "n01843383 toucan",
+    "n01847000 drake",
+    "n01855032 red-breasted merganser, Mergus serrator",
+    "n01855672 goose",
+    "n01860187 black swan, Cygnus atratus",
+    "n01871265 tusker",
+    "n01872401 echidna, spiny anteater, anteater",
+    "n01873310 platypus, duckbill, duckbilled platypus, duck-billed platypus, Ornithorhynchus anatinus",
+    "n01877812 wallaby, brush kangaroo",
+    "n01882714 koala, koala bear, kangaroo bear, native bear, Phascolarctos cinereus",
+    "n01883070 wombat",
+    "n01910747 jellyfish",
+    "n01914609 sea anemone, anemone",
+    "n01917289 brain coral",
+    "n01924916 flatworm, platyhelminth",
+    "n01930112 nematode, nematode worm, roundworm",
+    "n01943899 conch",
+    "n01944390 snail",
+    "n01945685 slug",
+    "n01950731 sea slug, nudibranch",
+    "n01955084 chiton, coat-of-mail shell, sea cradle, polyplacophore",
+    "n01968897 chambered nautilus, pearly nautilus, nautilus",
+    "n01978287 Dungeness crab, Cancer magister",
+    "n01978455 rock crab, Cancer irroratus",
+    "n01980166 fiddler crab",
+    "n01981276 king crab, Alaska crab, Alaskan king crab, Alaska king crab, Paralithodes camtschatica",
+    "n01983481 American lobster, Northern lobster, Maine lobster, Homarus americanus",
+    "n01984695 spiny lobster, langouste, rock lobster, crawfish, crayfish, sea crawfish",
+    "n01985128 crayfish, crawfish, crawdad, crawdaddy",
+    "n01986214 hermit crab",
+    "n01990800 isopod",
+    "n02002556 white stork, Ciconia ciconia",
+    "n02002724 black stork, Ciconia nigra",
+    "n02006656 spoonbill",
+    "n02007558 flamingo",
+    "n02009229 little blue heron, Egretta caerulea",
+    "n02009912 American egret, great white heron, Egretta albus",
+    "n02011460 bittern",
+    "n02012849 crane",
+    "n02013706 limpkin, Aramus pictus",
+    "n02017213 European gallinule, Porphyrio porphyrio",
+    "n02018207 American coot, marsh hen, mud hen, water hen, Fulica americana",
+    "n02018795 bustard",
+    "n02025239 ruddy turnstone, Arenaria interpres",
+    "n02027492 red-backed sandpiper, dunlin, Erolia alpina",
+    "n02028035 redshank, Tringa totanus",
+    "n02033041 dowitcher",
+    "n02037110 oystercatcher, oyster catcher",
+    "n02051845 pelican",
+    "n02056570 king penguin, Aptenodytes patagonica",
+    "n02058221 albatross, mollymawk",
+    "n02066245 grey whale, gray whale, devilfish, Eschrichtius gibbosus, Eschrichtius robustus",
+    "n02071294 killer whale, killer, orca, grampus, sea wolf, Orcinus orca",
+    "n02074367 dugong, Dugong dugon",
+    "n02077923 sea lion",
+    "n02085620 Chihuahua",
+    "n02085782 Japanese spaniel",
+    "n02085936 Maltese dog, Maltese terrier, Maltese",
+    "n02086079 Pekinese, Pekingese, Peke",
+    "n02086240 Shih-Tzu",
+    "n02086646 Blenheim spaniel",
+    "n02086910 papillon",
+    "n02087046 toy terrier",
+    "n02087394 Rhodesian ridgeback",
+    "n02088094 Afghan hound, Afghan",
+    "n02088238 basset, basset hound",
+    "n02088364 beagle",
+    "n02088466 bloodhound, sleuthhound",
+    "n02088632 bluetick",
+    "n02089078 black-and-tan coonhound",
+    "n02089867 Walker hound, Walker foxhound",
+    "n02089973 English foxhound",
+    "n02090379 redbone",
+    "n02090622 borzoi, Russian wolfhound",
+    "n02090721 Irish wolfhound",
+    "n02091032 Italian greyhound",
+    "n02091134 whippet",
+    "n02091244 Ibizan hound, Ibizan Podenco",
+    "n02091467 Norwegian elkhound, elkhound",
+    "n02091635 otterhound, otter hound",
+    "n02091831 Saluki, gazelle hound",
+    "n02092002 Scottish deerhound, deerhound",
+    "n02092339 Weimaraner",
+    "n02093256 Staffordshire bullterrier, Staffordshire bull terrier",
+    "n02093428 American Staffordshire terrier, Staffordshire terrier, American pit bull terrier, pit bull terrier",
+    "n02093647 Bedlington terrier",
+    "n02093754 Border terrier",
+    "n02093859 Kerry blue terrier",
+    "n02093991 Irish terrier",
+    "n02094114 Norfolk terrier",
+    "n02094258 Norwich terrier",
+    "n02094433 Yorkshire terrier",
+    "n02095314 wire-haired fox terrier",
+    "n02095570 Lakeland terrier",
+    "n02095889 Sealyham terrier, Sealyham",
+    "n02096051 Airedale, Airedale terrier",
+    "n02096177 cairn, cairn terrier",
+    "n02096294 Australian terrier",
+    "n02096437 Dandie Dinmont, Dandie Dinmont terrier",
+    "n02096585 Boston bull, Boston terrier",
+    "n02097047 miniature schnauzer",
+    "n02097130 giant schnauzer",
+    "n02097209 standard schnauzer",
+    "n02097298 Scotch terrier, Scottish terrier, Scottie",
+    "n02097474 Tibetan terrier, chrysanthemum dog",
+    "n02097658 silky terrier, Sydney silky",
+    "n02098105 soft-coated wheaten terrier",
+    "n02098286 West Highland white terrier",
+    "n02098413 Lhasa, Lhasa apso",
+    "n02099267 flat-coated retriever",
+    "n02099429 curly-coated retriever",
+    "n02099601 golden retriever",
+    "n02099712 Labrador retriever",
+    "n02099849 Chesapeake Bay retriever",
+    "n02100236 German short-haired pointer",
+    "n02100583 vizsla, Hungarian pointer",
+    "n02100735 English setter",
+    "n02100877 Irish setter, red setter",
+    "n02101006 Gordon setter",
+    "n02101388 Brittany spaniel",
+    "n02101556 clumber, clumber spaniel",
+    "n02102040 English springer, English springer spaniel",
+    "n02102177 Welsh springer spaniel",
+    "n02102318 cocker spaniel, English cocker spaniel, cocker",
+    "n02102480 Sussex spaniel",
+    "n02102973 Irish water spaniel",
+    "n02104029 kuvasz",
+    "n02104365 schipperke",
+    "n02105056 groenendael",
+    "n02105162 malinois",
+    "n02105251 briard",
+    "n02105412 kelpie",
+    "n02105505 komondor",
+    "n02105641 Old English sheepdog, bobtail",
+    "n02105855 Shetland sheepdog, Shetland sheep dog, Shetland",
+    "n02106030 collie",
+    "n02106166 Border collie",
+    "n02106382 Bouvier des Flandres, Bouviers des Flandres",
+    "n02106550 Rottweiler",
+    "n02106662 German shepherd, German shepherd dog, German police dog, alsatian",
+    "n02107142 Doberman, Doberman pinscher",
+    "n02107312 miniature pinscher",
+    "n02107574 Greater Swiss Mountain dog",
+    "n02107683 Bernese mountain dog",
+    "n02107908 Appenzeller",
+    "n02108000 EntleBucher",
+    "n02108089 boxer",
+    "n02108422 bull mastiff",
+    "n02108551 Tibetan mastiff",
+    "n02108915 French bulldog",
+    "n02109047 Great Dane",
+    "n02109525 Saint Bernard, St Bernard",
+    "n02109961 Eskimo dog, husky",
+    "n02110063 malamute, malemute, Alaskan malamute",
+    "n02110185 Siberian husky",
+    "n02110341 dalmatian, coach dog, carriage dog",
+    "n02110627 affenpinscher, monkey pinscher, monkey dog",
+    "n02110806 basenji",
+    "n02110958 pug, pug-dog",
+    "n02111129 Leonberg",
+    "n02111277 Newfoundland, Newfoundland dog",
+    "n02111500 Great Pyrenees",
+    "n02111889 Samoyed, Samoyede",
+    "n02112018 Pomeranian",
+    "n02112137 chow, chow chow",
+    "n02112350 keeshond",
+    "n02112706 Brabancon griffon",
+    "n02113023 Pembroke, Pembroke Welsh corgi",
+    "n02113186 Cardigan, Cardigan Welsh corgi",
+    "n02113624 toy poodle",
+    "n02113712 miniature poodle",
+    "n02113799 standard poodle",
+    "n02113978 Mexican hairless",
+    "n02114367 timber wolf, grey wolf, gray wolf, Canis lupus",
+    "n02114548 white wolf, Arctic wolf, Canis lupus tundrarum",
+    "n02114712 red wolf, maned wolf, Canis rufus, Canis niger",
+    "n02114855 coyote, prairie wolf, brush wolf, Canis latrans",
+    "n02115641 dingo, warrigal, warragal, Canis dingo",
+    "n02115913 dhole, Cuon alpinus",
+    "n02116738 African hunting dog, hyena dog, Cape hunting dog, Lycaon pictus",
+    "n02117135 hyena, hyaena",
+    "n02119022 red fox, Vulpes vulpes",
+    "n02119789 kit fox, Vulpes macrotis",
+    "n02120079 Arctic fox, white fox, Alopex lagopus",
+    "n02120505 grey fox, gray fox, Urocyon cinereoargenteus",
+    "n02123045 tabby, tabby cat",
+    "n02123159 tiger cat",
+    "n02123394 Persian cat",
+    "n02123597 Siamese cat, Siamese",
+    "n02124075 Egyptian cat",
+    "n02125311 cougar, puma, catamount, mountain lion, painter, panther, Felis concolor",
+    "n02127052 lynx, catamount",
+    "n02128385 leopard, Panthera pardus",
+    "n02128757 snow leopard, ounce, Panthera uncia",
+    "n02128925 jaguar, panther, Panthera onca, Felis onca",
+    "n02129165 lion, king of beasts, Panthera leo",
+    "n02129604 tiger, Panthera tigris",
+    "n02130308 cheetah, chetah, Acinonyx jubatus",
+    "n02132136 brown bear, bruin, Ursus arctos",
+    "n02133161 American black bear, black bear, Ursus americanus, Euarctos americanus",
+    "n02134084 ice bear, polar bear, Ursus Maritimus, Thalarctos maritimus",
+    "n02134418 sloth bear, Melursus ursinus, Ursus ursinus",
+    "n02137549 mongoose",
+    "n02138441 meerkat, mierkat",
+    "n02165105 tiger beetle",
+    "n02165456 ladybug, ladybeetle, lady beetle, ladybird, ladybird beetle",
+    "n02167151 ground beetle, carabid beetle",
+    "n02168699 long-horned beetle, longicorn, longicorn beetle",
+    "n02169497 leaf beetle, chrysomelid",
+    "n02172182 dung beetle",
+    "n02174001 rhinoceros beetle",
+    "n02177972 weevil",
+    "n02190166 fly",
+    "n02206856 bee",
+    "n02219486 ant, emmet, pismire",
+    "n02226429 grasshopper, hopper",
+    "n02229544 cricket",
+    "n02231487 walking stick, walkingstick, stick insect",
+    "n02233338 cockroach, roach",
+    "n02236044 mantis, mantid",
+    "n02256656 cicada, cicala",
+    "n02259212 leafhopper",
+    "n02264363 lacewing, lacewing fly",
+    "n02268443 dragonfly, darning needle, devil's darning needle, sewing needle, snake feeder, snake doctor, mosquito hawk, skeeter hawk",
+    "n02268853 damselfly",
+    "n02276258 admiral",
+    "n02277742 ringlet, ringlet butterfly",
+    "n02279972 monarch, monarch butterfly, milkweed butterfly, Danaus plexippus",
+    "n02280649 cabbage butterfly",
+    "n02281406 sulphur butterfly, sulfur butterfly",
+    "n02281787 lycaenid, lycaenid butterfly",
+    "n02317335 starfish, sea star",
+    "n02319095 sea urchin",
+    "n02321529 sea cucumber, holothurian",
+    "n02325366 wood rabbit, cottontail, cottontail rabbit",
+    "n02326432 hare",
+    "n02328150 Angora, Angora rabbit",
+    "n02342885 hamster",
+    "n02346627 porcupine, hedgehog",
+    "n02356798 fox squirrel, eastern fox squirrel, Sciurus niger",
+    "n02361337 marmot",
+    "n02363005 beaver",
+    "n02364673 guinea pig, Cavia cobaya",
+    "n02389026 sorrel",
+    "n02391049 zebra",
+    "n02395406 hog, pig, grunter, squealer, Sus scrofa",
+    "n02396427 wild boar, boar, Sus scrofa",
+    "n02397096 warthog",
+    "n02398521 hippopotamus, hippo, river horse, Hippopotamus amphibius",
+    "n02403003 ox",
+    "n02408429 water buffalo, water ox, Asiatic buffalo, Bubalus bubalis",
+    "n02410509 bison",
+    "n02412080 ram, tup",
+    "n02415577 bighorn, bighorn sheep, cimarron, Rocky Mountain bighorn, Rocky Mountain sheep, Ovis canadensis",
+    "n02417914 ibex, Capra ibex",
+    "n02422106 hartebeest",
+    "n02422699 impala, Aepyceros melampus",
+    "n02423022 gazelle",
+    "n02437312 Arabian camel, dromedary, Camelus dromedarius",
+    "n02437616 llama",
+    "n02441942 weasel",
+    "n02442845 mink",
+    "n02443114 polecat, fitch, foulmart, foumart, Mustela putorius",
+    "n02443484 black-footed ferret, ferret, Mustela nigripes",
+    "n02444819 otter",
+    "n02445715 skunk, polecat, wood pussy",
+    "n02447366 badger",
+    "n02454379 armadillo",
+    "n02457408 three-toed sloth, ai, Bradypus tridactylus",
+    "n02480495 orangutan, orang, orangutang, Pongo pygmaeus",
+    "n02480855 gorilla, Gorilla gorilla",
+    "n02481823 chimpanzee, chimp, Pan troglodytes",
+    "n02483362 gibbon, Hylobates lar",
+    "n02483708 siamang, Hylobates syndactylus, Symphalangus syndactylus",
+    "n02484975 guenon, guenon monkey",
+    "n02486261 patas, hussar monkey, Erythrocebus patas",
+    "n02486410 baboon",
+    "n02487347 macaque",
+    "n02488291 langur",
+    "n02488702 colobus, colobus monkey",
+    "n02489166 proboscis monkey, Nasalis larvatus",
+    "n02490219 marmoset",
+    "n02492035 capuchin, ringtail, Cebus capucinus",
+    "n02492660 howler monkey, howler",
+    "n02493509 titi, titi monkey",
+    "n02493793 spider monkey, Ateles geoffroyi",
+    "n02494079 squirrel monkey, Saimiri sciureus",
+    "n02497673 Madagascar cat, ring-tailed lemur, Lemur catta",
+    "n02500267 indri, indris, Indri indri, Indri brevicaudatus",
+    "n02504013 Indian elephant, Elephas maximus",
+    "n02504458 African elephant, Loxodonta africana",
+    "n02509815 lesser panda, red panda, panda, bear cat, cat bear, Ailurus fulgens",
+    "n02510455 giant panda, panda, panda bear, coon bear, Ailuropoda melanoleuca",
+    "n02514041 barracouta, snoek",
+    "n02526121 eel",
+    "n02536864 coho, cohoe, coho salmon, blue jack, silver salmon, Oncorhynchus kisutch",
+    "n02606052 rock beauty, Holocanthus tricolor",
+    "n02607072 anemone fish",
+    "n02640242 sturgeon",
+    "n02641379 gar, garfish, garpike, billfish, Lepisosteus osseus",
+    "n02643566 lionfish",
+    "n02655020 puffer, pufferfish, blowfish, globefish",
+    "n02666196 abacus",
+    "n02667093 abaya",
+    "n02669723 academic gown, academic robe, judge's robe",
+    "n02672831 accordion, piano accordion, squeeze box",
+    "n02676566 acoustic guitar",
+    "n02687172 aircraft carrier, carrier, flattop, attack aircraft carrier",
+    "n02690373 airliner",
+    "n02692877 airship, dirigible",
+    "n02699494 altar",
+    "n02701002 ambulance",
+    "n02704792 amphibian, amphibious vehicle",
+    "n02708093 analog clock",
+    "n02727426 apiary, bee house",
+    "n02730930 apron",
+    "n02747177 ashcan, trash can, garbage can, wastebin, ash bin, ash-bin, ashbin, dustbin, trash barrel, trash bin",
+    "n02749479 assault rifle, assault gun",
+    "n02769748 backpack, back pack, knapsack, packsack, rucksack, haversack",
+    "n02776631 bakery, bakeshop, bakehouse",
+    "n02777292 balance beam, beam",
+    "n02782093 balloon",
+    "n02783161 ballpoint, ballpoint pen, ballpen, Biro",
+    "n02786058 Band Aid",
+    "n02787622 banjo",
+    "n02788148 bannister, banister, balustrade, balusters, handrail",
+    "n02790996 barbell",
+    "n02791124 barber chair",
+    "n02791270 barbershop",
+    "n02793495 barn",
+    "n02794156 barometer",
+    "n02795169 barrel, cask",
+    "n02797295 barrow, garden cart, lawn cart, wheelbarrow",
+    "n02799071 baseball",
+    "n02802426 basketball",
+    "n02804414 bassinet",
+    "n02804610 bassoon",
+    "n02807133 bathing cap, swimming cap",
+    "n02808304 bath towel",
+    "n02808440 bathtub, bathing tub, bath, tub",
+    "n02814533 beach wagon, station wagon, wagon, estate car, beach waggon, station waggon, waggon",
+    "n02814860 beacon, lighthouse, beacon light, pharos",
+    "n02815834 beaker",
+    "n02817516 bearskin, busby, shako",
+    "n02823428 beer bottle",
+    "n02823750 beer glass",
+    "n02825657 bell cote, bell cot",
+    "n02834397 bib",
+    "n02835271 bicycle-built-for-two, tandem bicycle, tandem",
+    "n02837789 bikini, two-piece",
+    "n02840245 binder, ring-binder",
+    "n02841315 binoculars, field glasses, opera glasses",
+    "n02843684 birdhouse",
+    "n02859443 boathouse",
+    "n02860847 bobsled, bobsleigh, bob",
+    "n02865351 bolo tie, bolo, bola tie, bola",
+    "n02869837 bonnet, poke bonnet",
+    "n02870880 bookcase",
+    "n02871525 bookshop, bookstore, bookstall",
+    "n02877765 bottlecap",
+    "n02879718 bow",
+    "n02883205 bow tie, bow-tie, bowtie",
+    "n02892201 brass, memorial tablet, plaque",
+    "n02892767 brassiere, bra, bandeau",
+    "n02894605 breakwater, groin, groyne, mole, bulwark, seawall, jetty",
+    "n02895154 breastplate, aegis, egis",
+    "n02906734 broom",
+    "n02909870 bucket, pail",
+    "n02910353 buckle",
+    "n02916936 bulletproof vest",
+    "n02917067 bullet train, bullet",
+    "n02927161 butcher shop, meat market",
+    "n02930766 cab, hack, taxi, taxicab",
+    "n02939185 caldron, cauldron",
+    "n02948072 candle, taper, wax light",
+    "n02950826 cannon",
+    "n02951358 canoe",
+    "n02951585 can opener, tin opener",
+    "n02963159 cardigan",
+    "n02965783 car mirror",
+    "n02966193 carousel, carrousel, merry-go-round, roundabout, whirligig",
+    "n02966687 carpenter's kit, tool kit",
+    "n02971356 carton",
+    "n02974003 car wheel",
+    "n02977058 cash machine, cash dispenser, automated teller machine, automatic teller machine, automated teller, automatic teller, ATM",
+    "n02978881 cassette",
+    "n02979186 cassette player",
+    "n02980441 castle",
+    "n02981792 catamaran",
+    "n02988304 CD player",
+    "n02992211 cello, violoncello",
+    "n02992529 cellular telephone, cellular phone, cellphone, cell, mobile phone",
+    "n02999410 chain",
+    "n03000134 chainlink fence",
+    "n03000247 chain mail, ring mail, mail, chain armor, chain armour, ring armor, ring armour",
+    "n03000684 chain saw, chainsaw",
+    "n03014705 chest",
+    "n03016953 chiffonier, commode",
+    "n03017168 chime, bell, gong",
+    "n03018349 china cabinet, china closet",
+    "n03026506 Christmas stocking",
+    "n03028079 church, church building",
+    "n03032252 cinema, movie theater, movie theatre, movie house, picture palace",
+    "n03041632 cleaver, meat cleaver, chopper",
+    "n03042490 cliff dwelling",
+    "n03045698 cloak",
+    "n03047690 clog, geta, patten, sabot",
+    "n03062245 cocktail shaker",
+    "n03063599 coffee mug",
+    "n03063689 coffeepot",
+    "n03065424 coil, spiral, volute, whorl, helix",
+    "n03075370 combination lock",
+    "n03085013 computer keyboard, keypad",
+    "n03089624 confectionery, confectionary, candy store",
+    "n03095699 container ship, containership, container vessel",
+    "n03100240 convertible",
+    "n03109150 corkscrew, bottle screw",
+    "n03110669 cornet, horn, trumpet, trump",
+    "n03124043 cowboy boot",
+    "n03124170 cowboy hat, ten-gallon hat",
+    "n03125729 cradle",
+    "n03126707 crane",
+    "n03127747 crash helmet",
+    "n03127925 crate",
+    "n03131574 crib, cot",
+    "n03133878 Crock Pot",
+    "n03134739 croquet ball",
+    "n03141823 crutch",
+    "n03146219 cuirass",
+    "n03160309 dam, dike, dyke",
+    "n03179701 desk",
+    "n03180011 desktop computer",
+    "n03187595 dial telephone, dial phone",
+    "n03188531 diaper, nappy, napkin",
+    "n03196217 digital clock",
+    "n03197337 digital watch",
+    "n03201208 dining table, board",
+    "n03207743 dishrag, dishcloth",
+    "n03207941 dishwasher, dish washer, dishwashing machine",
+    "n03208938 disk brake, disc brake",
+    "n03216828 dock, dockage, docking facility",
+    "n03218198 dogsled, dog sled, dog sleigh",
+    "n03220513 dome",
+    "n03223299 doormat, welcome mat",
+    "n03240683 drilling platform, offshore rig",
+    "n03249569 drum, membranophone, tympan",
+    "n03250847 drumstick",
+    "n03255030 dumbbell",
+    "n03259280 Dutch oven",
+    "n03271574 electric fan, blower",
+    "n03272010 electric guitar",
+    "n03272562 electric locomotive",
+    "n03290653 entertainment center",
+    "n03291819 envelope",
+    "n03297495 espresso maker",
+    "n03314780 face powder",
+    "n03325584 feather boa, boa",
+    "n03337140 file, file cabinet, filing cabinet",
+    "n03344393 fireboat",
+    "n03345487 fire engine, fire truck",
+    "n03347037 fire screen, fireguard",
+    "n03355925 flagpole, flagstaff",
+    "n03372029 flute, transverse flute",
+    "n03376595 folding chair",
+    "n03379051 football helmet",
+    "n03384352 forklift",
+    "n03388043 fountain",
+    "n03388183 fountain pen",
+    "n03388549 four-poster",
+    "n03393912 freight car",
+    "n03394916 French horn, horn",
+    "n03400231 frying pan, frypan, skillet",
+    "n03404251 fur coat",
+    "n03417042 garbage truck, dustcart",
+    "n03424325 gasmask, respirator, gas helmet",
+    "n03425413 gas pump, gasoline pump, petrol pump, island dispenser",
+    "n03443371 goblet",
+    "n03444034 go-kart",
+    "n03445777 golf ball",
+    "n03445924 golfcart, golf cart",
+    "n03447447 gondola",
+    "n03447721 gong, tam-tam",
+    "n03450230 gown",
+    "n03452741 grand piano, grand",
+    "n03457902 greenhouse, nursery, glasshouse",
+    "n03459775 grille, radiator grille",
+    "n03461385 grocery store, grocery, food market, market",
+    "n03467068 guillotine",
+    "n03476684 hair slide",
+    "n03476991 hair spray",
+    "n03478589 half track",
+    "n03481172 hammer",
+    "n03482405 hamper",
+    "n03483316 hand blower, blow dryer, blow drier, hair dryer, hair drier",
+    "n03485407 hand-held computer, hand-held microcomputer",
+    "n03485794 handkerchief, hankie, hanky, hankey",
+    "n03492542 hard disc, hard disk, fixed disk",
+    "n03494278 harmonica, mouth organ, harp, mouth harp",
+    "n03495258 harp",
+    "n03496892 harvester, reaper",
+    "n03498962 hatchet",
+    "n03527444 holster",
+    "n03529860 home theater, home theatre",
+    "n03530642 honeycomb",
+    "n03532672 hook, claw",
+    "n03534580 hoopskirt, crinoline",
+    "n03535780 horizontal bar, high bar",
+    "n03538406 horse cart, horse-cart",
+    "n03544143 hourglass",
+    "n03584254 iPod",
+    "n03584829 iron, smoothing iron",
+    "n03590841 jack-o'-lantern",
+    "n03594734 jean, blue jean, denim",
+    "n03594945 jeep, landrover",
+    "n03595614 jersey, T-shirt, tee shirt",
+    "n03598930 jigsaw puzzle",
+    "n03599486 jinrikisha, ricksha, rickshaw",
+    "n03602883 joystick",
+    "n03617480 kimono",
+    "n03623198 knee pad",
+    "n03627232 knot",
+    "n03630383 lab coat, laboratory coat",
+    "n03633091 ladle",
+    "n03637318 lampshade, lamp shade",
+    "n03642806 laptop, laptop computer",
+    "n03649909 lawn mower, mower",
+    "n03657121 lens cap, lens cover",
+    "n03658185 letter opener, paper knife, paperknife",
+    "n03661043 library",
+    "n03662601 lifeboat",
+    "n03666591 lighter, light, igniter, ignitor",
+    "n03670208 limousine, limo",
+    "n03673027 liner, ocean liner",
+    "n03676483 lipstick, lip rouge",
+    "n03680355 Loafer",
+    "n03690938 lotion",
+    "n03691459 loudspeaker, speaker, speaker unit, loudspeaker system, speaker system",
+    "n03692522 loupe, jeweler's loupe",
+    "n03697007 lumbermill, sawmill",
+    "n03706229 magnetic compass",
+    "n03709823 mailbag, postbag",
+    "n03710193 mailbox, letter box",
+    "n03710637 maillot",
+    "n03710721 maillot, tank suit",
+    "n03717622 manhole cover",
+    "n03720891 maraca",
+    "n03721384 marimba, xylophone",
+    "n03724870 mask",
+    "n03729826 matchstick",
+    "n03733131 maypole",
+    "n03733281 maze, labyrinth",
+    "n03733805 measuring cup",
+    "n03742115 medicine chest, medicine cabinet",
+    "n03743016 megalith, megalithic structure",
+    "n03759954 microphone, mike",
+    "n03761084 microwave, microwave oven",
+    "n03763968 military uniform",
+    "n03764736 milk can",
+    "n03769881 minibus",
+    "n03770439 miniskirt, mini",
+    "n03770679 minivan",
+    "n03773504 missile",
+    "n03775071 mitten",
+    "n03775546 mixing bowl",
+    "n03776460 mobile home, manufactured home",
+    "n03777568 Model T",
+    "n03777754 modem",
+    "n03781244 monastery",
+    "n03782006 monitor",
+    "n03785016 moped",
+    "n03786901 mortar",
+    "n03787032 mortarboard",
+    "n03788195 mosque",
+    "n03788365 mosquito net",
+    "n03791053 motor scooter, scooter",
+    "n03792782 mountain bike, all-terrain bike, off-roader",
+    "n03792972 mountain tent",
+    "n03793489 mouse, computer mouse",
+    "n03794056 mousetrap",
+    "n03796401 moving van",
+    "n03803284 muzzle",
+    "n03804744 nail",
+    "n03814639 neck brace",
+    "n03814906 necklace",
+    "n03825788 nipple",
+    "n03832673 notebook, notebook computer",
+    "n03837869 obelisk",
+    "n03838899 oboe, hautboy, hautbois",
+    "n03840681 ocarina, sweet potato",
+    "n03841143 odometer, hodometer, mileometer, milometer",
+    "n03843555 oil filter",
+    "n03854065 organ, pipe organ",
+    "n03857828 oscilloscope, scope, cathode-ray oscilloscope, CRO",
+    "n03866082 overskirt",
+    "n03868242 oxcart",
+    "n03868863 oxygen mask",
+    "n03871628 packet",
+    "n03873416 paddle, boat paddle",
+    "n03874293 paddlewheel, paddle wheel",
+    "n03874599 padlock",
+    "n03876231 paintbrush",
+    "n03877472 pajama, pyjama, pj's, jammies",
+    "n03877845 palace",
+    "n03884397 panpipe, pandean pipe, syrinx",
+    "n03887697 paper towel",
+    "n03888257 parachute, chute",
+    "n03888605 parallel bars, bars",
+    "n03891251 park bench",
+    "n03891332 parking meter",
+    "n03895866 passenger car, coach, carriage",
+    "n03899768 patio, terrace",
+    "n03902125 pay-phone, pay-station",
+    "n03903868 pedestal, plinth, footstall",
+    "n03908618 pencil box, pencil case",
+    "n03908714 pencil sharpener",
+    "n03916031 perfume, essence",
+    "n03920288 Petri dish",
+    "n03924679 photocopier",
+    "n03929660 pick, plectrum, plectron",
+    "n03929855 pickelhaube",
+    "n03930313 picket fence, paling",
+    "n03930630 pickup, pickup truck",
+    "n03933933 pier",
+    "n03935335 piggy bank, penny bank",
+    "n03937543 pill bottle",
+    "n03938244 pillow",
+    "n03942813 ping-pong ball",
+    "n03944341 pinwheel",
+    "n03947888 pirate, pirate ship",
+    "n03950228 pitcher, ewer",
+    "n03954731 plane, carpenter's plane, woodworking plane",
+    "n03956157 planetarium",
+    "n03958227 plastic bag",
+    "n03961711 plate rack",
+    "n03967562 plow, plough",
+    "n03970156 plunger, plumber's helper",
+    "n03976467 Polaroid camera, Polaroid Land camera",
+    "n03976657 pole",
+    "n03977966 police van, police wagon, paddy wagon, patrol wagon, wagon, black Maria",
+    "n03980874 poncho",
+    "n03982430 pool table, billiard table, snooker table",
+    "n03983396 pop bottle, soda bottle",
+    "n03991062 pot, flowerpot",
+    "n03992509 potter's wheel",
+    "n03995372 power drill",
+    "n03998194 prayer rug, prayer mat",
+    "n04004767 printer",
+    "n04005630 prison, prison house",
+    "n04008634 projectile, missile",
+    "n04009552 projector",
+    "n04019541 puck, hockey puck",
+    "n04023962 punching bag, punch bag, punching ball, punchball",
+    "n04026417 purse",
+    "n04033901 quill, quill pen",
+    "n04033995 quilt, comforter, comfort, puff",
+    "n04037443 racer, race car, racing car",
+    "n04039381 racket, racquet",
+    "n04040759 radiator",
+    "n04041544 radio, wireless",
+    "n04044716 radio telescope, radio reflector",
+    "n04049303 rain barrel",
+    "n04065272 recreational vehicle, RV, R.V.",
+    "n04067472 reel",
+    "n04069434 reflex camera",
+    "n04070727 refrigerator, icebox",
+    "n04074963 remote control, remote",
+    "n04081281 restaurant, eating house, eating place, eatery",
+    "n04086273 revolver, six-gun, six-shooter",
+    "n04090263 rifle",
+    "n04099969 rocking chair, rocker",
+    "n04111531 rotisserie",
+    "n04116512 rubber eraser, rubber, pencil eraser",
+    "n04118538 rugby ball",
+    "n04118776 rule, ruler",
+    "n04120489 running shoe",
+    "n04125021 safe",
+    "n04127249 safety pin",
+    "n04131690 saltshaker, salt shaker",
+    "n04133789 sandal",
+    "n04136333 sarong",
+    "n04141076 sax, saxophone",
+    "n04141327 scabbard",
+    "n04141975 scale, weighing machine",
+    "n04146614 school bus",
+    "n04147183 schooner",
+    "n04149813 scoreboard",
+    "n04152593 screen, CRT screen",
+    "n04153751 screw",
+    "n04154565 screwdriver",
+    "n04162706 seat belt, seatbelt",
+    "n04179913 sewing machine",
+    "n04192698 shield, buckler",
+    "n04200800 shoe shop, shoe-shop, shoe store",
+    "n04201297 shoji",
+    "n04204238 shopping basket",
+    "n04204347 shopping cart",
+    "n04208210 shovel",
+    "n04209133 shower cap",
+    "n04209239 shower curtain",
+    "n04228054 ski",
+    "n04229816 ski mask",
+    "n04235860 sleeping bag",
+    "n04238763 slide rule, slipstick",
+    "n04239074 sliding door",
+    "n04243546 slot, one-armed bandit",
+    "n04251144 snorkel",
+    "n04252077 snowmobile",
+    "n04252225 snowplow, snowplough",
+    "n04254120 soap dispenser",
+    "n04254680 soccer ball",
+    "n04254777 sock",
+    "n04258138 solar dish, solar collector, solar furnace",
+    "n04259630 sombrero",
+    "n04263257 soup bowl",
+    "n04264628 space bar",
+    "n04265275 space heater",
+    "n04266014 space shuttle",
+    "n04270147 spatula",
+    "n04273569 speedboat",
+    "n04275548 spider web, spider's web",
+    "n04277352 spindle",
+    "n04285008 sports car, sport car",
+    "n04286575 spotlight, spot",
+    "n04296562 stage",
+    "n04310018 steam locomotive",
+    "n04311004 steel arch bridge",
+    "n04311174 steel drum",
+    "n04317175 stethoscope",
+    "n04325704 stole",
+    "n04326547 stone wall",
+    "n04328186 stopwatch, stop watch",
+    "n04330267 stove",
+    "n04332243 strainer",
+    "n04335435 streetcar, tram, tramcar, trolley, trolley car",
+    "n04336792 stretcher",
+    "n04344873 studio couch, day bed",
+    "n04346328 stupa, tope",
+    "n04347754 submarine, pigboat, sub, U-boat",
+    "n04350905 suit, suit of clothes",
+    "n04355338 sundial",
+    "n04355933 sunglass",
+    "n04356056 sunglasses, dark glasses, shades",
+    "n04357314 sunscreen, sunblock, sun blocker",
+    "n04366367 suspension bridge",
+    "n04367480 swab, swob, mop",
+    "n04370456 sweatshirt",
+    "n04371430 swimming trunks, bathing trunks",
+    "n04371774 swing",
+    "n04372370 switch, electric switch, electrical switch",
+    "n04376876 syringe",
+    "n04380533 table lamp",
+    "n04389033 tank, army tank, armored combat vehicle, armoured combat vehicle",
+    "n04392985 tape player",
+    "n04398044 teapot",
+    "n04399382 teddy, teddy bear",
+    "n04404412 television, television system",
+    "n04409515 tennis ball",
+    "n04417672 thatch, thatched roof",
+    "n04418357 theater curtain, theatre curtain",
+    "n04423845 thimble",
+    "n04428191 thresher, thrasher, threshing machine",
+    "n04429376 throne",
+    "n04435653 tile roof",
+    "n04442312 toaster",
+    "n04443257 tobacco shop, tobacconist shop, tobacconist",
+    "n04447861 toilet seat",
+    "n04456115 torch",
+    "n04458633 totem pole",
+    "n04461696 tow truck, tow car, wrecker",
+    "n04462240 toyshop",
+    "n04465501 tractor",
+    "n04467665 trailer truck, tractor trailer, trucking rig, rig, articulated lorry, semi",
+    "n04476259 tray",
+    "n04479046 trench coat",
+    "n04482393 tricycle, trike, velocipede",
+    "n04483307 trimaran",
+    "n04485082 tripod",
+    "n04486054 triumphal arch",
+    "n04487081 trolleybus, trolley coach, trackless trolley",
+    "n04487394 trombone",
+    "n04493381 tub, vat",
+    "n04501370 turnstile",
+    "n04505470 typewriter keyboard",
+    "n04507155 umbrella",
+    "n04509417 unicycle, monocycle",
+    "n04515003 upright, upright piano",
+    "n04517823 vacuum, vacuum cleaner",
+    "n04522168 vase",
+    "n04523525 vault",
+    "n04525038 velvet",
+    "n04525305 vending machine",
+    "n04532106 vestment",
+    "n04532670 viaduct",
+    "n04536866 violin, fiddle",
+    "n04540053 volleyball",
+    "n04542943 waffle iron",
+    "n04548280 wall clock",
+    "n04548362 wallet, billfold, notecase, pocketbook",
+    "n04550184 wardrobe, closet, press",
+    "n04552348 warplane, military plane",
+    "n04553703 washbasin, handbasin, washbowl, lavabo, wash-hand basin",
+    "n04554684 washer, automatic washer, washing machine",
+    "n04557648 water bottle",
+    "n04560804 water jug",
+    "n04562935 water tower",
+    "n04579145 whiskey jug",
+    "n04579432 whistle",
+    "n04584207 wig",
+    "n04589890 window screen",
+    "n04590129 window shade",
+    "n04591157 Windsor tie",
+    "n04591713 wine bottle",
+    "n04592741 wing",
+    "n04596742 wok",
+    "n04597913 wooden spoon",
+    "n04599235 wool, woolen, woollen",
+    "n04604644 worm fence, snake fence, snake-rail fence, Virginia fence",
+    "n04606251 wreck",
+    "n04612504 yawl",
+    "n04613696 yurt",
+    "n06359193 web site, website, internet site, site",
+    "n06596364 comic book",
+    "n06785654 crossword puzzle, crossword",
+    "n06794110 street sign",
+    "n06874185 traffic light, traffic signal, stoplight",
+    "n07248320 book jacket, dust cover, dust jacket, dust wrapper",
+    "n07565083 menu",
+    "n07579787 plate",
+    "n07583066 guacamole",
+    "n07584110 consomme",
+    "n07590611 hot pot, hotpot",
+    "n07613480 trifle",
+    "n07614500 ice cream, icecream",
+    "n07615774 ice lolly, lolly, lollipop, popsicle",
+    "n07684084 French loaf",
+    "n07693725 bagel, beigel",
+    "n07695742 pretzel",
+    "n07697313 cheeseburger",
+    "n07697537 hotdog, hot dog, red hot",
+    "n07711569 mashed potato",
+    "n07714571 head cabbage",
+    "n07714990 broccoli",
+    "n07715103 cauliflower",
+    "n07716358 zucchini, courgette",
+    "n07716906 spaghetti squash",
+    "n07717410 acorn squash",
+    "n07717556 butternut squash",
+    "n07718472 cucumber, cuke",
+    "n07718747 artichoke, globe artichoke",
+    "n07720875 bell pepper",
+    "n07730033 cardoon",
+    "n07734744 mushroom",
+    "n07742313 Granny Smith",
+    "n07745940 strawberry",
+    "n07747607 orange",
+    "n07749582 lemon",
+    "n07753113 fig",
+    "n07753275 pineapple, ananas",
+    "n07753592 banana",
+    "n07754684 jackfruit, jak, jack",
+    "n07760859 custard apple",
+    "n07768694 pomegranate",
+    "n07802026 hay",
+    "n07831146 carbonara",
+    "n07836838 chocolate sauce, chocolate syrup",
+    "n07860988 dough",
+    "n07871810 meat loaf, meatloaf",
+    "n07873807 pizza, pizza pie",
+    "n07875152 potpie",
+    "n07880968 burrito",
+    "n07892512 red wine",
+    "n07920052 espresso",
+    "n07930864 cup",
+    "n07932039 eggnog",
+    "n09193705 alp",
+    "n09229709 bubble",
+    "n09246464 cliff, drop, drop-off",
+    "n09256479 coral reef",
+    "n09288635 geyser",
+    "n09332890 lakeside, lakeshore",
+    "n09399592 promontory, headland, head, foreland",
+    "n09421951 sandbar, sand bar",
+    "n09428293 seashore, coast, seacoast, sea-coast",
+    "n09468604 valley, vale",
+    "n09472597 volcano",
+    "n09835506 ballplayer, baseball player",
+    "n10148035 groom, bridegroom",
+    "n10565667 scuba diver",
+    "n11879895 rapeseed",
+    "n11939491 daisy",
+    "n12057211 yellow lady's slipper, yellow lady-slipper, Cypripedium calceolus, Cypripedium parviflorum",
+    "n12144580 corn",
+    "n12267677 acorn",
+    "n12620546 hip, rose hip, rosehip",
+    "n12768682 buckeye, horse chestnut, conker",
+    "n12985857 coral fungus",
+    "n12998815 agaric",
+    "n13037406 gyromitra",
+    "n13040303 stinkhorn, carrion fungus",
+    "n13044778 earthstar",
+    "n13052670 hen-of-the-woods, hen of the woods, Polyporus frondosus, Grifola frondosa",
+    "n13054560 bolete",
+    "n13133613 ear, spike, capitulum",
+    "n15075141 toilet tissue, toilet paper, bathroom tissue",
+]
+
+synset_map = {}
+for i, l in enumerate(synset):
+    label, desc = l.split(' ', 1)
+    synset_map[label] = {"index": i, "desc": desc, }
diff --git a/test_resnet_inference.py b/test_resnet_inference.py
new file mode 100644
index 0000000000000000000000000000000000000000..763ecbe2b1161ac25ed8a902917e2e2979522ce7
--- /dev/null
+++ b/test_resnet_inference.py
@@ -0,0 +1,59 @@
+import os
+import json
+import image_io
+import numpy as np
+from resnet.synset import *
+import resnet.inference as resnet_inference
+import tftools.var_collect as var_collect
+
+import tensorflow as tf
+
+
+def print_prob(prob):
+    #print prob
+    pred = np.argsort(prob)[::-1]
+
+    # Get top1 label
+    top1 = synset[pred[0]]
+    print "Top1: ", top1
+    # Get top5 label
+    top5 = [synset[pred[i]] for i in range(5)]
+    print "Top5: ", top5
+    return top1
+
+
+if __name__=='__main__':
+    model_dir = '/home/tanmay/Downloads/pretrained_networks/' + \
+                'Resnet/tensorflow-resnet-pretrained-20160509'
+    ckpt_filename = os.path.join(model_dir, 'ResNet-L50.ckpt')
+    
+    img = image_io.imread("/home/tanmay/Code/GenVQA/GenVQA/resnet/dalmatian.jpg")
+    img = image_io.imresize(img, output_size=(224,224))
+    img = img.astype(np.float32)
+    
+    sess = tf.Session()
+
+    images = tf.placeholder(tf.float32, shape=[1, 224, 224, 3], name='images')
+    logits = resnet_inference.inference(images, False)
+    prob_tensor = tf.nn.softmax(logits, name='prob')
+
+    vars_to_restore = []
+    for s in xrange(5):
+        vars_to_restore += var_collect.collect_scope('scale'+str(s+1))
+    vars_to_restore += var_collect.collect_scope('fc')
+
+    saver = tf.train.Saver(vars_to_restore)
+    saver.restore(sess, ckpt_filename)
+
+    all_vars = var_collect.collect_all()
+    vars_to_init = [var for var in all_vars if var not in vars_to_restore]
+
+    init = tf.initialize_variables(vars_to_init)
+    sess.run(init)
+
+    print "graph restored"
+
+    batch = img.reshape((1, 224, 224, 3))
+    feed_dict = {images: batch}
+    prob = sess.run(prob_tensor, feed_dict=feed_dict)
+    print_prob(prob[0])
diff --git a/tftools/var_collect.py b/tftools/var_collect.py
new file mode 100644
index 0000000000000000000000000000000000000000..3900633460f05e8cb1d9896fce78715b4c7f90a6
--- /dev/null
+++ b/tftools/var_collect.py
@@ -0,0 +1,50 @@
+import tensorflow as tf
+
+
+def print_var_list(var_list, name='Variables'):
+    print name + ': \n' + '[' + ', '.join([var.name for var in var_list]) + ']'
+
+
+def collect_name(var_name, graph=None):
+    if graph == None:
+        graph = tf.get_default_graph()
+
+    var_list = graph.get_collection(tf.GraphKeys.VARIABLES, scope=var_name)
+
+    assert_str = "No variable exists with name '{}'".format(var_name)
+    assert len(var_list) != 0, assert_str
+
+    assert_str = \
+        "Multiple variables exist with name_scope '{}'".format(var_name)
+    assert len(var_list) == 1, assert_str
+
+    return var_list[0]
+
+
+def collect_scope(name_scope, graph=None):
+    if graph == None:
+        graph = tf.get_default_graph()
+
+    var_list = graph.get_collection(tf.GraphKeys.VARIABLES, scope=name_scope)
+
+    assert_str = "No variable exists with name_scope '{}'".format(name_scope)
+    assert len(var_list) != 0, assert_str
+
+    return var_list
+
+
+def collect_all(graph=None):
+    if graph == None:
+        graph = tf.get_default_graph()
+
+    var_list = graph.get_collection(tf.GraphKeys.VARIABLES)
+
+    return var_list
+
+
+def collect_list(var_name_list, graph=None):
+    var_dict = dict()
+    for var_name in var_name_list:
+        var_dict[var_name] = collect_name(var_name, graph=graph)
+
+    return var_dict