Пример #1
0
    def update(self, lrate):
        N, Hx, Wx, Dx = self.X.shape
        N, Hy, Wy, NF = self.DY.shape

        hf, wf, df, NF = self.W.shape
        hstride, wstride = self.stride

        DW = nd.zeros_like(self.W, ctx=self.ctx, dtype=self.dtype)

        if not (hf == wf and self.stride == (1, 1)):
            for i in range(Hy):
                for j in range(Wy):
                    DW += (
                        nd.expand_dims(self.X[:, i * hstride:i * hstride + hf,
                                              j * wstride:j * wstride + wf, :],
                                       axis=4) *
                        nd.expand_dims(self.DY[:, i:i + 1, j:j + 1, :],
                                       axis=3)).sum(axis=0)
        else:
            for i in range(hf):
                for j in range(wf):
                    DW[i, j, :, :] = nd.sum(nd.expand_dims(
                        self.X[:, i:i + Hy:hstride, j:j + Wy:wstride, :],
                        axis=4) * nd.expand_dims(self.DY, axis=3),
                                            axis=(0, 1, 2))

        DB = self.DY.sum(axis=(0, 1, 2))
        self.W -= lrate * DW / (hf * wf * df * Hy * Wy)**.5
        self.B -= lrate * DB / (Hy * Wy)**.5
Пример #2
0
 def Route(self, x):
     # b_mat = nd.repeat(self.b_mat.data(), repeats=x.shape[0], axis=0)#nd.stop_gradient(nd.repeat(self.b_mat.data(), repeats=x.shape[0], axis=0))
     b_mat = nd.zeros((x.shape[0], 1, self.num_cap, self.num_locations),
                      ctx=x.context)
     x_expand = nd.repeat(nd.expand_dims(x, 2),
                          repeats=self.num_cap,
                          axis=2)
     x_expand = nd.repeat(nd.expand_dims(x_expand, axis=2),
                          repeats=self.units,
                          axis=2)
     w_expand = nd.expand_dims(self.w_ij.data(), axis=0)
     u_ = w_expand * x_expand
     u = nd.sum(u_, axis=1)
     u_no_gradient = nd.stop_gradient(u)
     for i in range(self.route_num):
         c_mat = nd.softmax(b_mat, axis=2)
         if i == self.route_num - 1:
             s = nd.sum(u * c_mat, axis=-1)
         else:
             s = nd.sum(u_no_gradient * c_mat, axis=-1)
         v = squash(s, 1)
         v1 = nd.expand_dims(v, axis=-1)
         if i != self.route_num - 1:
             update_term = nd.sum(u_no_gradient * v1, axis=1, keepdims=True)
             b_mat = b_mat + update_term
     return v
Пример #3
0
    def _epsilon_lrp(self, R, epsilon):
        '''
        LRP according to Eq(58) in DOI: 10.1371/journal.pone.0130140
        '''

        N, Hout, Wout, NF = R.shape
        hf, wf, df, NF = self.W.shape
        hstride, wstride = self.stride

        Rx = nd.zeros_like(self.X, ctx=self.ctx, dtype=self.dtype)
        R_norm = R / (self.Y + epsilon * ((self.Y >= 0) * 2 - 1.))

        for i in range(Hout):
            for j in range(Wout):
                if self.lrp_aware:
                    Z = self.Z[:, i, j, ...]
                else:
                    Z = nd.expand_dims(self.W, axis=0) * nd.expand_dims(
                        self.X[:, i * hstride:i * hstride + hf,
                               j * wstride:j * wstride + wf, :],
                        axis=4)
                Rx[:, i * hstride:i * hstride + hf:,
                   j * wstride:j * wstride + wf:, :] += (Z * (nd.expand_dims(
                       R_norm[:, i:i + 1, j:j + 1, :], axis=3))).sum(axis=4)
        return Rx
Пример #4
0
        def update_alphas(data, alphas):
            """Calculate the batch update alpha for each time step

            Args:
                data (NDArray): NDArray shape: (seq_len, batch_size, self.tagset_size)
                alphas (NDArray): NDArray shape: (batch_size, self.tagset_size)
            """

            # alphas_t shape: (self.tagset_size, batch_size, self.tagset_size)
            alphas_t = nd.broadcast_axis(nd.expand_dims(alphas, axis=0), axis=0,
                                         size=self.tagset_size)
            # emit_score shape: (self.tagset_size, batch_size, 1)
            emit_score = nd.transpose(nd.expand_dims(data, axis=0), axes=(2, 1, 0))
            # trans_score shape: (self.tagset_size, 1, self.tagset_size)
            trans_score = nd.expand_dims(self.transitions.data(), axis=1)

            # next_tag_var shape: (self.tagset_size, batch_size, self.tagset_size)
            next_tag_var = alphas_t + emit_score + trans_score

            # alphas shape: (self.tagset_size, batch_size)
            alphas = log_sum_exp(next_tag_var)
            # alphas shape: (batch_size, self.tagset_size)
            alphas = nd.transpose(alphas, axes=(1, 0))

            return data, alphas
Пример #5
0
    def query(self, image_text_pairs):
        if self.pool_size == 0:
            return image_text_pairs
        ret_images = []
        ret_text_feats = []
        images, text_feats = image_text_pairs

        for i in range(images.shape[0]):
            image = nd.expand_dims(images[i], axis=0)
            text_feat = nd.expand_dims(text_feats[i], axis=0)
            if self.num_imgs < self.pool_size:
                self.num_imgs = self.num_imgs + 1
                self.images.append(image)
                self.text_feats.append(text_feat)
                ret_images.append(image)
                ret_text_feats.append(text_feat)
            else:
                p = nd.random_normal(0, 1, shape=(1, )).asscalar()
                if p < 0.5:
                    random_index = nd.random_uniform(0, self.pool_size-1, shape=(1, )).astype(np.uint8).asscalar()
                    tmp_img = self.images[random_index].copy()
                    tmp_text_feat = self.text_feats[random_index].copy()
                    self.images[random_index] = image
                    self.text_feats[random_index] = text_feat
                    ret_images.append(tmp_img)
                    ret_text_feats.append(tmp_text_feat)
                else:
                    ret_images.append(image)
                    ret_text_feats.append(text_feat)
        ret_images = nd.concat(*ret_images, dim=0)
        ret_text_feats = nd.concat(*ret_text_feats, dim=0)
        return [ret_images, ret_text_feats]
