Python 如何验证tf.unsorted_segments_max的segment_id参数?
在TensorFlow 1.12中,您可以使用来计算沿张量线段的最大值 其中一个论点是: 段ID:张量。必须是以下类型之一:int32、int64。形状为data.shape.END}out\u arg前缀的张量{Python 如何验证tf.unsorted_segments_max的segment_id参数?,python,tensorflow,machine-learning,deep-learning,Python,Tensorflow,Machine Learning,Deep Learning,在TensorFlow 1.12中,您可以使用来计算沿张量线段的最大值 其中一个论点是: 段ID:张量。必须是以下类型之一:int32、int64。形状为data.shape.END}out\u arg前缀的张量{ 名称:“输出”说明:A1:对于一维情况,输出张量将具有由num_段指定的尽可能多的元素。每个元素i将是操作的结果(例如max,sum,…)应用于数据中的所有元素,由位置j表示,其段ID[j]==i。segment\u id可以是任何数字,不一定需要从0开始。但是,输出将包含num\u
名称:“输出”说明:A1:对于一维情况,输出张量将具有由
num_段指定的尽可能多的元素。每个元素i
将是操作的结果(例如max
,sum
,…)应用于数据
中的所有元素,由位置j
表示,其段ID[j]==i
。segment\u id
可以是任何数字,不一定需要从0
开始。但是,输出将包含num\u segments
元素,如果找到任何输出元素i
nosegment\u id[j]==i
,则使用特定的默认值(此值对于每个操作都不同)。对于高维张量,数据
的第一个x
维度(由段ID
的秩指定)将替换为包含不同段的单个维度
你的例子
您似乎没有在tensorflow>=1.12.0
上运行示例,因为第二个示例本应引发异常:InvalidArgumentError(回溯请参见上文):segment_id[0]=3超出范围[0,3)
。忽略它的事实可能是旧版本中的行为(请检查)
根据以下文件:
如果给定段IDi
的最大值为空,则它会输出特定数值类型的最小可能值,output[i]=numeric\u limits::lowest()
指定3个段,因此输出有3个元素。第一个元素,i==0
,对应于位置j==1,4]
(如segment\u id
中所指定),因此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
现在您仍然指定了3个集群,因此输出将有3个元素。段id3
似乎被忽略,因为它不适合段的数量(但这会在最新版本的tensorflow上引发错误).关于输出中的最后一个元素,对应于段i==2
,未找到相应的段id
,因此结果是特定数字类型的最小可能值;这就是您观察到的:-3.4028235e+38
类似于2),区别在于现在段id3
生效;这对应于输出中的最后一个元素,因此为0.1
。对应于段id 2的倒数第二个元素仍然没有匹配的id,因此由默认值填充
因为空段的默认值不同:如果给定段ID的总和为空i
,输出[i]=0
。因此,段0
是项目的总和0.2+0.4==0.6
,对于段1,它是0.3+0.3==0.6
,对于段2,找不到相应的id,因此默认情况下它是0
,对于段3,只有一个元素0.1
A2:段ID
的标准是它“前缀”了数据的形状,即段ID.shape==data.shape[:len(段ID.shape)]
和最大(段ID)
(在最新版本的tensorflow上)。相应的维度将被缩减为单个维度,包含由num_segments
指定的元素,而segments_id
中的值指定输出中的相应片段
A3:如果段id
参数不满足要求,将提出一个。您必须修复相应的张量才能使操作正常运行。我认为tf.unsorted\u segment\u max
中有一个数字溢出的错误,当id不在段id
中时+38
应该是0
@giser\u yuyang我的第一个例子和第二个例子应该有相同的结果,如果除了段索引
大小之外没有额外的限制。如果有,那么不检查就全取是不安全的。第一个例子和第二个例子应该有不同的结果。结果只会是在第一个示例中,0.4
表示id=0
来自max(0.2,0.4)
,0.3
表示id=1
来自max(0.3,0.3)
,0.1
表示id=2
来自max(0.1)
。但是在第二个示例中没有id=2
,因此它应该返回0
。你是对的。我的错,我的意思是第3段应该有0.1
。连续不应该使结果完全错误。这就是为什么有示例4。它表明un中段id
有明显的附加限制排序的_segment_max
没有出现的segment应该是0。
因此这不是一个错误,输入[3,0,1,1,0]
无效。很抱歉。如果给定的segment IDI
的最大值为空,它将输出最小的po
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.