news 2026/2/9 0:10:36

tensorflow 零基础吃透:TensorFlow 张量切片与数据插入(附目标检测 / NLP 实战场景)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
tensorflow 零基础吃透:TensorFlow 张量切片与数据插入(附目标检测 / NLP 实战场景)

零基础吃透:TensorFlow张量切片与数据插入(附目标检测/NLP实战场景)

张量切片(提取子部分)和数据插入是TensorFlow处理结构化数据的核心操作,广泛用于目标检测(特征路由、选框特征提取)NLP(单词遮盖、序列切片)等场景。本文拆解「张量切片」「数据插入」两大核心模块,结合实战示例讲清tf.slice/tf.gather/tf.scatter_nd等API的用法、原理和场景适配。

前置准备(必运行)

importtensorflowastfimportnumpyasnp# 消除GPU警告(不影响功能)importos os.environ['TF_CPP_MIN_LOG_LEVEL']='2'

一、提取张量切片(核心场景:特征筛选/序列截取)

核心应用场景

  • 目标检测:从特征图中切片提取目标框对应的特征、按路由规则拆分样本特征;
  • NLP:截取句子的子序列、提取指定位置的单词(如遮盖任务选待遮盖单词)。

1. 基础切片:tf.slice 与 Python风格切片

tf.slice是TensorFlow原生切片API,Python风格切片([])更简洁,二者功能等价,支持一维/二维/高维张量。

1.1 一维张量切片
# 基础一维张量t1=tf.constant([0,1,2,3,4,5,6,7])# 方式1:tf.slice(begin=起始索引,size=截取长度)slice_result=tf.slice(t1,begin=[1],size=[3])print("tf.slice结果:",slice_result.numpy())# [1 2 3]# 方式2:Python风格切片(start:stop,左闭右开)python_slice1=t1[1:4]# 等价于begin=[1], size=[3]python_slice2=t1[-3:]# 最后3个元素print("Python切片[1:4]:",python_slice1.numpy())# [1 2 3]print("Python切片[-3:]:",python_slice2.numpy())# [5 6 7]
1.2 二维张量切片(目标检测特征图切片)
# 4行5列的二维张量(模拟目标检测特征图)t2=tf.constant([[0,1,2,3,4],[5,6,7,8,9],[10,11,12,13,14],[15,16,17,18,19]])# 切片:所有行除最后一行(:-1),列1到3(1:3)slice_2d=t2[:-1,1:3]print("\n二维张量切片结果:")print(slice_2d.numpy())

输出

[[ 1 2] [ 6 7] [11 12]]
1.3 高维张量切片(3D特征图)
# 2×2×4的三维张量(模拟批量特征图)t3=tf.constant([[[1,3,5,7],[9,11,13,15]],[[17,19,21,23],[25,27,29,31]]])# tf.slice:begin=[1,1,0](第1个批量、第1行、第0列),size=[1,1,2](截取1×1×2)slice_3d=tf.slice(t3,begin=[1,1,0],size=[1,1,2])print("\n三维张量切片结果:")print(slice_3d.numpy())# [[[25 27]]]

2. 跨步切片:tf.strided_slice(间隔截取)

tf.strided_slice支持「跨步」截取(类似NumPy的[start:stop:step]),适合按固定间隔提取元素(如NLP每隔k个单词采样)。

# 一维张量跨步切片:起始0,结束8,步长3strided_slice=tf.strided_slice(t1,begin=[0],end=[8],strides=[3])print("\n跨步切片结果:",strided_slice.numpy())# [0 3 6]# 等价于Python风格:t1[::3]print("Python跨步切片:",t1[::3].numpy())# [0 3 6]

3. 单轴任意索引提取:tf.gather

tf.gather单个轴提取「非均匀索引」的元素(无需间隔),适合NLP提取指定位置的字符/单词、目标检测选指定样本。

# 示例1:提取t1的0、3、6索引gather_1d=tf.gather(t1,indices=[0,3,6])print("\ntf.gather提取指定索引:",gather_1d.numpy())# [0 3 6]# 示例2:NLP提取任意字符(非均匀索引)alphabet=tf.constant(list('abcdefghijklmnopqrstuvwxyz'))gather_char=tf.gather(alphabet,indices=[2,0,19,18])# c、a、t、sprint("提取任意字符:",gather_char.numpy())# [b'c' b'a' b't' b's']

4. 多轴任意索引提取:tf.gather_nd

tf.gather_nd多个轴提取元素(支持矩阵元素、高维张量任意位置),是目标检测「提取指定目标框特征」的核心API。

示例1:提取矩阵指定行
# 5行2列矩阵t4=tf.constant([[0,5],[1,6],[2,7],[3,8],[4,9]])# 提取第2、3、0行(索引[[2], [3], [0]])gather_2d_row=tf.gather_nd(t4,indices=[[2],[3],[0]])print("\n提取矩阵指定行:")print(gather_2d_row.numpy())

输出

