В сетях указателей логиты вывода превышают длину входов. Работа с такими пакетами означает заполнение входных данных до максимальной длины пакетных входов. Теперь все в порядке, пока мы не посчитаем потери. В настоящее время я делаю следующее:
logits = stabilize(logits(inputs)) #[batch, max_length]. subtract max(logits) to stabilize
masks = masks(inputs) #[batch, max_length]. 1 for actual inputs, 0 for padded locations
exp_logits = exp(logits)
exp_logits_masked = exp_logits*masks
probs = exp_logits_masked/sum(exp_logits_masked)
Теперь я использую эти вероятности для вычисления кросс-энтропии.
cross_entropy = sum_over_batches(probs[correct_class])
Могу я сделать лучше, чем это? Любые идеи о том, как это обычно делается парнями, имеющими дело с указательными сетями?
Если бы у меня не было входов переменного размера, всего этого можно было бы достичь с помощью вызываемого tf.nn.softmax_cross_entropy_with_logits
на логитах и метках (что сильно оптимизировано), но это при переменной длине привело бы к ошибочным результатам, поскольку вычисление softmax имеет знаменатель больше на 1 для каждого заполнения во входных данных.