You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

TensorFlow动态批量下基于布尔张量筛选张量切片的问题

解决方案:动态批量下按布尔索引提取张量切片

核心思路

要从形状为(None, 100, 10)的params中,根据形状(None, 100)的布尔张量indices提取对应位置的切片,最终得到(None, None, 10)的张量,关键是处理每个样本提取数量不一致的动态场景,直接用tf.ragged.boolean_mask就能满足需求。

代码实现

import tensorflow as tf

# 构造测试用例(批量大小设为3,替代None)
params = tf.random.normal((3, 100, 10))
indices = tf.random.uniform((3, 100), minval=0, maxval=2, dtype=tf.bool)

# 提取符合条件的切片
c = tf.ragged.boolean_mask(params, indices, axis=1)

print(c.shape)  # 输出 (3, None, 10),完全匹配需求

之前方法失效的原因

  • tf.gather错误原因:默认在axis=0(批量维度)索引,即使指定axis=1,二维布尔张量indices会被广播为与params前两维匹配的形状,导致提取出(None, 100, 100, 10)的冗余维度。tf.gather更适合整数索引,而非逐样本的布尔筛选。
  • params[indices]错误原因:该写法会将二维布尔索引视为对批量维度的筛选,同时扁平化前面的维度,最终只保留每个筛选后样本的最后一维,得到(None, 10)的不符合结果。

可选:转换为密集张量

如果需要固定形状的密集张量(自动用0填充到当前批量的最大提取长度),可以把Ragged张量转为普通张量:

c_dense = c.to_tensor()
print(c_dense.shape)  # 输出 (3, max_true_count, 10),max_true_count为当前批量中最多的True数量

内容的提问来源于stack exchange,提问作者Meysam Sadeghi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 19:31:08