Пример #6
0
    def forward(self, query, values, head=False):
        """

        计算Attention权重与输出向量

        :param query: 查询,即当前步Decoder的输入
        :param values: 值,即Encoder中每一个时间步向量
        :return: (Attention输出向量, Attention权重)
        """
        #print('In Attention')
        hidden_with_time_axis = nd.expand_dims(query, 1)
        #print('hidden_with_time:', hidden_with_time_axis.shape)
        score = self.V(
            nd.tanh(self.W1(values) + self.W2(hidden_with_time_axis)))
        #print('\t score:',score.shape)
        attention_weights = nd.softmax(score, axis=1)

        #print('\t attention_weight:', attention_weights.shape)
        #print('\t values:', values.shape)

        context_vector = attention_weights * values

        #print('\t mid_context_vector:',context_vector.shape)

        if head is True:
            context_vector = nd.sum(context_vector, axis=2)
        else:
            context_vector = nd.sum(context_vector, axis=1)
        # print('\t context',context_vector.shape)
        context_vector = nd.expand_dims(context_vector, axis=0)
        return context_vector, attention_weights
Пример #7
0
    def train(self, true_image, latent_z, generator):
        data_fake = gluon.utils.split_and_load(latent_z, self.ctx)
        data_true = gluon.utils.split_and_load(true_image, self.ctx)

        result = [generator.generator(X) for X in data_fake]
        with autograd.record():

            disc_fake = [self.discriminator(X) for X in result]
            disc_real = [self.discriminator(X) for X in data_true]


            d_loss_fake = [
                (X - nd.repeat(nd.expand_dims(nd.mean(Y, axis=0), axis=0), repeats=Y.shape[0], axis=0) - 1) ** 2
                for
                X, Y in zip(disc_real, disc_fake)]
            d_loss_real = [
                (Y - nd.repeat(nd.expand_dims(nd.mean(X, axis=0), axis=0), repeats=X.shape[0], axis=0) + 1) ** 2
                for
                X, Y in zip(disc_real, disc_fake)]

            # d_loss_fake = [X ** 2 for X in disc_fake]
            # d_loss_real = [(X - 1) ** 2 for X in disc_real]

            d_loss_total = [nd.mean(X + Y) * 0.5 for X, Y in zip(d_loss_real, d_loss_fake)]

        for l in d_loss_total:
            l.backward()

        self.trainer.step(latent_z[0].shape[0])
        curr_dloss = nd.mean(sum(d_loss_total) / len(self.ctx)).asscalar()
        return curr_dloss
Пример #8
0
 def Route(self, x):
     # print x.context
     # b_mat = nd.repeat(self.b_mat.data(), repeats=x.shape[0], axis=0)#nd.stop_gradient(nd.repeat(self.b_mat.data(), repeats=x.shape[0], axis=0))
     b_mat = nd.zeros((x.shape[0], 1, self.num_cap, self.num_locations),
                      ctx=x.context)
     x_expand = nd.expand_dims(nd.expand_dims(x, axis=2), 2)
     w_expand = nd.repeat(nd.expand_dims(self.w_ij.data(x.context), axis=0),
                          repeats=x.shape[0],
                          axis=0)
     u_ = w_expand * x_expand
     u = nd.sum(u_, axis=1)
     # u_ = nd.square(w_expand - x_expand)
     # u = -nd.sum(u_, axis = 1)
     u_no_gradient = nd.stop_gradient(u)
     for i in range(self.route_num):
         # c_mat = nd.softmax(b_mat, axis=2)
         c_mat = nd.sigmoid(b_mat)
         if i == self.route_num - 1:
             s = nd.sum(u * c_mat, axis=-1)
         else:
             s = nd.sum(u_no_gradient * c_mat, axis=-1)
         v = squash(s, 1)
         if i != self.route_num - 1:
             v1 = nd.expand_dims(v, axis=-1)
             update_term = nd.sum(u_no_gradient * v1, axis=1, keepdims=True)
             b_mat = b_mat + update_term
             # b_mat = update_term
         # else:
         #    v = s
     return v
    def forward(self, current, previous, doc_encode):
        """[summary]

        Args:
            current ([type]): h_j (batch_size, sentence_hidden_size * 2)
            previous ([type]): s_j (batch_size, sentence_hidden_size * 2)
            doc_encode ([type]): d (batch_size, ndoc_dims)
        """
        # content: (batch_size, 1)
        content = self.content_encoder(current)
        # salience: (batch_size, sentence_hidden_size * 2)
        salience = self.salience_encoder(doc_encode)
        salience = current * salience
        # salience: (batch_size,)
        salience = nd.sum_axis(salience, -1)
        # salience: (batch_size, 1)
        salience = nd.expand_dims(salience, -1)

        # novelty: (bathc_size, sentence_hidden_size * 2)
        novelty = self.novelty_encoder(nd.tanh(previous))
        novelty = current * novelty
        # salience: (batch_size,)
        novelty = nd.sum_axis(novelty, -1)
        # salience: (batch_size, 1)
        novelty = nd.expand_dims(novelty, -1)

        # P: (batch_size, 1)
        P = nd.sigmoid(content + salience - novelty)

        return P
Пример #10
0
 def _clip_px_gradients(self, batch_grads, px_clipping_factors):
     # hacky workaround for not knowing how to multiply a (b,) shape array with a (b, x) or (b, x, y) shape array
     expanded_batch_clipping_factors = nd.expand_dims(
         px_clipping_factors, 1)
     if len(batch_grads.shape) == 3:
         expanded_batch_clipping_factors = nd.expand_dims(
             expanded_batch_clipping_factors, 1)
     return nd.multiply(batch_grads, expanded_batch_clipping_factors)
