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
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
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
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
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
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
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
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
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