如何验证 tf.unsorted_segments_max 的 segment_ids 参数?

Tin*_*Liu 5 python machine-learning deep-learning tensorflow

在 TensorFlow 1.12 中,您可以使用tf.math.unsorted_segment_sum计算张量沿线段的最大值。

论据之一:

segment_ids张量。必须是以下类型之一:int32、int64。一个张量,其形状是 data.shape.END 的前缀 } out_arg { name: "output" description: << END 与 data 具有相同的形状,除了第一个 segment_ids.rank 维度被替换为具有大小 num_segments。

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.
Run Code Online (Sandbox Code Playgroud)

从实例3和实例,我注意到,segment_idstf.unsorted_segment_max()比其他多余了限制tf.unsorted_segment_sum(),我想这是从0实例3连续有权[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

a_g*_*est 1

A1:对于一维情况,输出张量将具有由 指定的尽可能多的元素num_segments。每个元素将是应用于 中所有元素的操作(例如, , ...)i的结果,用位置 表示,其中。可以是任何数字,并且不一定需要从 开始。然而,输出将包含元素,如果对于任何输出元素没有找到,则使用特定的默认值(该值对于每个操作都是不同的)。对于更高维度的张量, 的第一个维度(由 的秩指定)将被包含各个段的单个维度替换。maxsumdatajsegment_ids[j] == isegment_ids0num_segmentsisegment_ids[j] == ixdatasegment_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

如果给定段 ID 的最大值为空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 个元素。该segment_id3似乎被忽略,因为它不适合段的数量(但这应该会在最新版本的tensorflow上引发错误)。关于输出中对应于段 的最后一个元素,i == 2没有segment_id找到对应的元素,因此结果是特定数字类型的最小可能值;这就是你所观察到的:-3.4028235e+38
  3. 与2)类似,不同的是此时segment_id3生效;这对应于输出中的最后一个元素,因此是0.1。对应于segment_id 2 的倒数第二个元素仍然没有匹配的id,因此由默认值填充。
  4. 对于tf.math.unsorted_segment_sum空段的默认值是不同的:如果给定段 ID 的总和为空i,则output[i] = 0. 因此,段0是项目的总和0.2 + 0.4 == 0.6,对于段 1 来说是项目0.3 + 0.3 == 0.6的总和,对于段 2 来说找不到相应的 id,因此0默认情况下是这样,对于段 3 来说只有一个元素0.1

A2:的标准segment_ids是它“前缀” 的形状data,即segment_ids.shape == data.shape[:len(segment_ids.shape)]和 that max(segment_ids) < num_segments(在最新版本的tensorflow上)。然后,相应的维度将减少为单个维度,包含 指定的元素数量,num_segments而 中的值segments_ids指定输出中的相应段。

A3:如果segment_ids论证不符合要求,InvalidArgumentError则会提出。您必须修复相应的张量才能使操作正常进行。