Пример #11
0
def predict_transform(prediction, input_dim, anchors):
    '''
        功能:
        输入:
            prediction:经过神经网络,上下采样的数量总和x3的x,y,w,h,pc,c1,c2的原始值[batchnumber,13x13x3+26x26x3+52x52x3,7]
            input_dim:416
            anchors:九个锚框尺寸对
        输出:
            prediction:所有锚框实际值[batchnumber,13x13x3+26x26x3+52x52x3,7]
    '''
    ctx = prediction.context
    b_xywhs = prediction.copy()
    if not isinstance(anchors, nd.NDArray):
        anchors = nd.array(anchors, ctx=ctx)
    #print('sum(prediction[:,4]==1):{}'.format(nd.sum(prediction[:,:,4]==1)))
    batch_size = prediction.shape[0]
    anchors_masks = [[6, 7, 8], [3, 4, 5], [0, 1, 2]]
    strides = [13, 26, 52]
    step = [(0, 507), (507, 2535), (2535, 10647)]
    for i in range(3):
        stride = strides[i]
        grid = np.arange(stride)
        a, b = np.meshgrid(grid, grid)
        x_offset = nd.array(a.reshape((-1, 1)), ctx=ctx)
        y_offset = nd.array(b.reshape((-1, 1)), ctx=ctx)
        x_y_offset = \
            nd.repeat(
                nd.expand_dims(
                    nd.repeat(
                        nd.concat(
                            x_offset, y_offset, dim=1), repeats=3, axis=0
                    ).reshape((-1, 2)),
                    0
                ),
                repeats=batch_size, axis=0
            )
        tmp_anchors = \
            nd.repeat(
                nd.expand_dims(
                    nd.repeat(
                        nd.expand_dims(
                            anchors[anchors_masks[i]], 0
                        ),
                        repeats=stride * stride, axis=0
                    ).reshape((-1, 2)),
                    0
                ),
                repeats=batch_size, axis=0
            )

        prediction[:, step[i][0]:step[i][1], :2] += x_y_offset
        prediction[:, step[i][0]:step[i][1], :2] *= (float(input_dim) * 1.0 /
                                                     stride)
        prediction[:, step[i][0]:step[i][1], 2:4] = \
            nd.exp(prediction[:, step[i][0]:step[i][1], 2:4]) * tmp_anchors
    #print('model predict_transform sum(prediction[:,4]==1):{}'.format(nd.sum(prediction[:,:,4]==1)))
    return prediction
Пример #12
0
def make_values_L(range_min, range_max, L, batch_size):

    logs_L = np.linspace(0, np.log(range_max * 1.0 / range_min), num=L / 2)

    values_L = nd.array(1.0 / range_min * np.exp(-logs_L))

    values_L = nd.expand_dims(nd.expand_dims(values_L, axis=0), axis=2)

    return nd.broadcast_axis(values_L, axis=0, size=batch_size)
Пример #13
0
 def log_prob(self, x: nd.NDArray) -> nd.NDArray:
   mean = self.get_param_maybe_repeated('mean')
   variance = self.get_param_maybe_repeated('variance')
   if x.ndim > mean.ndim:
     mean = nd.expand_dims(mean, 0)
     variance = nd.expand_dims(variance, 0)
   diff = x - mean
   self._saved_for_backward = [diff]
   return (-0.5 * nd.log(2. * np.pi * variance)
           - nd.square(diff) / 2. / variance)
Пример #14
0
def generate_transpose_conv_kernel(channels):
    c = channels
    if c % 2 != 0:
        raise ValueError('Channel number should be even.')
    idx = np.zeros(c)
    idx[np.arange(0, c, 2)] = np.arange(c / 2)
    idx[np.arange(1, c, 2)] = np.arange(c / 2, c, 1)
    weights = np.zeros((c, c))
    weights[np.arange(c), idx.astype(int)] = 1.0
    return nd.expand_dims(nd.expand_dims(nd.array(weights), axis=2), axis=3)
Пример #15
0
 def _score_sentence(self, feats, tags):
     point_score = nd.sum(nd.sum(feats * tags, 2), 1,
                          keepdims=True)  # 逐标签得分
     if (feats.shape[1] == 1):  # 如果sequence_length==1,没有转移概率
         return point_score
     labels1 = nd.expand_dims(tags[:, :-1], 3)
     labels2 = nd.expand_dims(tags[:, 1:], 2)
     labels = labels1 * labels2  # 两个错位labels,负责从转移矩阵中抽取目标转移得分
     trans = nd.expand_dims(nd.expand_dims(self.transitions.data(), 0), 0)
     trans_score = nd.sum(nd.sum(trans * labels, [2, 3]), 1, keepdims=True)
     return point_score + trans_score  # 两部分得分之和
Пример #16
0
 def _forward_alg(self, feats, sequence_length):
     state = feats[:, 0]  # 初始状态
     output = state  # 如果sequence_length==1,output = state
     for i in range(1, sequence_length):
         state = nd.expand_dims(state, 2)  # (batch_size, tagset_size, 1)
         trans = nd.expand_dims(self.transitions.data(),
                                0)  # (1, tagset_size, tagset_size)
         output = log_sum_exp(state + trans, 1)
         output = output + feats[:, i]
         state = output
     return output
Пример #17
0
 def _get_position_encoding(length, min_timescale=1.0, max_timescale=1.0e4):
     position = nd.arange(length, ctx=ghp.ctx)
     num_timescales = ghp.model_dim // 2
     log_timescale_increment = (
         math.log(float(max_timescale) / float(min_timescale)) /
         (float(num_timescales) - 1))
     inv_timescales = min_timescale * nd.exp(
         nd.arange(num_timescales, ctx=ghp.ctx) * -log_timescale_increment)
     scaled_time = nd.expand_dims(position, 1) * nd.expand_dims(
         inv_timescales, 0)
     signal = nd.concat(nd.sin(scaled_time), nd.cos(scaled_time), dim=1)
     return signal
