python - 如何按给定段收集张量元素?
问题描述
我正在尝试实现“segment_collect”(非常像segment_max,但收集到张量而不是取最大值)。
t = tf.constant(["a", "b", "c", "d"])
s = tf.constant([0, 1, 1, 0])
r = tf.segment_collect(t, s) # r == [["a", "d"], ["b", "c"]]
一个简单的实现是逐行构建结果,在下面的伪代码中:
r = []
for i in range(2):
mask = tf.equal(s, i)
values = tf.boolean_mask(t, mask)
r.append(values)
# convert r into a tensor at last
但这不是很有效。
一个后续问题是:是否有一种通用的方法来对张量进行分组/聚合?除了 tensorflow 中的 segment_{min/max/mean/prod/sum} 之外,这将允许更多操作,例如 segment_size、segment_median、segment_percentile。
解决方案
您可能会发现tf.gather
并tf.nn.topk
有所帮助:
tf.gather(t, tf.nn.top_k(-s, k=tf.shape(s)[0]).indices)
这适用于 TF 1.x 和 TF 2.0。如果需要,重塑结果:
tf.reshape(tf.gather(t, tf.nn.top_k(-s, k=tf.shape(s)[0]).indices), shape=(-1, 2))
当然,reshape 假设元素被分成大小相等的组(在本例中为两组)。
tf.keras.backend.eval(tf.gather(t, tf.nn.top_k(-s, k=tf.shape(s)[0]).indices))
# array([b'a', b'd', b'b', b'c'], dtype=object)
推荐阅读
- php - 如何将会话密钥 user_id 传递给“Select from” sql 语句
- android - 部署前修改 Android App Bundle (aab) 内容
- python - 将大型应用程序 web2py 转移到新服务器
- php - 调用未定义函数 setSurroundCount() CodeIgniter 4
- java - 如何使用 Spring Data JPA 有效地处理并发创建
- c# - 当 ASP.Net 接收到带有 DateTime 属性的发布模型时,什么决定了 DateTime.Kind?
- reactjs - 有没有办法使用自己的组件类来扩展 React.Component 而无需在每个文件中导入 react?
- javascript - 我不能在 Angular 的 httpclient 结果中使用 getter 和 setter 吗?
- html - 学习html css和js,不确定后台定位
- terraform - 使用 terraform 将 list(map(list(map(string)))) 转换为 map(list(map(string)))