Выборка кандидатов с несколькими метками переменного размера в тензорном потоке?

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 класс в конце.

Другие вопросы по тегам