Пример #18
0
def train_and_predict_rnn_gluon(model, num_hiddens, vocab_size, ctx,
                                corpus_indices, idx_to_char, char_to_idx,
                                num_epochs, num_steps, lr, clipping_theta,
                                batch_size, pred_period, pred_len, prefixes):
    """Train an Gluon RNN model and predict the next item in the sequence."""
    loss = gloss.SoftmaxCrossEntropyLoss()
    loss = gloss.CTCLoss(layout='NTC', label_layout='NT')
    model.initialize(ctx=ctx, force_reinit=True, init=init.Normal(0.01))
    trainer = gluon.Trainer(model.collect_params(), 'sgd',
                            {'learning_rate': lr, 'momentum': 0, 'wd': 0})

    for epoch in range(num_epochs):
        l_sum, n, start = 0.0, 0, time.time()
        data_iter_fn = data_iter_random
        data_iter = data_iter_fn(corpus_indices, batch_size, num_steps, ctx)
        # data_iter = data_iter_consecutive(
        #     corpus_indices, batch_size, num_steps, ctx)
        state = model.begin_state(batch_size=batch_size, ctx=ctx)
        model.hybridize()
        for X, Y in data_iter:
            for s in state:
                s.detach()
            with autograd.record():
                # X = nd.one_hot(X.T, vocab_size)
                #print(type(X))
                (output, state) = model(X,state)
                y = Y.T.reshape((-1,))
                #l = loss(output, y)
                # y = nd.one_hot(y,60)
                #model.forward(X,state)
                output = nd.expand_dims(output,axis=1)
                y = nd.expand_dims(y, axis=1)
                #print(output.shape, y.shape)
                l = loss(output, y).mean()
                # if(epoch == 0 ):
                #     sw.add_graph(model)
            l.backward()
            params = [p.data() for p in model.collect_params().values()]
            grad_clipping(params, clipping_theta, ctx)
            trainer.step(1)
            l_sum += l.asscalar() * y.size
            n += y.size

        if (epoch + 1) % pred_period == 0:
            print('epoch %d, perplexity %f, time %.2f sec' % (
                epoch + 1, math.exp(l_sum / n), time.time() - start))
            for prefix in prefixes:
                print(' -', predict_rnn_gluon(
                    prefix, pred_len, model, vocab_size, ctx, idx_to_char,
                    char_to_idx))
    #model.save_params("model_lstm.params")

    model.export("gluon")
    def forward(self,X,lrp_aware=False):
        '''
        Realizes the forward pass of an input through the convolution layer.

        Parameters
        ----------
        X :         mxnet.ndarray.ndarray.NDArray
                    a network input, shaped (N,H,W,D), with
                    N = batch size
                    H, W, D = input size in heigth, width, depth

        lrp_aware : bool
                    controls whether the forward pass is to be computed with awareness for multiple following
                    LRP calls. this will sacrifice speed in the forward pass but will save time if multiple LRP
                    calls will follow for the current X, e.g. wit different parameter settings or for multiple
                    target classes.

        Returns
        -------
        Y :         mxnet.ndarray.ndarray.NDArray
                    the layer outputs.
        '''

        self.lrp_aware = lrp_aware

        self.X = X
        N,H,W,D = X.shape

        hf, wf, df, nf  = self.W.shape
        hstride, wstride = self.stride
        numfilters = self.n

        #assume the given pooling and stride parameters are carefully chosen.
        Hout = (H - hf) // hstride + 1
        Wout = (W - wf) // wstride + 1


        #initialize pooled output
        self.Y = nd.zeros((N,Hout,Wout,numfilters), ctx=self.ctx, dtype=self.dtype)

        if self.lrp_aware:
            self.Z = nd.zeros((N, Hout, Wout, hf, wf, df, nf), ctx=self.ctx, dtype=self.dtype) #initialize container for precomputed forward messages
            for i in range(Hout):
                for j in range(Wout):
                    self.Z[:,i,j,...] = nd.expand_dims(self.W, axis=0) * nd.expand_dims(self.X[:, i*hstride:i*hstride+hf , j*wstride:j*wstride+wf , :], axis=4) # N, hf, wf, df, nf
                    self.Y[:,i,j,:] = self.Z[:,i,j,...].sum(axis=(1,2,3)) + self.B
        else:
            for i in range(Hout):
                for j in range(Wout):
                    self.Y[:,i,j,:] = nd.sum( nd.expand_dims( X[:, i*hstride:i*hstride+hf: , j*wstride:j*wstride+wf: , : ].transpose((1,2,3,0)), 4) * nd.expand_dims(self.W, 3), axis=(0,1,2))  + self.B

        return self.Y
 def __get_one_x_by_date(self, date):
     x_text = self.data_text_dict[date]
     print(u'text lenght : {}'.format(len(x_text)))
     x_digital_series = self.data_digital.loc[date]
     x_digital = x_digital_series.tolist()
     x_digital = nd.array(x_digital[:-1])
     y = x_digital_series['y_value']
     x_text, y = preprocess_imdb(x_text, y)
     # 扩维
     x_text = nd.expand_dims(x_text, axis = 0)
     x_digital = nd.expand_dims(x_digital, axis = 0)
     y = nd.expand_dims(y, axis = 0)
     return x_text, x_digital, y
Пример #21
0
    def __init__(self, d_model, dropout, max_len=5000):
        super(PositionalEncoding, self).__init__()
        self.dropout = nn.Dropout(dropout)

        # Compute the positional encodings once in log space.
        pe = nd.zeros((max_len, d_model), ctx=cfg.ctx)
        position = nd.expand_dims(nd.arange(0, max_len), 1)
        div_term = nd.exp(
            nd.arange(0, d_model, 2) * -(math.log(10000.0) / d_model))
        pe[:, 0::2] = nd.sin(position * div_term)
        pe[:, 1::2] = nd.cos(position * div_term)
        pe = nd.expand_dims(pe, 0)
        self.pe = pe  #register_buffer('pe', pe)
Пример #22
0
 def _cross_element_wise_mp(p, h):
     plen = p.shape[1]
     plen = h.shape[1]
     # order is important
     p_expand = nd.tile(
         nd.expand_dims(p, 2),
         [1, 1, plen, 1])  # (batch_size, seq_len, seq_len, embed_dim)
     h_expand = nd.tile(nd.expand_dims(p, 1),
                        [1, hlen, 1, 1])  # (32, 40, 40, 300)
     out = p_expand * h_expand
     if interact_dropout != 1:
         out = nn.Dropout(keep_rate)(out)
     return out
