Выборка кандидатов с несколькими метками переменного размера в тензорном потоке?
nce_loss()
просит статический int
значение для num_true
, Это хорошо работает для задач, когда у нас одинаковое количество меток на пример обучения, и мы знаем это заранее.
Когда метки имеют переменную форму [None]
и в зависимости от размера ведра .padded_batch()
+ .group_by_window()
необходимо предоставить переменный размер num_true
для того, чтобы освоить все учебные примеры. На данный момент это не поддерживается моими знаниями (поправьте меня, если я ошибаюсь).
Другими словами, предположим, что у нас есть либо набор данных изображений с произвольным количеством меток на каждое изображение (собака, кошка, утка и т. Д.), Либо набор текстовых данных с несколькими множественными классами в предложении (class_1, class_2, ..., class_n). Классы НЕ являются взаимоисключающими и могут различаться по размеру между примерами. Но так как количество возможных меток может быть огромным, от 10 до 100 тыс., Существует ли возможность потери выборки для повышения производительности (по сравнению с sigmoid_cross_entropy
)?
Есть ли правильный способ сделать это или любые другие обходные пути?
nce_loss = tf.nn.nce_loss(
weights=nce_weights,
biases=nce_biases,
labels=labels,
inputs=inputs,
num_sampled=num_sampled,
# Something like this:
# `num_true=(tf.shape(labels)[-1])` instead of `num_true=const_int`
# , would be preferable here
num_classes=self.num_classes)
0 ответов
Я вижу две проблемы: 1) Работа с NCE с разным количеством истинных значений; 2) Классы, которые НЕ являются взаимоисключающими.
По первому вопросу, как сказал @michal, ожидается включение этой функции в будущем. Я пробовал почти то же самое: использовать метки сshape=(None, None)
, т.е. true_values
измерение None
. Вsampled_values
параметр имеет ту же проблему: true_values
число должно быть фиксированным целым числом. Рекомендуемая работа - использовать класс (0
лучший) представляющий <PAD>
и заполните количество true_values
. В моем случае,0
специальный токен, который представляет <PAD>
. Часть кода здесь:
assert len(labels) <= (window_size * 2)
zeros = ((window_size * 2) - len(labels)) * [0]
labels = labels + zeros
labels.sort()
Я отсортировал ярлык, потому что учитывая другую рекомендацию:
Примечание. По умолчанию для выборки используется равномерное логарифмическое (Zipfian) распределение, поэтому для достижения хороших результатов ваши метки должны быть отсортированы в порядке убывания частоты.
В моем случае специальные токены и более часто встречающиеся слова имеют более низкие индексы, в противном случае менее частые слова имеют более высокие индексы. Я включил все классы меток, связанных с вводом, одновременно и завершил с нуля доtrue_values
количество. Конечно, вы должны игнорировать0
класс в конце.