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

时间:2019-05-13 01:39:53

标签: python tensorflow machine-learning deep-learning

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

其中一个参数:

  

segment_ids 张量。必须是以下类型之一:int32,int64。形状为data.shape前缀的张量。END} out_arg {   名称:“输出”描述:<< END与数据具有相同的形状,除了   首个segment_ids.rank尺寸,并替换为   尺寸为num_segments的单个尺寸。

第一季度:我不明白这是什么意思。我想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]

从示例1和示例2中,我注意到示例1的结果正确,而示例2应该具有[0.4 0.3 0.],并且如果输入segment_ids无效,则不会出现警告或错误。

第二季度:如何检查我的segment_ids是否符合要求?

问题3:如果我的segment_ids不符合要求,例如[3, 0, 1, 1, 0],我该怎么做unsorted_segments_max work

1 个答案:

答案 0 :(得分:1)

A1:对于一维情况,输出张量将具有num_segments指定的元素个数。每个元素i都是将操作(例如maxsum,...)应用于data中所有元素的结果,由位置{{1 }},为此jsegment_ids[j] == i可以是任何数字,不一定以segment_ids开头。但是,输出将包含0元素,并且如果没有为任何输出元素num_segments找到i,则使用特定的默认值(此值对于每个操作都不同)。对于更高维度的张量,segment_ids[j] == i的前x个维度(由data的等级指定)将被包含各个段的单个维度替换。

您的示例

您似乎没有在segment_ids上运行示例,因为第二个示例应该引发了一个异常:tensorflow >= 1.12.0。忽略它的事实可能是较旧版本中的行为(请检查)。

摘自tf.math.unsorted_segment_max的文档:

  

如果给定的段ID InvalidArgumentError (see above for traceback): segment_ids[0] = 3 is out of range [0, 3)的最大值为空,则它将输出特定数字类型i的最小值。

  1. 您指定了3个细分,因此输出有3个元素。第一个元素output[i] = numeric_limits<T>::lowest()对应于位置i == 0(在j == [1, 4]中指定),因此对应于segment_ids。取data[j] == [0.2, 0.4]会产生max(data[j])。类似地,对于下一个段0.4,我们有i == 1j == [2, 3]。对于最后一个分段data[j] = [0.3, 0.3] => max(data[j]) = 0.3,在位置i == 2上只有一个元素,因此结果为j == 0
  2. 现在您仍然指定3个簇,因此输出将包含3个元素。 segment_id 0.1似乎被忽略了,因为它不适合段数(尽管这会在最新版本的tensorflow上引发错误)。关于输出中与段3对应的最后一个元素,未找到对应的i == 2,因此结果为特定数字类型的最小可能值;这是您观察到的:segment_id
  3. 类似于2),不同之处在于,segment_id -3.4028235e+38生效了;它对应于输出中的最后一个元素,即3。对应于segment_id 2的倒数第二个元素仍然没有匹配的id,因此由默认值填充。
  4. 对于tf.math.unsorted_segment_sum,空段的默认值是不同的:如果给定段ID 0.1i的总和为空。因此,段{ {1}}是项output[i] = 0的总和,对于段1为0,对于段2找不到对应的ID,因此默认为0.2 + 0.4 == 0.6,对于段3只有一个元素0.3 + 0.3 == 0.6

A2:用于0的条件是它“前缀” 0.1的形状,即segment_idsdata(在张量流的最新版本)。然后,相应的维将减少为一个维,其中包含segment_ids.shape == data.shape[:len(segment_ids.shape)]指定的元素,而max(segment_ids) < num_segments中的值指定输出中的相应段。

A3 :如果num_segments参数不符合要求,则会引发InvalidArgumentError。您必须修复相应的张量才能使操作生效。