Пример #23
0
def refine_bbox_nd(bbox, bbox_delta, im_info=None, means=None, stds=None):

    xmin, ymin, xmax, ymax = nd.split(data=bbox, num_outputs=4, axis=1)
    bbox_width = xmax - xmin + 1.
    bbox_height = ymax - ymin + 1.
    center_x = 0.5 * (xmin + xmax)
    center_y = 0.5 * (ymin + ymax)

    bbox_delta_reshape = nd.Reshape(data=bbox_delta, shape=(0, -1, 4))
    dx, dy, dw, dh = nd.split(data=bbox_delta_reshape,
                              num_outputs=4,
                              axis=2,
                              squeeze_axis=1)
    if (means is not None) and (stds is not None):
        dx = dx * stds[0] + means[0]
        dy = dy * stds[1] + means[1]
        dw = dw * stds[2] + means[2]
        dh = dh * stds[3] + means[3]

    refine_center_x = nd.broadcast_add(lhs=center_x,
                                       rhs=nd.broadcast_mul(lhs=bbox_width,
                                                            rhs=dx))
    refine_center_y = nd.broadcast_add(lhs=center_y,
                                       rhs=nd.broadcast_mul(lhs=bbox_height,
                                                            rhs=dy))
    refined_width = nd.broadcast_mul(lhs=bbox_width, rhs=nd.exp(dw))
    refined_height = nd.broadcast_mul(lhs=bbox_height, rhs=nd.exp(dh))
    w_offset = 0.5 * (refined_width - 1.)
    h_offset = 0.5 * (refined_height - 1.)
    refined_xmin = nd.expand_dims(refine_center_x - w_offset, axis=1)
    refined_ymin = nd.expand_dims(refine_center_y - h_offset, axis=1)
    refined_xmax = nd.expand_dims(refine_center_x + w_offset, axis=1)
    refined_ymax = nd.expand_dims(refine_center_y + h_offset, axis=1)

    refined_bbox = nd.concat(refined_xmin,
                             refined_ymin,
                             refined_xmax,
                             refined_ymax,
                             dim=1)
    if im_info is not None:
        # assume im_info [[height, width, scale]] with shape (1,3)
        im_hw = nd.slice_axis(im_info, axis=1, begin=0, end=2)
        im_wh = nd.reverse(im_hw, axis=1)
        im_wh = im_wh - 1.
        im_wh = nd.tile(data=im_wh, reps=(1, 2))
        im_wh = nd.Reshape(im_wh, shape=(1, 4, 1))
        refined_bbox = nd.broadcast_minimum(lhs=refined_bbox, rhs=im_wh)
        refined_bbox = nd.broadcast_maximum(lhs=refined_bbox,
                                            rhs=nd.zeros_like(refined_bbox))
    # print refined_bbox.debug_str()
    return refined_bbox
 def Route(self, x):
     b_mat = nd.zeros((x.shape[0],1,self.num_cap, self.num_locations), ctx=x.context)
     x_expand = nd.expand_dims(nd.expand_dims(x, axis=2),2)
     w_expand = nd.repeat(nd.expand_dims(self.w_ij.data(x.context),axis=0), repeats=x.shape[0], axis=0)
     u_ = w_expand*x_expand
     u = nd.sum(u_, axis = 1)
     for i in range(self.route_num):
         c_mat = nd.softmax(b_mat, axis=2)
         s = nd.sum(u * c_mat, axis=-1)
         v = squash(s, 1)
         v1 = nd.expand_dims(v, axis=-1)
         update_term = nd.sum(u * v1, axis=1, keepdims=True)
         b_mat = b_mat + update_term
     return v
Пример #25
0
def make_dynamic_dec(T, values_L):

    values_T = nd.array(np.linspace(1, T, num=T), ctx=values_L.context)

    values_T = nd.expand_dims(nd.expand_dims(values_T, axis=0), axis=2)

    values_T = nd.broadcast_axis(values_T, axis=0, size=values_L.shape[0])

    values_TL = nd.batch_dot(values_T, values_L, transpose_b=True)

    values_sin = nd.sin(values_TL)
    values_cos = nd.cos(values_TL)

    return nd.concat(values_sin, values_cos, dim=2)
Пример #26
0
def data_iter(batch_size, dir_name, im_dir, gt_dir, ctx):
    dir_file = open(dir_name)
    lines = dir_file.readlines()
    indexs = list(range(len(lines)))
    random.shuffle(indexs)
    for i in range(0, len(indexs), batch_size):
        samples = np.array(indexs[i: min(i + batch_size, len(indexs))])

        if batch_size > 1:

            xs, ys = [], []
            for index in samples:
                # 获取路径
                file_name = lines[index]
                im_name, gt_name = file_name.split(' ')
                gt_name = gt_name.split('\n')[0]

                # 训练数据(图片)
                batch_xs = mx.image.imread(im_dir + im_name).astype('float32')
                batch_xs = batch_xs.transpose((2, 0, 1))

                # 训练数据 标签(密度图)
                batch_ys = nd.array(np.load(gt_dir + gt_name)).astype('float32')
                batch_ys = batch_ys.reshape([-1, batch_ys.shape[0], batch_ys.shape[1]])

                xs.append(batch_xs)
                ys.append(batch_ys)

            nd_xs = nd.stack(xs[0], xs[1])
            for j in range(2, len(xs)):
                nd_xs = nd.concat(nd_xs, nd.expand_dims(xs[j], 0), dim=0)

            nd_ys = nd.stack(ys[0], ys[1])
            for j in range(2, len(ys)):
                nd_ys = nd.concat(nd_ys, nd.expand_dims(ys[j], 0), dim=0)
            # print(nd_xs.shape, nd_ys.shape)
            yield nd_xs, nd_ys
        else:
            file_name = lines[samples[0]]
            im_name, gt_name = file_name.split(' ')
            gt_name = gt_name.split('\n')[0]

            # 训练数据(图片)
            batch_xs = mx.image.imread(im_dir + im_name).astype('float32')
            batch_xs = nd.expand_dims(batch_xs.transpose((2, 0, 1)), 0)

            # 训练数据 标签(密度图)
            batch_ys = nd.array(np.load(gt_dir + gt_name)).astype('float32')
            batch_ys = nd.expand_dims(batch_ys.reshape([-1, batch_ys.shape[0], batch_ys.shape[1]]), 0)
            yield batch_xs, batch_ys
