示例#1
0
def verify_upsampling():
    batch = IntIter(list_constraint([1, 4, 8, 16]))
    channel = IntIter(list_constraint([1, 3, 4]))
    h = IntIter(range_constraint(1, 9, 3))
    w = IntIter(range_constraint(1, 9, 3))
    dshp = opg.ExtendIter(batch, channel, h, w)
    datas = []
    for i in range(len(dshp)):
        size = np.product(dshp[i])
        arr1 = ConstantIter(rand_constraint(-127, 127, size), shape=dshp[i])
        arr2 = ConstantIter(rand_constraint(0, 127, size), shape=dshp[i])
        datas.extend([arr1, arr2])
    data = ConcatIter(*datas)

    scale = IntIter(iter_constraint(3), name="scale")

    def upsampling(data, scale):
        if scale == 0:
            raise ValueError("scale must > 0 vs. " + str(scale))
        a_np = np.array(data)
        b_np = topi.testing.upsampling_python(a_np, scale, "NCHW")
        return [b_np]

    op_units = opg.OpUnitIter([data, scale], 1)
    op_units.eval_data("upsampling", upsampling, is_dump=True)
示例#2
0
def verify_dense():
    batch = IntIter(list_constraint([1, 4, 8, 16]))
    channel = IntIter(list_constraint([1, 3, 32, 64]))
    dshp = opg.ExtendIter(batch, channel)
    datas = []
    for i in range(len(dshp)):
        size = np.product(dshp[i])
        arr1 = ConstantIter(rand_constraint(-127, 127, size), shape=dshp[i])
        arr2 = ConstantIter(rand_constraint(0, 127, size), shape=dshp[i])
        arr3 = ConstantIter(rand_constraint(1, 127, size), shape=dshp[i])
        datas.extend([arr1, arr2, arr3])
    data = ConcatIter(
        *datas, ConstantIter(rand_constraint(-127, 127, 112), shape=(4, 4, 7)))
    print(len(data))

    units = IntIter(list_constraint([1, 32, 64]), name="units")
    use_bias = BoolIter(name="use_bias")
    op_units = opg.OpUnitIter([data, units, use_bias], 1)
    for i in range(len(op_units)):
        data, units, use_bias = op_units[i]
        data_nd = nd.array(data)
        batch, ic = data_nd.shape[:2]
        wshp = (units, ic)
        wsize = np.product(wshp)
        weight = ConstantIter(rand_constraint(-127, 127, wsize), shape=wshp)
        weight_nd = nd.array(weight[0])
        bshp = (units, )
        bias = ConstantIter(rand_constraint(-127, 127, units), shape=bshp)
        bias_nd = nd.array(bias[0])
        attr = {
            'units': units,
            'use_bias': use_bias,
        }
        ins = [data_nd, weight_nd, bias_nd
               ] if use_bias else [data_nd, weight_nd]
        outs, err = None, None
        try:
            if use_bias:
                out = nd.FullyConnected(data_nd, weight_nd, bias_nd, units,
                                        (not use_bias))
            else:
                out = nd.FullyConnected(data_nd, weight_nd, None, units,
                                        (not use_bias))
            outs = [out]
        except Exception as e:
            err = "Error:\n" + str(e)
        print(data_nd.shape, wshp, bshp, attr, outs[0].shape if outs else None,
              err.replace("\n", "") if err else None)
        opg.dump("dense", attr, ins, outs, err)
示例#3
0
def verify_transpose():
    def transpose(data, axes):
        data_npy = np.array(data, dtype=INT32)
        return [np.transpose(data_npy, axes)]

    # dshp = (1, 2, 3)
    # data = opg.ConstantIter(iter_constraint(6), shape=dshp)
    # axes = opg.PermutationIter(list_constraint([0, 1, 2]),
    #                            list_constraint([-1, 0, 1]),
    #                            list_constraint([-3, -2, -1]),
    #                            list_constraint([-3, 1, 2]))
    # axes = opg.ConcatIter(axes,
    #             opg.NoneIter(),
    #             opg.RepeatIter(IntIter(std_int_constraint(2)), 3),
    #             opg.ConstantIter(list_constraint([-4, 0, 1])),
    #             opg.ConstantIter(list_constraint([-1, 0, 4])),
    #             opg.ConstantIter(list_constraint([0, 1])),
    #             opg.ConstantIter(list_constraint([1])),
    #             name="axes")
    # op_units = opg.OpUnitIter([data, axes], attr_index=1)
    # op_units.eval_data("transpose", transpose, is_dump=True)

    dshp = opg.PermutationIter(list_constraint([5, 4, 3]))
    datas = []
    for i in range(len(dshp)):
        shp = dshp[i]
        size = np.product(shp)
        data = ConstantIter(iter_constraint(size), shape=shp)
        datas.append(data)
    data = ConcatIter(*datas)
    axes = ConcatIter([[1, 2, 0]], name="axes")
    op_units = opg.OpUnitIter([data, axes], attr_index=1)
    op_units.eval_data("transpose", transpose, is_dump=True)
