def categorical_crossentropy(logit, y, mask, length_var, need_softmax=False):
logit_shp = logit.shape
# (n_samples, n_timesteps_f, n_labels)
# softmax, predict label prob
# (n_samples * n_timesteps_f, n_labels)
if need_softmax:
probs = T.nnet.softmax(logit.reshape([logit_shp[0]*logit_shp[1], logit_shp[2]]))
else:
probs = logit.reshape([logit_shp[0]*logit_shp[1], logit_shp[2]])
# (n_samples * n_timesteps_f)
y_flat = y.flatten()
# clip to avoid nan loss
probs = T.clip(probs, _EPSILON, 1.0 - _EPSILON)
loss = lasagne.objectives.categorical_crossentropy(probs, y_flat)
# (n_samples, n_timesteps_f)
loss = loss.reshape((logit_shp[0], logit_shp[1]))
loss = loss * mask
loss = T.sum(loss, axis=1) / length_var
probs = probs.reshape(logit_shp)
return loss, probs
评论列表
文章目录