Пример #27
0
def predict_transform(prediction, input_dim, anchors):

    ctx = prediction.context
    if not isinstance(anchors, nd.NDArray):
        anchors = nd.array(anchors, ctx=ctx)

    batch_size = prediction.shape[0]
    anchors_masks = [[6, 7, 8], [3, 4, 5], [0, 1, 2]]
    strides = [13, 26, 52]
    step = [(0, 507), (507, 2535), (2535, 10647)]
    for i in range(3):
	#pdb.set_trace()
        stride = strides[i]
        grid = np.arange(stride)
        a, b = np.meshgrid(grid, grid)
        x_offset = nd.array(a.reshape((-1, 1)), ctx=ctx)
        y_offset = nd.array(b.reshape((-1, 1)), ctx=ctx)
        x_y_offset = \
            nd.repeat(
                nd.expand_dims(
                    nd.repeat(
                        nd.concat(
                            x_offset, y_offset, dim=1), repeats=3, axis=0
                    ).reshape((-1, 2)),
                    0
                ),
                repeats=batch_size, axis=0
            )
        tmp_anchors = \
            nd.repeat(
                nd.expand_dims(
                    nd.repeat(
                        nd.expand_dims(
                            anchors[anchors_masks[i]], 0
                        ),
                        repeats=stride * stride, axis=0
                    ).reshape((-1, 2)),
                    0
                ),
                repeats=batch_size, axis=0
            )

        prediction[:, step[i][0]:step[i][1], :2] += x_y_offset
        prediction[:, step[i][0]:step[i][1], :2] *= (float(input_dim) / stride)
        prediction[:, step[i][0]:step[i][1], 2:4] = \
            nd.exp(prediction[:, step[i][0]:step[i][1], 2:4]) * tmp_anchors

    return prediction
Пример #28
0
def batch_loss(encoder, sent_rnn, X, Y, vocab, loss, ctx):

    batch_size = X.shape[1]
    sentence_hidden, doc_encode = encoder(X)
    sentence_hidden = nd.transpose(sentence_hidden, axes=(1, 0, 2))

    # 我们将使用掩码变量mask来忽略掉标签为填充项PAD的损失
    # mask, num_not_pad_tokens = nd.ones(shape=(batch_size,), ctx=ctx), 0
    l = nd.array([0], ctx=ctx)

    # 以前所有步
    previous = sentence_hidden[0]

    # sent_hidden: (batch_size, hidden)
    for sent_hidden, y in zip(sentence_hidden, Y.T):

        y_h = sent_rnn(sent_hidden, previous, doc_encode)
        y_h = nd.squeeze(y_h)

        los = loss(y_h, y).sum()
        # print('los', los)
        l = l + los

        # 公式 7,这里使用强制教学
        y = nd.expand_dims(y, -1)
        previous = previous + sent_hidden * y

    return l / batch_size
Пример #29
0
def getSelfMask(q_seq):
    batch_size, seq_len = q_seq.shape
    mask_matrix = np.ones(shape=(seq_len, seq_len), dtype=np.float)
    mask = np.tril(mask_matrix, k=0)
    mask = nd.expand_dims(nd.array(mask, ctx=ghp.ctx), axis=0)
    mask = nd.broadcast_axes(mask, axis=0, size=batch_size)
    return mask
Пример #30
0
    def decode(self, targets, encoder_outputs, attention_bias):
        """Generate logits for each value in the target sequence.

            Args:
              targets: target values for the output sequence.
                int tensor with shape [batch_size, target_length]
              encoder_outputs: continuous representation of input sequence.
                float tensor with shape [batch_size, input_length, hidden_size]
              attention_bias: float tensor with shape [batch_size, 1, 1, input_length]

            Returns:
              float32 tensor with shape [batch_size, target_length, vocab_size]
        """
        decoder_inputs = self.embedding_softmax_layer(targets)
        decoder_inputs = nd.expand_dims(decoder_inputs, axis=0)
        decoder_inputs = nd.pad(data=decoder_inputs,
                                mode="constant",
                                constant_value=0,
                                pad_width=(0, 0, 0, 0, 1, 0, 0, 0))
        decoder_inputs = nd.reshape(data=decoder_inputs,
                                    shape=decoder_inputs.shape[1:])[:, :-1, :]

        length = decoder_inputs.shape[1]
        decoder_inputs = decoder_inputs + model_utils.get_position_encoding(
            length, self.param.hidden_size, targets.context)
        if self.train:
            decoder_inputs = self.dropout_output(decoder_inputs)

        decoder_self_attention_bias = model_utils.get_decoder_self_attention_bias(
            length, targets.context)
        outputs = self.decoder_stack(decoder_inputs, encoder_outputs,
                                     decoder_self_attention_bias,
                                     attention_bias)
        logits = self.embedding_softmax_layer.linear(outputs)
        return logits
Пример #31
0
 def log_prob(self, x: nd.NDArray) -> nd.NDArray:
     mean = self.get_param_maybe_repeated('mean')
     if x.ndim > mean.ndim:
         mean = nd.expand_dims(mean, 0)
     np_x = x.asnumpy().astype(np.int32).astype(np.float32)
     np.testing.assert_almost_equal(x.asnumpy(), np_x)
     return x * nd.log(mean) - mean - nd.gammaln(x + 1.)