示例#4
0
def verify_get_valid_counts():
    dshp = ConcatIter(PermutationIter(list_constraint([4, 5, 6])),
                      [[1, 2, 3], [3, 1, 2], [2, 3, 1]])
    data_arr = []
    for i in range(len(dshp)):
        shp = dshp[i]
        size = np.product(shp)
        arr = ConstantIter(rand_constraint(0, 10, size), shape=shp)
        data_arr.append(arr)
    data = ConcatIter(*data_arr)
    score = IntIter(list_constraint([-1, 0, 1, 5, 7]), name="score_threshold")

    def get_valid_counts(data, score_threshold):
        np_data = np.array(data)
        dshp = np_data.shape
        if len(dshp) != 3 or (dshp[2] <= 2):
            raise ValueError("data shape error: " + str(dshp))
        batch_size, num_anchor, elem_length = dshp
        np_out1 = np.zeros(shape=(batch_size, ))
        np_out2 = np.zeros(shape=dshp, dtype=INT32)
        for i in range(batch_size):
            np_out1[i] = 0
            inter_idx = 0
            for j in range(num_anchor):
                score = np_data[i, j, 1]
                if score > score_threshold:
                    for k in range(elem_length):
                        np_out2[i, inter_idx, k] = np_data[i, j, k]
                    np_out1[i] += 1
                    inter_idx += 1
                if j >= np_out1[i]:
                    for k in range(elem_length):
                        np_out2[i, j, k] = -1.0
        return [np_out1, np_out2]

    op_units = opg.OpUnitIter([data, score], 1)
    op_units.eval_data("get_valid_counts", get_valid_counts, is_dump=True)
