В 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