Пример #32
0
 def _prepare_data_pattern(self):
     if self._in is None:
         raise RuntimeError('Block has not yet executed forward_logged!')
     for x,y in zip(self._in[0], self._out):
         # -> patch_size x number_of_patches -> transposed
         x = im2col_indices(nd.expand_dims(x, 0), self._kwargs['kernel'][0], self._kwargs['kernel'][1], self._kwargs['pad'][0], self._kwargs['stride'][0]).T
         # -> outsize x number_of_patches -> transposed
         y = y.flatten().T
         yield x, y
    def _epsilon_lrp_slow(self,R,epsilon):
        '''
        LRP according to Eq(58) in DOI: 10.1371/journal.pone.0130140
        This function shows all necessary operations to perform LRP in one place and is therefore not optimized
        '''

        N,Hout,Wout,NF = R.shape
        hf,wf,df,NF = self.W.shape
        hstride, wstride = self.stride

        Rx = nd.zeros_like(self.X,ctx=self.ctx, dtype=self.dtype)

        for i in range(Hout):
            for j in range(Wout):
                Z = nd.expand_dims(self.W, axis=0) * nd.expand_dims(self.X[:, i*hstride:i*hstride+hf , j*wstride:j*wstride+wf , :], 4)
                Zs = Z.sum(axis=(1,2,3),keepdims=True) + nd.expand_dims(nd.expand_dims(nd.expand_dims(nd.expand_dims(self.B, 0), 0), 0), 0)
                Zs += epsilon*((Zs >= 0)*2-1)
                Rx[:,i*hstride:i*hstride+hf: , j*wstride:j*wstride+wf: , : ] += ((Z/Zs) * nd.expand_dims(R[:,i:i+1,j:j+1,:], axis=3) ).sum(axis=4)
        return Rx
    def _epsilon_lrp(self,R,epsilon):
        '''
        LRP according to Eq(58) in DOI: 10.1371/journal.pone.0130140
        '''

        N,Hout,Wout,NF = R.shape
        hf,wf,df,NF = self.W.shape
        hstride, wstride = self.stride

        Rx = nd.zeros_like(self.X,ctx=self.ctx, dtype=self.dtype)
        R_norm = R / (self.Y + epsilon*((self.Y >= 0)*2 - 1.))

        for i in range(Hout):
            for j in range(Wout):
                if self.lrp_aware:
                    Z = self.Z[:,i,j,...]
                else:
                    Z = nd.expand_dims(self.W, axis=0) * nd.expand_dims(self.X[:, i*hstride:i*hstride+hf , j*wstride:j*wstride+wf , : ], axis=4)
                Rx[:,i*hstride:i*hstride+hf: , j*wstride:j*wstride+wf: , : ] += (Z * ( nd.expand_dims(R_norm[:,i:i+1,j:j+1,:], axis=3) )).sum(axis=4)
        return Rx
    def update(self,lrate):
        N,Hx,Wx,Dx = self.X.shape
        N,Hy,Wy,NF = self.DY.shape

        hf,wf,df,NF = self.W.shape
        hstride, wstride = self.stride

        DW = nd.zeros_like(self.W,ctx=self.ctx, dtype=self.dtype)

        if not (hf == wf and self.stride == (1,1)):
            for i in range(Hy):
                for j in range(Wy):
                    DW += ( nd.expand_dims(self.X[:, i*hstride:i*hstride+hf , j*wstride:j*wstride+wf , :], axis=4) * nd.expand_dims(self.DY[:,i:i+1,j:j+1,:], axis=3)).sum(axis=0)
        else:
            for i in range(hf):
                for j in range(wf):
                    DW[i,j,:,:] = nd.sum( nd.expand_dims(self.X[:,i:i+Hy:hstride,j:j+Wy:wstride,:], axis=4) * nd.expand_dims(self.DY, axis=3) ,axis=(0,1,2))

        DB = self.DY.sum(axis=(0,1,2))
        self.W -= lrate * DW / (hf*wf*df*Hy*Wy)**.5
        self.B -= lrate * DB / (Hy*Wy)**.5
    def _alphabeta_lrp(self,R,alpha):
        '''
        LRP according to Eq(60) in DOI: 10.1371/journal.pone.0130140
        '''

        beta = 1 - alpha

        N,Hout,Wout,NF = R.shape
        hf,wf,df,NF = self.W.shape
        hstride, wstride = self.stride

        Rx = nd.zeros_like(self.X,ctx = self.ctx)

        for i in range(Hout):
            for j in range(Wout):
                if self.lrp_aware:
                    Z = self.Z[:,i,j,...]
                else:
                    Z = nd.expand_dims(self.W, axis=0) * nd.expand_dims(self.X[:, i*hstride:i*hstride+hf , j*wstride:j*wstride+wf , :], axis=4)

                Zplus = Z > 0 #index mask of positive forward predictions

                if alpha * beta != 0 : #the general case: both parameters are not 0
                    Zp = Z * Zplus
                    Zsp = Zp.sum(axis=(1,2,3),keepdims=True) + nd.expand_dims(nd.expand_dims(nd.expand_dims(nd.expand_dims(self.B * (self.B > 0), axis=0), axis=0), axis=0), axis=0) + 1e-16

                    Zn = Z - Zp
                    Zsn = nd.expand_dims(self.Y[:,i:i+1,j:j+1,:], axis=3) - Zsp - 1e-16

                    Rx[:,i*hstride:i*hstride+hf: , j*wstride:j*wstride+wf: , : ] += ((alpha * (Zp/Zsp) + beta * (Zn/Zsn))* nd.expand_dims(R[:,i:i+1,j:j+1,:], axis=3)).sum(axis=4)

                elif alpha: #only alpha is not 0 -> alpha = 1, beta = 0
                    Zp = Z * Zplus
                    Zsp = Zp.sum(axis=(1,2,3),keepdims=True) + nd.expand_dims(nd.expand_dims(nd.expand_dims(nd.expand_dims(self.B * (self.B > 0), axis=0), axis=0), axis=0), axis=0) + 1e-16
                    Rx[:,i*hstride:i*hstride+hf: , j*wstride:j*wstride+wf: , : ] += (Zp*( nd.expand_dims(R[:,i:i+1,j:j+1,:], axis=3) /Zsp)).sum(axis=4)

                elif beta: # only beta is not 0 -> alpha = 0, beta = 1
                    Zn = Z * (Z < 0)
                    Zsn = Zn.sum(axis=(1,2,3),keepdims=True) + nd.expand_dims(nd.expand_dims(nd.expand_dims(nd.expand_dims(self.B * (self.B < 0), axis=0), axis=0), axis=0), axis=0) + 1e-16
                    Rx[:,i*hstride:i*hstride+hf: , j*wstride:j*wstride+wf: , : ] += (Zn*( nd.expand_dims(R[:,i:i+1,j:j+1,:], axis=3) /Zsn)).sum(axis=4)

                else:
                    raise Exception('This case should never occur: alpha={}, beta={}.'.format(alpha, beta))

        return Rx
    def _ww_lrp(self,R):
        '''
        LRP according to Eq(12) in https://arxiv.org/pdf/1512.02479v1.pdf
        '''

        N,Hout,Wout,NF = R.shape
        hf,wf,df,NF = self.W.shape
        hstride, wstride = self.stride

        Rx = nd.zeros_like(self.X,ctx = self.ctx)

        for i in range(Hout):
            for j in range(Wout):
                Z = nd.expand_dims(self.W, 0)**2
                Zs = Z.sum(axis=(1,2,3),keepdims=True)

                Rx[:,i*hstride:i*hstride+hf: , j*wstride:j*wstride+wf: , : ] += ((Z/Zs) * nd.expand_dims(R[:,i:i+1,j:j+1,:], axis=3)).sum(axis=4)
        return Rx
    def backward(self,DY):
        '''
        Backward-passes an input error gradient DY towards the input neurons of this layer.

        Parameters
        ----------

        DY :    mxnet.ndarray.ndarray.NDArray
                an error gradient shaped same as the output array of forward, i.e. (N,Hy,Wy,Dy) with
                N = number of samples in the batch
                Hy = heigth of the output
                Wy = width of the output
                Dy = output depth = input depth


        Returns
        -------

        DX :    mxnet.ndarray.ndarray.NDArray
                the error gradient propagated towards the input

        '''

        self.DY = DY
        N,Hy,Wy,NF = DY.shape
        hf,wf,df,NF = self.W.shape
        hstride, wstride = self.stride

        DX = nd.zeros_like(self.X,ctx=self.ctx, dtype=self.dtype)


        if not (hf == wf and self.stride == (1,1)):
            for i in range(Hy):
                for j in range(Wy):
                    DX[:,i*hstride:i*hstride+hf , j*wstride:j*wstride+wf , : ] += ( nd.expand_dims(self.W, axis=0) * nd.expand_dims(DY[:,i:i+1,j:j+1,:], axis=3) ).sum(axis=4)  #sum over all the filters
        else:
            for i in range(hf):
                for j in range(wf):
                    DX[:,i:i+Hy:hstride,j:j+Wy:wstride,:] += nd.dot(DY,self.W[i,j,:,:].T)

        return DX #* (hf*wf*df)**.5 / (NF*Hy*Wy)**.5