示例#5
0
def verify_non_max_suppression():
    # batch = np.random.randint(low=1, high=10)
    # n = np.random.randint(low=10, high=11)
    # k = 6
    # dshape = (batch, n, k)
    # data = tvm.placeholder(dshape, name="data")
    # valid_count = tvm.placeholder((dshape[0],), dtype="int32", name="valid_count")
    # nms_threshold = np.random.randint(low=1, high=10)
    # force_suppress = True if np.random.randint(low=0, high=1) == 1 else False
    # nms_topk = np.random.randint(low=1, high=9)
    # params = {'iou_threshold':nms_threshold*10, 'coord_start':2, 'score_index':1, 'id_index':0,
    #         'force_suppress':force_suppress, 'top_k': nms_topk, 'return_indices':False}
    # save_dict(params, case_dir + '/attr.txt')

    # np_data = np.random.randint(low=-(2**31-1), high=(2**31-1), size=dshape).astype(data.dtype)
    # np_valid_count = np.random.randint(low=1, high=10, size=(batch)).astype(valid_count.dtype)

    # device = 'llvm'
    # ctx = tvm.context(device, 0)
    # with tvm.target.create(device):
    #     out = non_max_suppression(data, valid_count, -1, nms_threshold, force_suppress, nms_topk, return_indices=False)
    #     s = topi.generic.schedule_nms(out)

    # tvm_data = tvm.nd.array(np_data, ctx)
    # tvm_valid_count = tvm.nd.array(np_valid_count, ctx)
    # save_txt(tvm_data, case_dir + "/in_0.txt")
    # save_txt(tvm_valid_count, case_dir + "/in_1.txt")

    # tvm_out = tvm.nd.array(np.zeros(dshape, dtype=data.dtype), ctx)
    # f = tvm.build(s, [data, valid_count, out], device)
    # f(tvm_data, tvm_valid_count, tvm_out)

    # save_txt(tvm_out, case_dir + "/out_0.txt")

    batch = IntIter(range_constraint(1, 2))
    n = IntIter(rand_constraint(1, 32, 40))
    k = IntIter(list_constraint([6]))
    dshp = opg.ExtendIter(batch, n, k)
    datas = []
    for i in range(len(dshp)):
        shp = dshp[i]
        data = []
        for n in range(shp[1]):
            elem = rand_constraint(-20, 20, 6)()
            elem[0] = random.randint(-1, 10)
            data.append(elem)
        datas.append([[data]])
    data = ConcatIter(*datas)
    valid_count = RandomVectorIter(1, 32, 1, 10)
    iou = ConcatIter(IntIter(rand_constraint(0, 100, 20)),
                     IntIter(list_constraint([110])),
                     name="iou_threshold")
    force_suppress = BoolIter(name="force_suppress")
    top_k = ConcatIter(IntIter(list_constraint([-1])),
                       IntIter(rand_constraint(1, 32, 6)),
                       name="top_k")
    id_index = IntIter(list_constraint([0]), name="id_index")
    score_index = IntIter(list_constraint([1]), name="score_index")
    coord_start = IntIter(list_constraint([2]), name="coord_start")
    max_output_size = ConcatIter(IntIter(list_constraint([-1])),
                                 IntIter(rand_constraint(1, 32, 6)),
                                 name="max_output_size")
    return_indices = BoolIter(const=False, name="return_indices")
    invalid_to_bottom = BoolIter(const=True, name="invalid_to_bottom")
    inputs = [
        data, valid_count, iou, force_suppress, top_k, id_index, score_index,
        coord_start, max_output_size, return_indices, invalid_to_bottom
    ]

    def cstr_func(data, valid_count, *args):
        data_np = np.array([data])
        count = valid_count[0]
        if count > data_np.shape[1]:
            return False
        return True

    op_units = opg.OpUnitIter([
        data, valid_count, iou, force_suppress, top_k, id_index, score_index,
        coord_start, max_output_size, return_indices, invalid_to_bottom
    ], 2, [cstr_func])

    def non_max_suppression(data, valid_count, iou, force_suppress, top_k,
                            id_index, score_index, coord_start,
                            max_output_size, return_indices,
                            invalid_to_bottom):
        device = 'llvm'
        ctx = tvm.context(device, 0)
        data_np, valid_count_np = np.array(data, dtype="float32"), np.array(
            valid_count, dtype="int32")
        data_nd, valid_count_nd = tvm.nd.array(data_np, ctx), tvm.nd.array(
            valid_count_np, ctx)
        dshp = data_nd.shape
        data_tvm = tvm.placeholder(dshp, name="data", dtype="float32")
        valid_count_tvm = tvm.placeholder((dshp[0], ),
                                          dtype="int32",
                                          name="valid_count")
        with tvm.target.create(device):
            out = topi.vision.non_max_suppression(data_tvm, valid_count_tvm,
                                                  max_output_size, iou / 100,
                                                  force_suppress, top_k,
                                                  coord_start, score_index,
                                                  id_index, return_indices,
                                                  invalid_to_bottom)
            s = topi.generic.schedule_nms(out)

        out_nd = tvm.nd.array(np.zeros(dshp, dtype=data_tvm.dtype), ctx)
        f = tvm.build(s, [data_tvm, valid_count_tvm, out], device)
        f(data_nd, valid_count_nd, out_nd)
        return [out_nd.asnumpy()]

    op_units.eval_data("non_max_suppression", non_max_suppression, True)
