def forward(self, inputs):
xp = cuda.get_array_module(inputs[0])
self.input_length = inputs[0]
length_unigram = inputs[1]
label_unigram = inputs[2]
label_bigram = inputs[3]
length_bigram = length_unigram
xs = inputs[4:]
if chainer.is_debug():
# batch size check.
assert len(xs[0]) == len(label_unigram)
assert len(xs[0]) == len(self.input_length)
assert len(xs[0]) == len(length_unigram)
# length check.
assert len(xs) >= xp.max(self.input_length)
assert len(label_unigram[0]) >= xp.max(length_unigram)
# unit check
assert xs[0].shape[1] > xp.max(label_unigram)
assert xs[0].shape[1] > xp.max(label_bigram)
assert xs[0].shape[1] > self.blank_symbol
self.path_length = length_unigram * 3 + 1
yseq_shape = (len(xs),) + xs[0].shape
self.yseq = _softmax(xp.vstack(xs).reshape(yseq_shape), xp)
log_yseq = _log_matrix(self.yseq, xp, self.zero_padding)
self.path = _label_to_path(label_unigram, label_bigram, self.blank_symbol, xp)
self.prob_trans = _compute_transition_probability(log_yseq, self.input_length,
label_unigram, length_unigram, label_bigram, length_bigram, self.path, self.path_length, xp, self.zero_padding)
loss = -_logsumexp(self.prob_trans[0], xp, axis=1)
if self.reduce == 'mean':
loss = utils.force_array(xp.mean(loss))
return loss,
评论列表
文章目录