Пример #39
0
def test_expand_dims():
    a = nd.ones(shape=(LARGE_X, SMALL_Y))
    res = nd.expand_dims(a, axis=1)
    assert res.shape == (a.shape[0], 1, a.shape[1])
    def _alphabeta_lrp_slow(self,R,alpha):
        '''
        LRP according to Eq(60) in DOI: 10.1371/journal.pone.0130140
        This function shows all necessary operations to perform LRP in one place and is therefore not optimized
        '''

        beta = 1 - alpha

        N,Hout,Wout,NF = R.shape
        hf,wf,df,NF = self.W.shape
        hstride, wstride = self.stride

        Rx = nd.zeros_like(self.X,ctx = self.ctx)

        for i in range(Hout):
            for j in range(Wout):
                Z = nd.expand_dims(self.W, axis=0) * nd.expand_dims(self.X[:, i*hstride:i*hstride+hf , j*wstride:j*wstride+wf , :], axis=4)

                if not alpha == 0:
                    Zp = Z * (Z > 0)
                    Bp = nd.expand_dims(nd.expand_dims(nd.expand_dims(nd.expand_dims(self.B * (self.B > 0), axis=0), axis=0), axis=0), axis=0)
                    Zsp = Zp.sum(axis=(1,2,3),keepdims=True) + Bp
                    Ralpha = alpha * ((Zp/Zsp) *  nd.expand_dims(R[:,i:i+1,j:j+1,:], axis=3) ).sum(axis=4)
                else:
                    Ralpha = 0

                if not beta == 0:
                    Zn = Z * (Z < 0)
                    Bn = nd.expand_dims(nd.expand_dims(nd.expand_dims(nd.expand_dims(self.B * (self.B < 0), axis=0), axis=0), axis=0), axis=0)
                    Zsn = Zn.sum(axis=(1,2,3),keepdims=True) + Bn
                    Rbeta = beta * ((Zn/Zsn) * nd.expand_dims(R[:,i:i+1,j:j+1,:], axis=3) ).sum(axis=4)
                else:
                    Rbeta = 0

                Rx[:,i*hstride:i*hstride+hf: , j*wstride:j*wstride+wf: , : ] += Ralpha + Rbeta

        return Rx
    def _flat_lrp(self,R):
        '''
        distribute relevance for each output evenly to the output neurons' receptive fields.
        '''

        N,Hout,Wout,NF = R.shape
        hf,wf,df,NF = self.W.shape
        hstride, wstride = self.stride

        Rx = nd.zeros_like(self.X,ctx = self.ctx)

        for i in range(Hout):
            for j in range(Wout):
                Z = nd.ones((N,hf,wf,df,NF), ctx=self.ctx, dtype=self.dtype)
                Zs = Z.sum(axis=(1,2,3),keepdims=True)

                Rx[:,i*hstride:i*hstride+hf: , j*wstride:j*wstride+wf: , : ] += ((Z/Zs) * nd.expand_dims(R[:,i:i+1,j:j+1,:], axis=3) ).sum(axis=4)
        return Rx
Пример #42
0
def test_squeeze():
    a = nd.ones(shape=(LARGE_X, SMALL_Y))
    data = nd.expand_dims(a, axis=1)
    res = nd.squeeze(data)
    assert res.shape == a.shape