示例#6
0
def verify_max_pool2d():
    batch = IntIter(list_constraint([1, 4]))
    channel = IntIter(list_constraint([1, 4]))
    h = IntIter(range_constraint(1, 9, 3))
    w = IntIter(range_constraint(1, 9, 3))
    dshp = opg.ExtendIter(batch, channel, h, w)
    datas = []
    for i in range(len(dshp)):
        size = np.product(dshp[i])
        arr1 = ConstantIter(rand_constraint(-127, 127, size), shape=dshp[i])
        arr2 = ConstantIter(rand_constraint(0, 127, size), shape=dshp[i])
        datas.extend([arr1, arr2])
    data = ConcatIter(*datas)
    print(len(data))

    iattr = IntIter(range_constraint(1, 4))
    pool_size = ConcatIter(RepeatIter([1, 2, 3], 2), [(2, 3), (3, 1)],
                           name="pool_size")
    strides = ConcatIter(RepeatIter([1, 2], 2), [(1, 2), (2, 1)],
                         name="strides")
    iattr = IntIter(iter_constraint(2))
    padding = ConcatIter(VectorIter(iattr, 1),
                         VectorIter(iattr, 2),
                         name="padding")
    ceil_mode = BoolIter(name="ceil_mode")

    def max_pool2d(data, pool_size, strides, padding, ceil_mode):
        data_nd = nd.array(data)
        pad = padding
        if len(padding) == 1:
            pad = (padding[0], padding[0])
        out = nd.Pooling(data_nd,
                         pool_size,
                         pool_type="max",
                         global_pool=False,
                         stride=strides,
                         pad=pad)

        data_npy = np.array(data)
        ashape = data_npy.shape
        n, ic, ih, iw = data_npy.shape
        sh, sw = strides
        kh, kw = pool_size
        bshape = [n, ic, ih, iw]
        if len(padding) == 1:
            pt = pl = pb = pr = padding[0]
        else:
            pt = pb = padding[0]
            pl = pr = padding[1]
        if ceil_mode:
            pb += sh - 1
            pr += sw - 1
        pad_np = np.full((n, ic, ih + pt + pb, iw + pl + pr),
                         -127).astype(INT32)
        # pad_np = np.zeros(shape=(n, ic, ih+pt+pb, iw+pl+pr)).astype(INT32)
        no_zero = (range(n), range(ic), (range(pt,
                                               ih + pt)), (range(pl, iw + pl)))
        pad_np[np.ix_(*no_zero)] = data_npy
        bshape[2] = int(math.floor(float(ashape[2] - kh + pt + pb) / sh) + 1)
        bshape[3] = int(math.floor(float(ashape[3] - kw + pl + pr) / sw) + 1)
        if pt >= kh or (bshape[2] - 1) * sh - pt >= ashape[2]:
            raise ValueError("ceil_mode exceed out of input")
        if pl >= kw or (bshape[3] - 1) * sw - pl >= ashape[3]:
            raise ValueError("ceil mode exceed out of input")
        _, oc, oh, ow = bshape
        b_np = np.zeros(shape=(n, oc, oh, ow)).astype(INT32)
        for i in range(oh):
            for j in range(ow):
                b_np[:, :, i, j] = np.max(pad_np[:, :, i * sh:i * sh + kh,
                                                 j * sw:j * sw + kw],
                                          axis=(2, 3))
        return [b_np]

    op_units = opg.OpUnitIter([data, pool_size, strides, padding, ceil_mode],
                              1)
    op_units.eval_data("max_pool2d", max_pool2d, is_dump=True)
