Exemplo n.º 1
0
    def ff(self, act, phase):
        if self.group == 1:
            self.ff_act = act
            return self.convolver.ff(act, self.weight, self.bias)
        else:
            #slice data
            self.group_data = []
            group_result = []
            self.group_filter = []
            self.group_bias = []

            data_concat_dim = 2
            filter_concat_dim = 3
            bias_concat_dim = 0
            data_slice_count = act.shape[data_concat_dim] / self.group
            filter_slice_count = self.weight.shape[
                filter_concat_dim] / self.group
            for i in xrange(self.group):
                self.group_data.append(
                    owl.slice(act, data_concat_dim, data_slice_count * i,
                              data_slice_count))
                self.group_filter.append(
                    owl.slice(self.weight, filter_concat_dim,
                              filter_slice_count * i, filter_slice_count))
                self.group_bias.append(
                    owl.slice(self.bias, bias_concat_dim,
                              filter_slice_count * i, filter_slice_count))
                group_result.append(
                    self.convolver.ff(self.group_data[i], self.group_filter[i],
                                      self.group_bias[i]))
            #concat
            return owl.concat(group_result, data_concat_dim)
Exemplo n.º 2
0
 def backward(self, from_top, to_btm, phase):
     st_off = 0
     for i in range(len(self.btm_names)):
         to_btm[self.btm_names[i]] = owl.slice(from_top[self.top_names[0]],
                                               self.concat_dim, st_off,
                                               self.slice_count[i])
         st_off += self.slice_count[i]
Exemplo n.º 3
0
 def backward(self, from_top, to_btm, phase):
     st_off = 0
     for i in range(len(self.btm_names)):
         to_btm[self.btm_names[i]] = owl.slice(
             from_top[self.top_names[0]], self.concat_dim, st_off, self.slice_count[i]
         )
         st_off += self.slice_count[i]
Exemplo n.º 4
0
    def bp(self, sen):
        if self.group == 1:
            self.weightgrad = self.convolver.weight_grad(
                sen, self.ff_act, self.weight)
            self.biasgrad = self.convolver.bias_grad(sen)
            return self.convolver.bp(sen, self.ff_act, self.weight)
        else:
            #slice data
            group_sen = []
            group_wgrad = []
            group_bgrad = []
            group_result = []

            data_concat_dim = 2
            filter_concat_dim = 3
            bias_concat_dim = 0
            data_slice_count = sen.shape[data_concat_dim] / self.group
            filter_slice_count = self.weight.shape[
                filter_concat_dim] / self.group
            for i in xrange(self.group):
                group_sen.append(
                    owl.slice(sen, data_concat_dim, data_slice_count * i,
                              data_slice_count))
                group_wgrad.append(
                    self.convolver.weight_grad(group_sen[i],
                                               self.group_data[i],
                                               self.group_filter[i]))
                group_bgrad.append(self.convolver.bias_grad(group_sen[i]))
                group_result.append(
                    self.convolver.bp(group_sen[i], self.group_data[i],
                                      self.group_filter[i]))
            #concat
            self.weightgrad = owl.concat(group_wgrad, filter_concat_dim)
            self.biasgrad = owl.concat(group_bgrad, bias_concat_dim)

            #free space
            self.group_data = []
            self.group_filter = []
            self.group_bias = []
            return owl.concat(group_result, data_concat_dim)