- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
在 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
中所有元素的操作结果(例如 sum
、data
、...) , 由位置 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()
.
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
.3
似乎被忽略了,因为它不适合段数(不过这应该会在最新版本的 tensorflow 上引发错误)。关于输出中的最后一个元素,它对应于段 i == 2
, 没有对应的 segment_id
被找到,因此结果是特定数字类型的最小可能值;这是你观察到的:-3.4028235e+38
.3
生效;这对应于输出中的最后一个元素,因此是 0.1
.倒数第二个元素,对应segment_id 2 仍然没有匹配的id,因此用默认值填充。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/
在 TensorFlow 1.12 中,您可以使用 tf.math.unsorted_segment_sum计算张量各段的最大值。 参数之一: segment_ids: A Tensor. Must
我是一名优秀的程序员,十分优秀!