[[2 7] [3 8] [0 5]]
示例2:提取高维张量任意位置元素
# 2×3×3的三维张量(模拟批量特征图)t5=np.reshape(np.arange(18),[2,3,3])# 提取单个元素:[0,0,0]和[1,2,1]gather_3d_elem=tf.gather_nd(t5,indices=[[0,0,0],[1,2,1]])print("\n提取高维张量单个元素:",gather_3d_elem.numpy())# [ 0 16]# 提取多个子矩阵:[[0,0], [0,2]] 和 [[1,0], [1,2]]gather_3d_mat=tf.gather_nd(t5,indices=[[[0,0],[0,2]],[[1,0],[1,2]]])print("\n提取多个子矩阵:")print(gather_3d_mat.numpy())

二、插入数据到张量(核心场景:遮盖/特征更新)

核心应用场景

  • NLP单词遮盖:将选中的单词位置插入遮盖标记(<MASK>);
  • 目标检测:更新特征图中目标框的特征值、构造稀疏特征张量;
  • 矩阵操作:构造魔法方阵、单位矩阵。

1. 零初始化插入:tf.scatter_nd

tf.scatter_nd全零张量的指定索引处插入数据,是模拟稀疏张量的核心方法(无需显式构造SparseTensor)。

# 构造参数:indices=插入位置,updates=插入值,shape=目标张量形状t6=tf.constant([10])# shape=[10]的全零张量indices=tf.constant([[1],[3],[5],[7],[9]])# 插入位置data=tf.constant([2,4,6,8,10])# 插入值scatter_result=tf.scatter_nd(indices=indices,updates=data,shape=t6)print("\ntf.scatter_nd插入结果:")print(scatter_result.numpy())# [ 0 2 0 4 0 6 0 8 0 10]
模拟稀疏张量(tf.gather_nd + tf.scatter_nd)
# 步骤1:从t2提取指定位置的值new_indices=tf.constant([[0,2],[2,1],[3,3]])t7=tf.gather_nd(t2,indices=new_indices)# 提取值:2、11、18# 步骤2:将值插入全零张量(模拟稀疏张量)t8=tf.scatter_nd(indices=new_indices,updates=t7,shape=tf.constant([4,5]))print("\n模拟稀疏张量插入结果:")print(t8.numpy())# 等价于构造SparseTensor后转密集t9=tf.sparse.SparseTensor(indices=[[0,2],[2,1],[3,3]],values=[2,11,18],dense_shape=[4,5])t10=tf.sparse.to_dense(t9)print("\nSparseTensor转密集结果(与上一致):")print(t10.numpy())

输出

[[ 0 0 2 0 0] [ 0 0 0 0 0] [ 0 11 0 0 0] [ 0 0 0 18 0]]

2. 已有张量插入(加减):tf.tensor_scatter_nd_add/sub

已有值的张量上,对指定索引执行「加法/减法」更新,适合动态修改特征值。

示例1:构造魔法方阵(加法更新)
# 初始张量t11=tf.constant([[2,7,0],[9,0,1],[0,3,8]])# 在指定位置加值,构造魔法方阵(每行/列和为15)t12=tf.tensor_scatter_nd_add(t11,indices=[[0,2],[1,1],[2,0]],# 插入位置updates=[6,5,4]# 加6、加5、加4)print("\n魔法方阵(加法更新):")print(t12.numpy())

输出

[[2 7 6] [9 5 1] [4 3 8]]
示例2:构造单位矩阵(减法更新)
# 从t11中减去指定值,得到单位矩阵t13=tf.tensor_scatter_nd_sub(t11,indices=[[0,0],[0,1],[1,0],[1,1],[1,2],[2,1],[2,2]],updates=[1,7,9,-1,1,3,7])print("\n单位矩阵(减法更新):")print(t13.numpy())

输出

[[1 0 0] [0 1 0] [0 0 1]]

3. 极值插入:tf.tensor_scatter_nd_min/max

在指定索引处,将张量值更新为「当前值」与「插入值」的最小值/最大值,适合特征值的极值约束。

# 初始张量t14=tf.constant([[-2,-7,0],[-9,0,1],[0,-3,-8]])# 最小值更新:指定位置取当前值和插入值的最小t15=tf.tensor_scatter_nd_min(t14,indices=[[0,2],[1,1],[2,0]],updates=[-6,-5,-4])print("\n最小值更新结果:")print(t15.numpy())# 最大值更新:指定位置取当前值和插入值的最大t16=tf.tensor_scatter_nd_max(t14,indices=[[0,2],[1,1],[2,0]],updates=[6,5,4])print("\n最大值更新结果:")print(t16.numpy())

输出

# 最小值更新 [[-2 -7 -6] [-9 -5 1] [-4 -3 -8]] # 最大值更新 [[-2 -7 6] [-9 5 1] [ 4 -3 -8]]

三、实战场景落地(NLP单词遮盖示例)