示例#7
0
def verify_conv2d():
    batch = IntIter(list_constraint([1, 4, 8]))
    channel = IntIter(list_constraint([1, 3, 4, 8]))
    h = IntIter(range_constraint(1, 9, 3))
    w = IntIter(range_constraint(1, 9, 3))
    dshp = opg.ExtendIter(batch, channel, h, w)
    datas = []
    for i in range(len(dshp)):
        size = np.product(dshp[i])
        arr1 = ConstantIter(rand_constraint(-127, 127, size), shape=dshp[i])
        arr2 = ConstantIter(rand_constraint(0, 127, size), shape=dshp[i])
        datas.extend([arr1, arr2])
    data = ConcatIter(*datas)
    print(len(data))

    num_filter = IntIter(list_constraint([1, 16, 32]), name="num_filter")
    kernel = VectorIter(IntIter(list_constraint([1, 2, 3])),
                        size=2,
                        name="kernel_size")
    strides = RandomVectorIter(1, 4, 2, 1, name="strides")
    padding = RandomVectorIter(0, 3, 2, 1, name="padding")
    groups = IntIter(list_constraint([1, 2, 4]), name="groups")
    use_bias = RandomBoolIter(name="use_bias")
    op_units = opg.OpUnitIter(
        [data, num_filter, kernel, strides, padding, groups, use_bias], 1)
    for i in range(len(op_units)):
        data, num_filter, kernel, strides, padding, \
            groups, use_bias = op_units[i]
        a_np = np.array(data)
        batch, ic, h, w = a_np.shape
        if groups == 1:
            pass
        elif random.randint(0, 10) < 5 and ic % groups == 0:
            pass
        else:
            groups = ic
        wshp = (num_filter, ic // groups, *kernel)
        wsize = np.product(wshp)
        weight = ConstantIter(rand_constraint(-127, 127, wsize), shape=wshp)
        w_np = np.array(weight[0])
        bshp = (num_filter, )
        bias = ConstantIter(rand_constraint(-127, 127, num_filter), shape=bshp)
        b_np = np.array(bias[0])

        rand = random.randint(0, 100)
        if rand < 60:
            dilation = (1, 1)
        elif rand < 70:
            dilation = (1, 2)
        elif rand < 80:
            dilation = (2, 1)
        else:
            dilation = (2, 2)
        attr = {
            'channels': num_filter,
            'kernel_size': kernel,
            'strides': strides,
            'padding': padding,
            'dilation': dilation,
            'groups': groups,
            'layout': "NCHW",
            'kernel_layout': "OIHW",
            'use_bias': use_bias,
        }
        ins = [a_np, w_np, b_np] if use_bias else [a_np, w_np]
        outs, err = None, None
        try:
            b_nd = nd.array(b_np) if use_bias else None
            _ = nd.Convolution(nd.array(a_np),
                               nd.array(w_np),
                               b_nd,
                               kernel,
                               strides,
                               dilation,
                               padding,
                               num_filter,
                               groups,
                               no_bias=(not use_bias))

            dw_np = topi.testing.dilate_python(w_np, (1, 1, *dilation))
            c_np = topi.testing.conv2d_nchw_python(a_np, dw_np, strides,
                                                   padding)
            if use_bias:
                c_np += b_np.reshape(num_filter, 1, 1)
            outs = [c_np]
        except Exception as e:
            err = "Error:\n" + str(e)
        print(a_np.shape, wshp, bshp, attr, outs[0].shape if outs else None,
              err.replace("\n", "") if err else None)
        opg.dump("conv2d", attr, ins, outs, err)
示例#8
0
def verify_strided_slice():
    dshp = (2, 2)
    data = opg.ConstantIter(opg.iter_constraint(4), shape=dshp)
    attr = IntIter(range_constraint(-3, 3))
    begin = ConcatIter(VectorIter(attr, 2),
                       VectorIter(attr, 1),
                       VectorIter(attr, 0),
                       name="begin")
    end = ConcatIter(VectorIter(attr, 2),
                     VectorIter(attr, 1),
                     VectorIter(attr, 0),
                     name="end")
    sattr = IntIter(list_constraint([-2, -1, 1, 2]))
    strides = ConcatIter(VectorIter(sattr, 2),
                         VectorIter(sattr, 1), [[0], [1, 0], [0, 1]],
                         NoneIter(),
                         name="stride")

    def cstr_func(*inputs):
        data, begin, end, strides = inputs
        if strides is not None and strides[0] != 1:
            return False
        satisfied = True
        for i in range(len(data)):
            dim = len(data[i])
            b = begin[i] % dim if (begin
                                   is not None) and (i < len(begin)) else 0
            e = end[i] % dim if (end is not None) and (i < len(end)) else dim
            s = strides[i] if (strides
                               is not None) and (i < len(strides)) else 1
            if (s < 0) and (b <= e):
                satisfied = False
                break
            elif (s > 0) and (e <= b):
                satisfied = False
                break
        return satisfied

    def strided_slice(data, begin, end, strides):
        dshp = len(data)
        for i in range(len(begin), dshp):
            begin.append(0)
        for i in range(len(end), dshp):
            end.append(len(data[i]))
        if strides is None:
            strides = []
        for i in range(len(strides), dshp):
            strides.append(1)
        for i in range(dshp):
            dim = len(data[i])
            b, e, s = begin[i], end[i], strides[i]
            begin_range = -1 if s < 0 else 0
            end_range = dim - 1 if s < 0 else dim
            b = b + dim if b < 0 else b
            e = e + dim if e < 0 else e
            b = min(max(b, begin_range), end_range)
            e = min(max(e, begin_range), end_range)
            if ((s < 0 and (b <= e)) or \
                (s > 0 and (e <= b))):
                raise ValueError("begin=%d;%d, end=%d;%d, stride=%d" \
                        % (begin[i], b, end[i], e, s))

        data_npy = np.array(data)
        out_npy = topi.testing.strided_slice_python(data_npy, begin, end,
                                                    strides)
        return [out_npy]

    op_units = opg.OpUnitIter([data, begin, end, strides], 1, [cstr_func])
    op_units.eval_data("strided_slice", strided_slice, is_dump=True)

    dshp = (10, 10)
    data = ConstantIter(iter_constraint(100), shape=dshp)
    begin = ConcatIter([[0, 9]], name="begin")
    end = ConcatIter([[9, -20]], name="end")
    strides = ConcatIter([[1, -1], [2, -2], [3, -3], [4, -4], [5, -5], [6, -6],
                          [9, -9], [10, -10], [20, -20]],
                         name="stride")
    op_units = opg.OpUnitIter([data, begin, end, strides], 1)
    op_units.eval_data("strided_slice", strided_slice, is_dump=True)