在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
?
答案 0 :(得分:1)
A1:对于一维情况,输出张量将具有num_segments
指定的元素个数。每个元素i
都是将操作(例如max
,sum
,...)应用于data
中所有元素的结果,由位置{{1 }},为此j
。 segment_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
的最小值。
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 == 1
和j == [2, 3]
。对于最后一个分段data[j] = [0.3, 0.3] => max(data[j]) = 0.3
,在位置i == 2
上只有一个元素,因此结果为j == 0
。0.1
似乎被忽略了,因为它不适合段数(尽管这会在最新版本的tensorflow上引发错误)。关于输出中与段3
对应的最后一个元素,未找到对应的i == 2
,因此结果为特定数字类型的最小可能值;这是您观察到的:segment_id
。-3.4028235e+38
生效了;它对应于输出中的最后一个元素,即3
。对应于segment_id 2的倒数第二个元素仍然没有匹配的id,因此由默认值填充。tf.math.unsorted_segment_sum
,空段的默认值是不同的:如果给定段ID 0.1
,i
的总和为空。因此,段{ {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_ids
和data
(在张量流的最新版本)。然后,相应的维将减少为一个维,其中包含segment_ids.shape == data.shape[:len(segment_ids.shape)]
指定的元素,而max(segment_ids) < num_segments
中的值指定输出中的相应段。
A3 :如果num_segments
参数不符合要求,则会引发InvalidArgumentError
。您必须修复相应的张量才能使操作生效。