Как я могу проверить аргумент plot_ids в tf.unsorted_segments_max? - PullRequest
4 голосов
/ 13 мая 2019

В TensorFlow 1.12 вы можете использовать tf.math.unsorted_segment_sum для вычисления максимума по сегментам тензора.

Один из аргументов:

сегмент_ид. : Тензор.Должен быть одного из следующих типов: int32, int64.Тензор, форма которого является префиксом data.shape.END} out_arg {name: "output" description: << END Имеет ту же форму, что и данные, за исключением первых измерений сегмент_ids.rank, которые заменяются одним измерением, которое имеетsize num_segments. </em>

Q1: Я не понимаю, что это значит.Я предполагаю, что segment_ids должно быть [0,1,2,3,...], а серийный номер начинается с 0.

Затем я попытался проверить мое предположение, проверив с различными значениями для segment_ids:

print(sess.run(tf.unsorted_segment_max(tf.constant([0.1, 0.2, 0.3, 0.3, 0.4]),
                                       tf.constant([2, 0, 1, 1, 0]), 3)))
#[0.4 0.3 0.1], correct
print(sess.run(tf.unsorted_segment_max(tf.constant([0.1, 0.2, 0.3, 0.3, 0.4]),
                                       tf.constant([3, 0, 1, 1, 0]), 3)))
#[ 4.0000001e-01  3.0000001e-01 -3.4028235e+38], number 2 worked, but 3 didnt
print(sess.run(tf.unsorted_segment_max(tf.constant([0.1, 0.2, 0.3, 0.3, 0.4]),
                                       tf.constant([3, 0, 1, 1, 0]), 4)))
#[ 4.0000001e-01  3.0000001e-01 -3.4028235e+38  1.0000000e-01], num_segments didnt help
print(sess.run(tf.unsorted_segment_sum(tf.constant([0.1, 0.2, 0.3, 0.3, 0.4]),
                                       tf.constant([3, 0, 1, 1, 0]), 4)))
#[0.6 0.6 0.  0.1], while num_segments worked on sum.

Из Ex3 и Ex4 я заметил, что segment_ids в tf.unsorted_segment_max() получил дополнительное ограничение, отличное от tf.unsorted_segment_sum(), и я полагаю, что оно последовательно от 0. Ex3 должно иметь [0.4 0.3 0. 0.1]

Из Ex1 и Ex2,Я замечаю, что результат Ex1 правильный, в то время как Ex2 должен иметь [0.4 0.3 0.], и нет предупреждения или ошибки, если ввод segment_ids недействителен.

Q2: Как я могу проверить мойsegment_ids чтобы увидеть, соответствует ли это требованиям?

Q3: Если мой segment_ids не соответствует требованию, например [3, 0, 1, 1, 0], что я могу сделать, чтобы сделать unsorted_segments_max work * * 1045

1 Ответ

1 голос
/ 13 мая 2019

A1: Для одномерного случая выходной тензор будет иметь столько элементов, сколько указано в num_segments. Каждый элемент i будет результатом операции (например, max, sum, ...), примененной ко всем элементам в data, обозначенным позицией j, для которой segment_ids[j] == i. segment_ids может быть любым числом и не обязательно начинаться с 0. Тем не менее выходные данные будут содержать num_segments элементов, и если для какого-либо выходного элемента i нет segment_ids[j] == i, то будет найдено определенное значение по умолчанию (это значение отличается для каждой из операций). Для старших размерных тензоров первые x измерения data, как определено рангом segment_ids, будут заменены таким единичным измерением, содержащим различные сегменты.

Ваши примеры

Вы, похоже, не запускали свои примеры на tensorflow >= 1.12.0, потому что второй пример должен был вызвать исключение: InvalidArgumentError (see above for traceback): segment_ids[0] = 3 is out of range [0, 3). Факт, что это игнорируется, вероятно, поведение в более старых версиях (пожалуйста, проверьте).

Из документации tf.math.unsorted_segment_max:

Если максимальное значение пусто для данного идентификатора сегмента i, оно выводит наименьшее возможное значение для конкретного числового типа, output[i] = numeric_limits<T>::lowest().

  1. Вы указываете 3 сегмента и, следовательно, выходные данные имеют 3 элемента. Первый элемент, i == 0, соответствует местоположениям j == [1, 4] (как указано в segment_ids) и, следовательно, data[j] == [0.2, 0.4]. Принимая max(data[j]) урожайность 0.4. Аналогично для следующего сегмента, i == 1, у нас есть j == [2, 3] и data[j] = [0.3, 0.3] => max(data[j]) = 0.3. Для последнего сегмента, i == 2, в позиции j == 0 находится только один элемент, и, следовательно, результат будет 0.1.
  2. Теперь вы по-прежнему указываете 3 кластера, поэтому выходные данные будут иметь 3 элемента. Сегмент_ид 3, кажется, игнорируется, потому что он не соответствует количеству сегментов (хотя это должно вызвать ошибку в последней версии tenorflow). Что касается последнего элемента в выводе, который соответствует сегменту i == 2, то соответствующий segment_id не найден, и, следовательно, результатом является наименьшее возможное значение для конкретного числового типа ; вот что вы наблюдаете: -3.4028235e+38.
  3. Аналогично 2) с той разницей, что теперь действует идентификатор_сегмента 3; это соответствует последнему элементу в выводе, который, таким образом, равен 0.1. От второго к последнему элементу, соответствующему сегменту_сегменту 2, все еще нет соответствующих идентификаторов, и поэтому он заполняется значением по умолчанию.
  4. Для tf.math.unsorted_segment_sum значение по умолчанию для пустых сегментов отличается: Если сумма пуста для данного идентификатора сегмента i, output[i] = 0. Следовательно, сегмент 0 - это сумма элементов 0.2 + 0.4 == 0.6, для сегмента 1 это 0.3 + 0.3 == 0.6, для сегмента 2 соответствующий идентификатор не может быть найден и, таким образом, по умолчанию 0, а для сегмента 3 только один элемент 0.1 .

A2: Критерии для segment_ids состоят в том, что он "префиксирует" форму data, то есть segment_ids.shape == data.shape[:len(segment_ids.shape)] и max(segment_ids) < num_segments (в последней версии tenorflow). Соответствующие измерения будут затем сведены к одному, содержащему столько элементов, сколько указано num_segments, а значения в segments_ids указывают соответствующие сегменты в выводе.

A3: В случае, если аргумент segment_ids не соответствует требованиям, будет InvalidArgumentError. Вам нужно будет исправить соответствующий тензор, чтобы заставить операцию работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...