def test_concatenate(): x1 = sym.Variable("x", shape=(10, 20)) x2 = sym.Variable("y", shape=(10, 30)) z = sym.concatenate(x1, x2, name="concat") g, ldict = correct_layout(z, {"x": "HW", "y": "HW"}) assert (ldict["x"][0] == "HW") assert (ldict["y"][0] == "HW") assert (ldict["concat"][0] == "HW") # second pass will insert layout transform _, ldict = correct_layout(g, {"x": "HW16w", "y": "HW16w"}) assert (ldict["x"][0] == "HW16w") assert (ldict["y"][0] == "HW16w") assert (ldict["concat"][0] == "HW16w") x1 = sym.Variable("x", shape=(10, 20, 60)) x2 = sym.Variable("y", shape=(10, 20, 40)) z = sym.concatenate(x1, x2, axis=2, name="concat") g, ldict = correct_layout(z, {"x": "H20wW", "y": "H20wW"}) assert (ldict["x"][0] == "H20wW") assert (ldict["y"][0] == "H20wW") assert (ldict["concat"][0] == "H20wW") # second pass will insert layout transform _, ldict = correct_layout(g, {"x": "HW", "y": "HW"}) assert (ldict["x_H20wW"][0] == "H20wW") assert (ldict["x_H20wW"][0] == "H20wW") assert (ldict["concat"][0] == "H20wW")
def test_concatenate(): x1 = sym.Variable("x", shape=(10, 20)) x2 = sym.Variable("y", shape=(10, 30)) z = sym.concatenate(x1, x2, name="concat") g, ldict = correct_layout(z, {"x": "HW", "y": "HW"}) assert(ldict["x"][0] == "HW") assert(ldict["y"][0] == "HW") assert(ldict["concat"][0] == "HW") # second pass will insert layout transform _, ldict = correct_layout(g, {"x": "HW16w", "y": "HW16w"}) assert(ldict["x"][0] == "HW16w") assert(ldict["y"][0] == "HW16w") assert(ldict["concat"][0] == "HW16w") x1 = sym.Variable("x", shape=(10, 20, 60)) x2 = sym.Variable("y", shape=(10, 20, 40)) z = sym.concatenate(x1, x2, axis=2, name="concat") g, ldict = correct_layout(z, {"x": "H20wW", "y": "H20wW"}) assert(ldict["x"][0] == "H20wW") assert(ldict["y"][0] == "H20wW") assert(ldict["concat"][0] == "H20wW") # second pass will insert layout transform _, ldict = correct_layout(g, {"x": "HW", "y": "HW"}) assert(ldict["x_H20wW"][0] == "H20wW") assert(ldict["x_H20wW"][0] == "H20wW") assert(ldict["concat"][0] == "H20wW")
def test_concatenate(): x1 = sym.Variable("x", shape=(10, 20)) x2 = sym.Variable("y", shape=(10, 30)) z = sym.concatenate(x1, x2, name="concat") sdict = infer_shape(z) assert(sdict["concat"][0] == [10, 50]) z = sym.concatenate(x1, x1, axis=0, name="concat") sdict = infer_shape(z) assert(sdict["concat"][0] == [20, 20])
def test_concatenate_conv2d(): ch = 3 size = 8 data = sym.Variable(name="data") concat = sym.concatenate(data, data, axis=1) conv = sym.conv2d(data=concat, kernel_size=(1, 1), channels=ch * 2, use_bias=False, name="conv") net = sym.elemwise_add(concat, conv) dtype = "float32" dshape = (1, ch, size, size) kshape = (ch * 2, ch * 2, 1, 1) oshape = (1, ch * 2, size, size) shape_dict = {"data": dshape} for target, ctx in ctx_list(): graph, lib, _ = nnvm.compiler.build(net, target, shape_dict) # data, conv weight, conv op, concat assert graph.index.num_nodes == 4 data = tvm.nd.array(np.random.uniform(size=dshape).astype(dtype)) kernel = tvm.nd.array(np.random.uniform(size=kshape).astype(dtype)) m = graph_runtime.create(graph, lib, ctx) m.run(data=data, conv_weight=kernel) # get output out = m.get_output(0, tvm.nd.empty(oshape, dtype)) concat = np.concatenate((data.asnumpy(), data.asnumpy()), axis=1) conv = topi.testing.conv2d_nchw_python(concat, kernel.asnumpy(), (1, 1), 'SAME') ref = concat + conv np.testing.assert_allclose(out.asnumpy(), ref, rtol=1e-5)
def test_concatenate_conv2d(): ch = 3 size = 8 data = sym.Variable(name="data") concat = sym.concatenate(data, data, axis=1) conv = sym.conv2d(data=concat, kernel_size=(1,1), channels=ch*2, use_bias=False, name="conv") net = sym.elemwise_add(concat, conv) dtype="float32" dshape = (1, ch, size, size) kshape = (ch*2, ch*2, 1, 1) oshape = (1, ch*2, size, size) shape_dict = {"data": dshape} for target, ctx in ctx_list(): graph, lib, _ = nnvm.compiler.build(net, target, shape_dict) # data, conv weight, conv op, concat assert graph.index.num_nodes == 4 data = tvm.nd.array(np.random.uniform(size=dshape).astype(dtype)) kernel = tvm.nd.array(np.random.uniform(size=kshape).astype(dtype)) m = graph_runtime.create(graph, lib, ctx) m.run(data=data, conv_weight=kernel) # get output out = m.get_output(0, tvm.nd.empty(oshape, dtype)) concat = np.concatenate((data.asnumpy(), data.asnumpy()), axis=1) conv = topi.testing.conv2d_nchw_python( concat, kernel.asnumpy(), (1,1), 'SAME') ref = concat + conv tvm.testing.assert_allclose(out.asnumpy(), ref, rtol=1e-5)
def verify_concatenate(ishape, axis): x = [sym.Variable("x%d" % i, shape=ishape[i]) for i in range(len(ishape))] y = sym.concatenate(*x, axis=axis) + 1 def forward(**kwargs): return np.concatenate(list(kwargs.values()), axis=axis) + 1 check_function(y, forward)
def _make_fire(net, squeeze_channels, expand1x1_channels, expand3x3_channels): net = _make_fire_conv(net, squeeze_channels, 1, 0) left = _make_fire_conv(net, expand1x1_channels, 1, 0) right = _make_fire_conv(net, expand3x3_channels, 3, 1) # NOTE : Assume NCHW layout here net = sym.concatenate(left, right, axis=1) return net
def test_concatenate_split(): x = sym.Variable('x') y = sym.Variable('y') y = sym.concatenate(x, y) assert y.list_input_names() == ['x', 'y'] z = sym.split(y, indices_or_sections=10) assert len(z.list_output_names()) == 10 z = sym.split(y, indices_or_sections=[10, 20]) assert len(z.list_output_names()) == 3
def verify_concatenate(ishape, axis): x = [sym.Variable("x%d" % i) for i in range(len(ishape))] y = sym.concatenate(*x, axis=axis) + 1 def forward(**kwargs): return np.concatenate(tuple(kwargs.values()), axis=axis) + 1 dtype = "float32" inputs = dict(("x%d" % i, (ishape[i], )) for (i, input) in enumerate(x)) helper(y, inputs, dtype, forward)
def Inception7A(data, num_1x1, num_3x3_red, num_3x3_1, num_3x3_2, num_5x5_red, num_5x5, pool, proj, name): # num_1x1 = 64 # num_3x3_red = 64 # num_3x3_1 = 96 # num_3x3_2 = 96 # num_5x5_red = 48 # num_5x5 = 64 tower_1x1 = Conv(data, num_1x1, name=('%s_conv' % name)) tower_5x5 = Conv(data, num_5x5_red, name=('%s_tower' % name), suffix='_conv') tower_5x5 = Conv(tower_5x5, num_5x5, kernel=(5, 5), pad=(2, 2), name=('%s_tower' % name), suffix='_conv_1') tower_3x3 = Conv(data, num_3x3_red, name=('%s_tower_1' % name), suffix="_conv") tower_3x3 = Conv(tower_3x3, num_3x3_1, kernel=(3, 3), pad=(1, 1), name=('%s_tower_1' % name), suffix='_conv_1') tower_3x3 = Conv(tower_3x3, num_3x3_2, kernel=(3, 3), pad=(1, 1), name=('%s_tower_1' % name), suffix='_conv_2') pooling = Pooling(data, kernel=(3, 3), stride=(1, 1), pad=(1, 1), pool_type=pool, name=('%s_pool_%s_pool' % (pool, name))) cproj = Conv(pooling, proj, name=('%s_tower_2' % name), suffix='_conv') concat = sym.concatenate(*[tower_1x1, tower_5x5, tower_3x3, cproj], axis=3, name='ch_concat_%s_chconcat' % name) return concat
def Inception7D(data, num_3x3_red, num_3x3, num_d7_3x3_red, num_d7_1, num_d7_2, num_d7_3x3, pool, name): tower_3x3 = Conv(data=data, num_filter=num_3x3_red, name=('%s_tower' % name), suffix='_conv') tower_3x3 = Conv(data=tower_3x3, num_filter=num_3x3, kernel=(3, 3), pad=(0, 0), stride=(2, 2), name=('%s_tower' % name), suffix='_conv_1') tower_d7_3x3 = Conv(data=data, num_filter=num_d7_3x3_red, name=('%s_tower_1' % name), suffix='_conv') tower_d7_3x3 = Conv(data=tower_d7_3x3, num_filter=num_d7_1, kernel=(1, 7), pad=(0, 3), name=('%s_tower_1' % name), suffix='_conv_1') tower_d7_3x3 = Conv(data=tower_d7_3x3, num_filter=num_d7_2, kernel=(7, 1), pad=(3, 0), name=('%s_tower_1' % name), suffix='_conv_2') tower_d7_3x3 = Conv(data=tower_d7_3x3, num_filter=num_d7_3x3, kernel=(3, 3), stride=(2, 2), name=('%s_tower_1' % name), suffix='_conv_3') pooling = Pooling(data=data, kernel=(3, 3), stride=(2, 2), pool_type=pool, pad=(0, 0), name=('%s_pool_%s_pool' % (pool, name))) concat = sym.concatenate(*[tower_3x3, tower_d7_3x3, pooling], axis=3, name='ch_concat_%s_chconcat' % name) return concat
def verify_concatenate(ishape, axis): x = [sym.Variable("x%d" % i) for i in range(len(ishape))] y = sym.concatenate(*x, axis=axis) + 1 dtype = "float32" for target, ctx in ctx_list(): # set input data = [] for i, shape in enumerate(ishape): data.append(np.random.uniform(size=shape).astype(dtype)) pdict = {"x%d" % i: v for i, v in enumerate(data)} shape = {"x%d" % i: v.shape for i, v in enumerate(data)} graph, lib, _ = nnvm.compiler.build(y, target, shape) m = graph_runtime.create(graph, lib, ctx) m.run(**pdict) out_np = np.concatenate(data, axis=axis) + 1 out = m.get_output(0, tvm.nd.empty(out_np.shape)) np.testing.assert_allclose(out.asnumpy(), out_np, atol=1e-5, rtol=1e-5)
def verify_concatenate(ishape, axis): x = [sym.Variable("x%d" % i) for i in range(len(ishape))] y = sym.concatenate(*x, axis=axis) + 1 dtype = "float32" for target, ctx in ctx_list(): # set input data = [] for i, shape in enumerate(ishape): data.append(np.random.uniform(size=shape).astype(dtype)) pdict = {"x%d" % i : v for i, v in enumerate(data)} shape = {"x%d" % i : v.shape for i, v in enumerate(data)} graph, lib, _ = nnvm.compiler.build(y, target, shape) m = graph_runtime.create(graph, lib, ctx) m.run(**pdict) out_np = np.concatenate(data, axis=axis) + 1 out = m.get_output(0, tvm.nd.empty(out_np.shape)) np.testing.assert_allclose(out.asnumpy(), out_np, atol=1e-5, rtol=1e-5)
def test1(): in_shape = [3, 3, 3] out_shape = [3, 3, 3, 2] data = { "x": np.arange(np.prod(in_shape), dtype=np.float32).reshape(in_shape), "y": np.arange(np.prod(in_shape), dtype=np.float32).reshape(in_shape) } axis = -4 x = sym.Variable("x") y = sym.Variable("y") x = sym.expand_dims(x, axis=axis, num_newaxis=1) # sym.elemwise_add(x,y) y = sym.expand_dims(y, axis=axis, num_newaxis=1) # sym.elemwise_add(x,y) z = sym.concatenate(x, y, axis=-4) nnvm_graph = nnvm.graph.create(z) print('Got NNVM graph') print(nnvm_graph.json()) in_shapes_dict = {n: list(np.shape(v)) for n, v in data.items()} tvm_graph, lib, params = nnvm.compiler.build(nnvm_graph, 'llvm', in_shapes_dict) print('Got TVM graph') ctx = tvm.cpu(0) graph_module = graph_runtime.create(tvm_graph, lib, ctx) print('Got graph module') print(tvm_graph.__dir__()) print(tvm_graph.json()) for name, value in data.items(): graph_module.set_input(name, value) graph_module.run() out_value = graph_module.get_output(0, tvm.nd.empty((out_shape), 'float32')) # print('Inputs:\nX:', data["x"], "\nY:", data["y"]) print('Output value:', type(out_value), '\nShape:', out_value.shape, '\nO:', out_value)
def Inception7B(data, num_3x3, num_d3x3_red, num_d3x3_1, num_d3x3_2, pool, name): tower_3x3 = Conv(data, num_3x3, kernel=(3, 3), pad=(0, 0), stride=(2, 2), name=('%s_conv' % name)) tower_d3x3 = Conv(data, num_d3x3_red, name=('%s_tower' % name), suffix='_conv') tower_d3x3 = Conv(tower_d3x3, num_d3x3_1, kernel=(3, 3), pad=(1, 1), stride=(1, 1), name=('%s_tower' % name), suffix='_conv_1') tower_d3x3 = Conv(tower_d3x3, num_d3x3_2, kernel=(3, 3), pad=(0, 0), stride=(2, 2), name=('%s_tower' % name), suffix='_conv_2') pooling = Pooling(data=data, kernel=(3, 3), stride=(2, 2), pad=(0, 0), pool_type="max", name=('max_pool_%s_pool' % name)) concat = sym.concatenate(*[tower_3x3, tower_d3x3, pooling], axis=3, name='ch_concat_%s_chconcat' % name) return concat
def test_alter_conv2d_layout(): data = sym.Variable("data", shape=(1, 32, 512, 512)) conv = sym.conv2d(data, name="conv", channels=16, kernel_size=(3, 3), padding=(1, 1), use_bias=False, layout="NCHW") # split here convs = sym.split(conv, indices_or_sections=2) relus = [sym.relu(x, name="relu") for x in convs] relu = sym.concatenate(*relus) flatten = sym.flatten(relu, name="flatten") softmax = sym.softmax(flatten, name="softmax") g = graph.create(softmax) g = g.apply("CorrectLayout") g = graph_attr.set_dtype_inputs(g, "float32") g = g.apply(["InferShape", "InferType"]) layouts_origin = get_layouts(g) @reg.register_alter_op_layout("conv2d", level=100) def alter_conv2d_layout(attrs, inputs, tinfos): new_attrs = {k: attrs[k] for k in attrs.keys()} new_attrs["layout"] = "NCHW16c" new_attrs["kernel_layout"] = "NCHW16c" new_attrs["name"] = "conv_alter" return sym.conv2d(inputs[0], inputs[1], **new_attrs) g = g.apply("AlterOpLayout") layouts = get_layouts(g) # check copy layouts for node in ["data", "relu", "flatten", "softmax", "conv_weight"]: assert layouts[node] == layouts_origin[node] assert layouts["conv_alter"] == layouts_origin["conv"]
def Inception7E(data, num_1x1, num_d3_red, num_d3_1, num_d3_2, num_3x3_d3_red, num_3x3, num_3x3_d3_1, num_3x3_d3_2, pool, proj, name): tower_1x1 = Conv(data=data, num_filter=num_1x1, kernel=(1, 1), name=('%s_conv' % name)) tower_d3 = Conv(data=data, num_filter=num_d3_red, name=('%s_tower' % name), suffix='_conv') tower_d3_a = Conv(data=tower_d3, num_filter=num_d3_1, kernel=(1, 3), pad=(0, 1), name=('%s_tower' % name), suffix='_mixed_conv') tower_d3_b = Conv(data=tower_d3, num_filter=num_d3_2, kernel=(3, 1), pad=(1, 0), name=('%s_tower' % name), suffix='_mixed_conv_1') tower_3x3_d3 = Conv(data=data, num_filter=num_3x3_d3_red, name=('%s_tower_1' % name), suffix='_conv') tower_3x3_d3 = Conv(data=tower_3x3_d3, num_filter=num_3x3, kernel=(3, 3), pad=(1, 1), name=('%s_tower_1' % name), suffix='_conv_1') tower_3x3_d3_a = Conv(data=tower_3x3_d3, num_filter=num_3x3_d3_1, kernel=(1, 3), pad=(0, 1), name=('%s_tower_1' % name), suffix='_mixed_conv') tower_3x3_d3_b = Conv(data=tower_3x3_d3, num_filter=num_3x3_d3_2, kernel=(3, 1), pad=(1, 0), name=('%s_tower_1' % name), suffix='_mixed_conv_1') pooling = Pooling(data=data, kernel=(3, 3), stride=(1, 1), pad=(1, 1), pool_type=pool, name=('%s_pool_%s_pool' % (pool, name))) cproj = Conv(data=pooling, num_filter=proj, kernel=(1, 1), name=('%s_tower_2' % name), suffix='_conv') concat = sym.concatenate(*[ tower_1x1, tower_d3_a, tower_d3_b, tower_3x3_d3_a, tower_3x3_d3_b, cproj ], axis=3, name='ch_concat_%s_chconcat' % name) return concat
def Inception7C(data, num_1x1, num_d7_red, num_d7_1, num_d7_2, num_q7_red, num_q7_1, num_q7_2, num_q7_3, num_q7_4, pool, proj, name): tower_1x1 = Conv(data=data, num_filter=num_1x1, kernel=(1, 1), name=('%s_conv' % name)) tower_d7 = Conv(data=data, num_filter=num_d7_red, name=('%s_tower' % name), suffix='_conv') tower_d7 = Conv(data=tower_d7, num_filter=num_d7_1, kernel=(1, 7), pad=(0, 3), name=('%s_tower' % name), suffix='_conv_1') tower_d7 = Conv(data=tower_d7, num_filter=num_d7_2, kernel=(7, 1), pad=(3, 0), name=('%s_tower' % name), suffix='_conv_2') tower_q7 = Conv(data=data, num_filter=num_q7_red, name=('%s_tower_1' % name), suffix='_conv') tower_q7 = Conv(data=tower_q7, num_filter=num_q7_1, kernel=(7, 1), pad=(3, 0), name=('%s_tower_1' % name), suffix='_conv_1') tower_q7 = Conv(data=tower_q7, num_filter=num_q7_2, kernel=(1, 7), pad=(0, 3), name=('%s_tower_1' % name), suffix='_conv_2') tower_q7 = Conv(data=tower_q7, num_filter=num_q7_3, kernel=(7, 1), pad=(3, 0), name=('%s_tower_1' % name), suffix='_conv_3') tower_q7 = Conv(data=tower_q7, num_filter=num_q7_4, kernel=(1, 7), pad=(0, 3), name=('%s_tower_1' % name), suffix='_conv_4') pooling = Pooling(data=data, kernel=(3, 3), stride=(1, 1), pad=(1, 1), pool_type=pool, name=('%s_pool_%s_pool' % (pool, name))) cproj = Conv(data=pooling, num_filter=proj, kernel=(1, 1), name=('%s_tower_2' % name), suffix='_conv') concat = sym.concatenate(*[tower_1x1, tower_d7, tower_q7, cproj], axis=3, name='ch_concat_%s_chconcat' % name) return concat