def __call__(self, chars):
xp = self.xp
if not isinstance(chars, (tuple, list)):
chars = [chars]
lengths = [len(_chars) for _chars in chars]
n_words = len(lengths)
pad_width = self._pad_width
char_ids = F.PadSequence(length=max(lengths) + pad_width,
padding=self._pad_id).forward(chars)[0]
left_pads = xp.full((n_words, pad_width), self._pad_id, xp.int32)
char_ids = xp.concatenate((left_pads, xp.array(char_ids)), axis=1)
"""note: cupy does not have `inf`."""
mask = xp.full(char_ids.shape, np.inf)
for i, length in enumerate(lengths):
mask[i, pad_width:pad_width + length] = 0
mask = xp.expand_dims(mask, axis=2)
xs = self.embed(char_ids)
xs = F.dropout(xs, self._dropout)
C = self.conv(F.expand_dims(xs, axis=1))
C = F.transpose(F.squeeze(C, axis=3), (0, 2, 1))
"""
assert C.shape == (n_words,
pad_width + max(lengths) + pad_width,
self.out_size)
"""
ys = F.max(C - mask, axis=1)
return ys
评论列表
文章目录