# 模拟NLP单词遮盖任务:# 1. 构造句子张量(单词索引):["I", "like", "ragged", "tensors"] → [0,1,2,3]sentence=tf.constant([0,1,2,3],dtype=tf.int32)# 2. 选择要遮盖的单词索引:2("ragged")mask_indices=tf.constant([[2]])# 3. 提取遮盖单词(用于标签)mask_label=tf.gather_nd(sentence,mask_indices)print("遮盖单词标签:",mask_label.numpy())# [2]# 4. 插入遮盖标记(<MASK>→索引99)masked_sentence=tf.scatter_nd(indices=mask_indices,updates=[99],shape=tf.constant([4])# 句子长度4)# 5. 合并:未遮盖位置保留原词,遮盖位置为99final_sentence=tf.where(masked_sentence==0,sentence,masked_sentence)print("遮盖后的句子:",final_sentence.numpy())# [ 0 1 99 3]

核心API总结表

操作类型API核心功能典型场景
基础切片tf.slice / Python[]按范围截取张量子部分特征图区域截取、序列子串提取
跨步切片tf.strided_slice按固定间隔截取元素序列采样、特征降采样
单轴索引提取tf.gather单轴非均匀索引提取NLP字符/单词提取、样本筛选
多轴索引提取tf.gather_nd多轴任意位置提取目标框特征提取、高维张量取值
零初始化插入tf.scatter_nd全零张量指定位置插入数据构造稀疏张量、NLP单词遮盖
已有张量加减tf.tensor_scatter_nd_add/sub已有张量指定位置加减值魔法方阵、单位矩阵构造
极值插入tf.tensor_scatter_nd_min/max指定位置更新为极值特征值极值约束、异常值修正

避坑关键

  1. 索引维度匹配tf.gather_nd的indices维度需与张量秩匹配(如二维张量的indices每行长度为2);
  2. 形状一致性tf.scatter_nd的shape需与插入后张量形状一致,否则报错;
  3. 原地更新?:所有插入操作均返回新张量(TensorFlow张量不可变),需接收返回值;
  4. 稀疏场景优选:大量零值插入时,优先用tf.scatter_ndSparseTensor,避免密集张量浪费内存。

掌握这些操作,可灵活处理目标检测/NLP中的张量拆分、重组、更新需求,是TensorFlow进阶的核心基础。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/2/7 20:38:03

wps-view-vue终极指南:快速实现企业级WPS文档在线预览功能

wps-view-vue终极指南&#xff1a;快速实现企业级WPS文档在线预览功能 【免费下载链接】wps-view-vue wps在线编辑、预览前端vue项目&#xff0c;基于es6 项目地址: https://gitcode.com/gh_mirrors/wp/wps-view-vue 还在为Web应用中集成文档预览功能而烦恼吗&#xff1…

作者头像 李华
网站建设 2026/2/8 0:26:55

千万不能选错!实验室操作台选购必看的5大要点

千万不能选错&#xff01;实验室操作台选购必看的5大要点引言实验室操作台是实验室中不可或缺的设备之一&#xff0c;它不仅影响实验效率&#xff0c;还直接关系到实验人员的安全和健康。因此&#xff0c;在选购实验室操作台时&#xff0c;我们需要格外慎重。本文将为大家介绍实…

作者头像 李华
网站建设 2026/2/8 15:29:25

BetterNCM插件终极指南:打造专属音乐世界的简单方法

BetterNCM插件终极指南&#xff1a;打造专属音乐世界的简单方法 【免费下载链接】BetterNCM-Installer 一键安装 Better 系软件 项目地址: https://gitcode.com/gh_mirrors/be/BetterNCM-Installer 还在忍受网易云音乐的单调界面和有限功能吗&#xff1f;&#x1f62b; …

作者头像 李华
网站建设 2026/2/7 11:20:02

Beyond Compare 5授权使用指南:实现完整功能体验

Beyond Compare 5授权使用指南&#xff1a;实现完整功能体验 【免费下载链接】BCompare_Keygen Keygen for BCompare 5 项目地址: https://gitcode.com/gh_mirrors/bc/BCompare_Keygen 还在为Beyond Compare 5的功能限制而困惑吗&#xff1f;&#x1f914; 作为开发者和…

作者头像 李华
网站建设 2026/2/6 15:50:33

MusicFree插件深度配置手册:打造专属音乐生态系统的完整方案

MusicFree插件深度配置手册&#xff1a;打造专属音乐生态系统的完整方案 【免费下载链接】MusicFreePlugins MusicFree播放插件 项目地址: https://gitcode.com/gh_mirrors/mu/MusicFreePlugins 想要将你的音乐播放器打造成功能强大的个性化音乐中心吗&#xff1f;Music…

作者头像 李华
网站建设 2026/2/6 21:59:07

C++ HTTP/2架构深度解析:从连接瓶颈到性能翻倍

你是否曾困惑&#xff0c;为什么现代Web应用在高并发场景下依然面临性能瓶颈&#xff1f;当传统HTTP/1.1的队头阻塞问题限制了系统吞吐量&#xff0c;C开发者该如何突破这一技术困境&#xff1f;本文将带你深入探索HTTP/2在C中的实现原理与性能优化策略。 【免费下载链接】cpp-…

作者头像 李华