gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 11:37:32 24 4
gpt4 key购买 nike

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

参数之一:

segment_ids: A Tensor. Must be one of the following types: int32, int64. A tensor whose shape is a prefix of data.shape.END } out_arg { name: "output" description: << END Has same shape as data, except for the first segment_ids.rank dimensions, which are replaced with a single dimension which has size 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.

从 Ex3 和 Ex4,我注意到 tf.unsorted_segment_max() 中的 segment_ids 除了 tf.unsorted_segment_sum() 之外还有额外的限制,我想它是从 0 开始连续的。Ex3 应该有 [0.4 0.3 0. 0.1]

从 Ex1 和 Ex2,我注意到 Ex1 结果是正确的,而 Ex2 应该有 [0.4 0.3 0.] 并且如果输入 segment_ids 没有警告或错误发生> 无效。

问题 2:如何检查我的 segment_ids 是否符合要求?

问题 3: 如果我的 segment_ids 不符合要求,比如 [3, 0, 1, 1, 0],怎么办我该怎么做才能使 unsorted_segments_max 工作

最佳答案

A1:对于一维情况,输出张量将具有由 num_segments 指定的尽可能多的元素。 .每个元素 i将是应用于 max 中所有元素的操作结果(例如 sumdata、...) , 由位置 j 表示,为此 segment_ids[j] == i . segment_ids可以是任何数字,不一定需要从 0 开始.尽管如此,输出将包含 num_segments元素和 if 对于任何输出元素 i没有segment_ids[j] == i找到然后使用一个特定的默认值(这个值对于每个操作都是不同的)。对于高维张量,第一个 x data 的尺寸,由 segment_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 的文档:

If the maximum is empty for a given segment ID i, it outputs the smallest possible value for the specific numeric type, 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_id 3似乎被忽略了,因为它不适合段数(不过这应该会在最新版本的 tensorflow 上引发错误)。关于输出中的最后一个元素,它对应于段 i == 2 , 没有对应的 segment_id被找到,因此结果是特定数字类型的最小可能值;这是你观察到的:-3.4028235e+38 .
  3. 类似于 2),区别在于现在 segment_id 3生效;这对应于输出中的最后一个元素,因此是 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)]max(segment_ids) < num_segments (在最新版本的 tensorflow 上)。然后相应的维度将被缩减为一个维度,包含由 num_segments 指定的尽可能多的元素。而 segments_ids 中的值在输出中指定相应的段。

A3:如果 segment_ids参数不符合 InvalidArgumentError 的要求将被提高。您必须修复相应的张量才能使操作正常进行。

关于python - 如何验证 tf.unsorted_segments_max 的 segment_ids 参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56104861/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com