Python 如何验证tf.unsorted_segments_max的segment_id参数?

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

在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 segments
元素,如果找到任何输出元素
i
no
segment\u id[j]==i
,则使用特定的默认值(此值对于每个操作都不同)。对于高维张量,
数据
的第一个
x
维度(由
段ID
的秩指定)将替换为包含不同段的单个维度

你的例子 您似乎没有在
tensorflow>=1.12.0
上运行示例,因为第二个示例本应引发异常:
InvalidArgumentError(回溯请参见上文):segment_id[0]=3超出范围[0,3)
。忽略它的事实可能是旧版本中的行为(请检查)

根据以下文件:

如果给定段ID
i
的最大值为空,则它会输出特定数值类型的最小可能值,
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个元素。段id
    3
    似乎被忽略,因为它不适合段的数量(但这会在最新版本的tensorflow上引发错误).关于输出中的最后一个元素,对应于段
    i==2
    ,未找到相应的
    段id
    ,因此结果是特定数字类型的最小可能值;这就是您观察到的:
    -3.4028235e+38
  • 类似于2),区别在于现在段id
    3
    生效;这对应于输出中的最后一个元素,因此为
    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 ID
    I
    的最大值为空,它将输出最小的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.