Beispiel #1
0
 def apply(self, x):     # x: (batsize, seqlen)
     emb = self.E[x]     # (batsize, seqlen, inpembdim)
     outs = T.tensordot(emb, self.W, 1)  # (batsize, seqlen, outdim)
     outsf = outs.reshape((outs.shape[0] * outs.shape[1], outs.shape[2]))    # (batsize*seqlen, outdim)
     outsfsm = Softmax()(outsf)
     ret = outsfsm.reshape(outs.shape)   # (batsize, seqlen, outdim)
     return ret
Beispiel #2
0
 def apply(self, x, mask=None):  # (batsize, seqlen, dim)
     mask = x.mask if mask is None else mask
     if mask is not None:
         assert (mask.ndim == x.ndim - 1)  # mask must be (batsize, seqlen)
         realm = T.cast(
             T.tensordot(mask, T.ones((x.shape[-1], ), dtype="int32"), 0),
             "float32")
         x = x * realm
     input = x.dimshuffle(0, 2, 1, 'x')
     input_shape = None  #input.shape
     convout = T.nnet.conv2d(input,
                             self.filter,
                             input_shape,
                             self.filter_shape,
                             border_mode=self.border_mode,
                             subsample=(self.stride, 1),
                             filter_flip=self.filter_flip)
     ret = convout[:, :, :, 0].dimshuffle(0, 2, 1)
     if mask is not None:  # compute new mask
         print "conving the mask"
         mask_shape = None
         maskout = T.nnet.conv2d(T.cast(mask.dimshuffle(0, "x", 1, "x"),
                                        "float32"),
                                 self.maskfilter,
                                 mask_shape,
                                 self.maskfilter_shape,
                                 border_mode=self.border_mode,
                                 subsample=(self.stride, 1),
                                 filter_flip=self.filter_flip)
         mask = T.cast(maskout[:, 0, :, 0] > 0, "int32")
     ret.mask = mask
     return ret
Beispiel #3
0
 def apply_mask(cls, xseq, maskseq=None):
     if maskseq is None:
         ret = xseq
     else:
         mask = T.tensordot(maskseq, T.ones((xseq.shape[2],)), 0)  # f32^(batsize, seqlen, outdim) -- maskseq stacked
         ret = mask * xseq
     return ret
Beispiel #4
0
 def apply(self, x):  # x: (batsize, seqlen)
     emb = self.E[x]  # (batsize, seqlen, inpembdim)
     outs = T.tensordot(emb, self.W, 1)  # (batsize, seqlen, outdim)
     outsf = outs.reshape((outs.shape[0] * outs.shape[1],
                           outs.shape[2]))  # (batsize*seqlen, outdim)
     outsfsm = Softmax()(outsf)
     ret = outsfsm.reshape(outs.shape)  # (batsize, seqlen, outdim)
     return ret
Beispiel #5
0
 def applymask(cls, xseq, maskseq=None):
     if maskseq is None:
         ret = xseq
     else:
         mask = T.tensordot(maskseq, T.ones((xseq.shape[2],)), 0)  # f32^(batsize, seqlen, outdim) -- maskseq stacked
         masker = T.concatenate([T.ones((xseq.shape[0], xseq.shape[1], 1)), T.zeros((xseq.shape[0], xseq.shape[1], xseq.shape[2] - 1))], axis=2)  # f32^(batsize, seqlen, outdim) -- gives 100% prob to output 0
         ret = xseq * mask + masker * (1.0 - mask)
     return ret
Beispiel #6
0
 def apply(self, x):
     emb = self.recembed(x) if self.scanemb else self.E[
         x]  # (batsize, seqlen, inpembdim)
     outs = self.recout(emb) if self.scanout else T.tensordot(
         emb, self.W, 1)
     ret = self.recret(outs) if self.scansm else Softmax()(outs.reshape(
         (outs.shape[0] * outs.shape[1],
          outs.shape[2]))).reshape(outs.shape)  # (batsize*seqlen, outdim)
     return ret
Beispiel #7
0
 def applymask(cls, xseq, maskseq):
     if maskseq is None:
         return xseq
     else:
         mask = T.tensordot(maskseq, T.ones((xseq.shape[2],)), 0)  # f32^(batsize, seqlen, outdim) -- maskseq stacked
         masker = T.concatenate(
             [T.ones((xseq.shape[0], xseq.shape[1], 1)),
              T.zeros((xseq.shape[0], xseq.shape[1], xseq.shape[2] - 1))],
             axis=2)  # f32^(batsize, seqlen, outdim) -- gives 100% prob to output 0
         ret = xseq * mask + masker * (1.0 - mask)
         return ret
Beispiel #8
0
 def apply(self, x, mask=None):  # (batsize, seqlen, dim)
     mask = x.mask if mask is None else mask
     if mask is not None:
         assert (mask.ndim == x.ndim - 1)
         realm = T.tensordot(mask, T.ones((x.shape[-1], )), 0)
         if self.mode == "max":
             x = T.switch(realm, x, np.infty * (realm - 1))
         else:
             x = x * realm
     if self.mode == "max":
         ret = T.max(x, axis=-2)
     elif self.mode == "sum":
         ret = T.sum(x, axis=-2)
     elif self.mode == "avg":
         ret = T.sum(x, axis=-2) / x.shape[-2]
     else:
         raise Exception("unknown pooling mode: {:3s}".format(self.mode))
     # ret: (batsize, dim)
     if mask is not None:
         mask = 1 * (T.sum(mask, axis=-1) > 0)
         ret = T.switch(T.tensordot(mask, T.ones((x.shape[-1], )), 0), ret,
                        T.zeros_like(ret))
         ret.mask = mask
     return ret
Beispiel #9
0
 def _get_apply_outputs(self, final, outputs, states, mask):
     ret = []
     if "enc" in self._return:       # final states of topmost layer
         ret.append(final)
     if "all" in self._return:       # states (over all time) of topmost layer
         rete = outputs       # (batsize, seqlen, dim) --> zero-fy according to mask
         if self._maskconfig.maskset == MaskSetMode.ZERO and mask is not None:
             fmask = T.tensordot(mask, T.ones((outputs.shape[2],)), 0)
             rete = rete * fmask
         ret.append(rete)
     if "states" in self._return:    # final states (over all layers)???
         pass # TODO: do we need to support this?
     if "mask" in self._return:
         ret.append(mask)
     if len(ret) == 1:
         return ret[0]
     else:
         return ret
Beispiel #10
0
 def apply(self, x):
     emb = self.recembed(x) if self.scanemb else self.E[x]     # (batsize, seqlen, inpembdim)
     outs = self.recout(emb) if self.scanout else T.tensordot(emb, self.W, 1)
     ret = self.recret(outs) if self.scansm else Softmax()(outs.reshape((outs.shape[0] * outs.shape[1], outs.shape[2]))).reshape(outs.shape)    # (batsize*seqlen, outdim)
     return ret