TensorFlow进阶二(高阶操作)

news2024/11/16 23:56:29

⚠申明: 未经许可,禁止以任何形式转载,若要引用,请标注链接地址。 全文共计3077字,阅读大概需要3分钟
🌈更多学习内容, 欢迎👏关注👀【文末】我的个人微信公众号:不懂开发的程序猿
个人网站:https://jerry-jy.co/

TensorFlow进阶二(高阶操作)

  • TensorFlow进阶二
    • 一、任务需求
    • 二、任务目标
          • 1、掌握张量的填充与复制
          • 2、掌握张量的数据限幅
          • 3、掌握张量的高阶操作
    • 三、任务环境
          • 1、jupyter开发环境
          • 2、python3.6
          • 3、tensorflow2.4
    • 四、任务实施过程
        • (四)、高阶操作
    • 五、任务小结

TensorFlow进阶二


一、任务需求

对于图片数据的高和宽、序列信号的长度,维度长度可能各不相同。为了方便网络的并行计算,需要将不同长度的数据扩张为相同长度,之前我们介绍了通过复制的方式可以增加数据的长度,但是重复复制数据会破坏原有的数据结构,并不适合于此处。通常的做法是,在需要补充长度的数据开始或结束处填充足够数量的特定数值,这些特定数值一般代表了无效意义,例如 0,使得填充后的长度满足系统要求。那么这种操作就叫作填充(Padding)。本节将要完成张量的填充与复制,数据限幅以及tf.gather、tf.gather_nd、tf.boolean_mark、tf.where、scatter_nd、meshgrid等函数的操作。

二、任务目标

1、掌握张量的填充与复制
2、掌握张量的数据限幅
3、掌握张量的高阶操作

三、任务环境

1、jupyter开发环境
2、python3.6
3、tensorflow2.4

四、任务实施过程

(四)、高阶操作

17、通过 tf.gather_nd 函数,可以通过指定每次采样点的多维坐标来实现采样多个点的目的。回到上面的挑战,我们希望抽查第 2 个班级的第 2 个同学的所有科目,第 3 个班级的第 3 个同学的所有科目,第 4 个班级的第 4 个同学的所有科目。那么这 3 个采样点的索引坐标可以记为:[1,1]、[2,2]、[3,3],我们将这个采样方案合并为一个 List 参数,即
[[1,1],[2,2],[3,3]],通过 tf.gather_nd 函数即可

tf.gather_nd(x,[[1,1],[2,2],[3,3]])

在这里插入图片描述

可以看到,结果与串行采样方式的完全一致,实现更加简洁,计算效率大大提升

18、使用 tf.gather_nd 采样多个样本时,例如希望采样𝑖号班级,𝑗个学生,𝑘门科目的成绩,则可以表达为[. . . ,[𝑖,𝑗, 𝑘], . . .],外层的括号长度为采样样本的个数,内层列表包含了每个采样点的索引坐标,如要抽取班级1的学生1的科目、 班级2的学生2的科目、 班级3的学生3的科目的成绩

tf.gather_nd(x,[[1,1,2],[2,2,3],[3,3,4]])

<tf.Tensor: shape=(3,), dtype=int32, numpy=array([73, 4, 99], dtype=int32)>

19、除了可以通过给定索引号的方式采样,还可以通过给定掩码(Mask)的方式进行采样。继续以 shape 为[4,35,8]的成绩册张量为例,这次我们以掩码方式进行数据提取。
考虑在班级维度上进行采样,对这 4 个班级的采样方案的掩码为mask = [True, False, False, True]即采样第 1 和第 4 个班级的数据,通过 tf.boolean_mask(x, mask, axis)可以在 axis 轴上根据
mask 方案进行采样

根据掩码方式采样班级,给出掩码和维度索引
tf.boolean_mask(x,mask=[True, False,False,True],axis=0)

注意掩码的长度必须与对应维度的长度一致,如在班级维度上采样,则必须对这 4 个班级是否采样的掩码全部指定,掩码长度为 4

20、如果对 8 门科目进行掩码采样,设掩码采样方案为mask = [True, False, False, True, True, False, False, True],即采样第 1、4、5、8 门科目

# 根据掩码方式采样科目
tf.boolean_mask(x,mask=[True,False,False,True,True,False,False,True],axis=2)
<tf.Tensor: shape=(4, 35, 4), dtype=int32, numpy=
array([[[54, 15, 81, 19],
        [23, 62,  0, 32],
        [45, 98,  6, 72],
        [18, 99, 76, 51],
        [81, 20, 64, 32],
        [ 5, 43, 30, 80],
        [81, 82, 64, 85],
        [10, 63, 55, 97],
        [68, 86, 35, 60],
        [80, 52, 71, 97],
        [99, 35, 20, 56],
        [27, 94,  0, 44],
        [34, 53, 43, 31],
        [35, 46, 66, 71],
        [17, 77, 81, 65],
        [ 8, 60, 94, 53],
        [66, 60, 31, 51],
        [26, 57, 71, 31],
        [53, 42, 65, 46],
        [25, 31,  2, 75],
        [60, 40, 24, 68],
        [49, 97,  2, 96],
        [76, 68, 45,  7],
        [87, 18, 95, 67],
...
        [70,  7, 64, 15],
        [29, 72, 30, 63],
        [34, 26, 75,  4],
        [83, 22, 68, 99],
        [64, 37, 64, 23]]], dtype=int32)>
Output is truncated. View as a scrollable element or open in a text editor. Adjust cell output settings...

21、通过 tf.where(cond, a, b)操作可以根据 cond 条件的真假从参数𝑨或𝑩中读取数据。当对应位置的cond𝑖为 True,𝑜𝑖从𝑎𝑖中复制数据;当对应位置的cond𝑖为 False,𝑜𝑖从𝑏𝑖中复制数据。考虑从 2 个全 1 和全 0 的
3 × 3大小的张量𝑨和𝑩中提取数据,其中cond𝑖为 True 的位置从𝑨中对应位置提取元素 1,cond𝑖为 False 的位置从𝑩对应位置提取元素 0

a = tf.ones([3,3]) # 构造 a 为全 1 矩阵
b = tf.zeros([3,3]) # 构造 b 为全 0 矩阵
# 构造采样条件
cond =tf.constant([[True,False,False],[False,True,False],[True,True,False]])
tf.where(cond,a,b)  #根据条件从a,b中采样

在这里插入图片描述

可以看到,返回的张量中为 1 的位置全部来自张量 a,返回的张量中为 0 的位置来自张量b。

22、当参数 a=b=None 时,即 a 和 b 参数不指定,tf.where 会返回 cond 张量中所有 True 的元素的索引坐标

cond # 构造的 cond 张量

<tf.Tensor: shape=(3, 3), dtype=bool, numpy=
array([[ True, False, False],
[False, True, False],
[ True, True, False]])>

其中 True 共出现 4 次,每个 True 元素位置处的索引分别为[0,0]、[1,1]、[2,0]、[2,1],可以直接通过 tf.where(cond)形式来获得这些元素的索引坐标

tf.where(cond) # 获取 cond 中为 True 的元素索引

<tf.Tensor: shape=(4, 2), dtype=int64, numpy=
array([[0, 0],
[1, 1],
[2, 0],
[2, 1]])>

23、我们需要提取张量中所有正数的数据和索引。首先构造张量 a,并通过比较运算得到所有正数的位置掩码

x = tf.random.normal([3,3]) # 构造 a
x

> <tf.Tensor: shape=(3, 3), dtype=float32, numpy=
array([[ 1.3181536 ,  0.7503586 ,  1.3323568 ],
       [-0.2842348 , -0.11278582,  1.5982385 ],
       [ 1.1395993 , -0.6405513 ,  0.36168438]], dtype=float32)>

24、通过比较运算,得到所有正数的掩码

mask=x>0 # 比较操作,等同于 tf.math.greater()
mask
<tf.Tensor: shape=(4, 28, 28, 1), dtype=bool, numpy=
array([[[[False],
         [False],
         [ True],
         ...,
         [ True],
         [ True],
         [ True]],

        [[ True],
         [ True],
         [ True],
         ...,
         [ True],
         [False],
         [False]],

        [[False],
         [False],
         [ True],
         ...,
         [False],
         [False],
         [False]],
...
         [ True],
         ...,
         [ True],
         [ True],
         [False]]]])>
Output is truncated. View as a scrollable element or open in a text editor. Adjust cell output settings...

25、通过 tf.where 提取此掩码处 True 元素的索引坐标

indices=tf.where(mask) # 提取所有大于 0 的元素索引
indices
<tf.Tensor: shape=(1597, 4), dtype=int64, numpy=
array([[ 0,  0,  2,  0],
       [ 0,  0,  3,  0],
       [ 0,  0,  4,  0],
       ...,
       [ 3, 27, 22,  0],
       [ 3, 27, 25,  0],
       [ 3, 27, 26,  0]])>

26、拿到索引后,通过 tf.gather_nd 即可恢复出所有正数的元素

tf.gather_nd(x,indices) # 提取正数的元素值

<tf.Tensor: shape=(3,), dtype=float32, numpy=array([1.9939046 , 0.2653219 , 0.12416901], dtype=float32)>

27、通过 tf.scatter_nd(indices, updates, shape)函数可以高效地刷新张量的部分数据,但是这个函数只能在全0的白板张量上面执行刷新操作。
我们将实现一个向量的刷新实例如下

# 构造需要刷新数据的位置参数,即为 4、3、1 和 7 号位置
indices = tf.constant([[4], [3], [1], [7]])
# 构造需要写入的数据,4 号位写入 4.4,3 号位写入 3.3,以此类推
updates = tf.constant([4.4, 3.3, 1.1, 7.7])
# 在长度为 8 的全 0 向量上根据 indices 写入 updates 数据
tf.scatter_nd(indices, updates, [8])

在这里插入图片描述

可以看到,在长度为 8 的白板上,写入了对应位置的数据,4 个位置的数据被刷新

28、考虑 3 维张量的刷新例子,白板张量的 shape 为[4,4,4],共有 4 个通道的特征图,每个通道大小为4 × 4,现有 2 个通道的新数据 updates:[2,4,4],需要写入索
引为[1,3]的通道上

# 构造写入位置,即 2 个位置
indices = tf.constant([[1],[3]])
updates = tf.constant([# 构造写入数据,即 2 个矩阵
 [[5,5,5,5],[6,6,6,6],[7,7,7,7],[8,8,8,8]],
 [[1,1,1,1],[2,2,2,2],[3,3,3,3],[4,4,4,4]]
])
# 在 shape 为[4,4,4]白板上根据 indices 写入 updates
tf.scatter_nd(indices,updates,[4,4,4])

在这里插入图片描述
在这里插入图片描述

可以看到,数据被刷新到第 2 和第 4 个通道特征图上。

29、通过 tf.meshgrid 函数可以方便地生成二维网格的采样点坐标。通过在 x 轴上进行采样 100 个数据点,y 轴上采样 100 个数据点,然后利用
tf.meshgrid(x, y)即可返回这 10000 个数据点的张量数据,保存在 shape 为[100,100,2]的张量中。为了方便计算,tf.meshgrid 会返回在 axis=2 维度切割后的 2 个张量𝑨和𝑩,其中张量𝑨包含了所有点的 x 坐标,𝑩包含了所有点的 y 坐标,shape 都为[100,100]

x = tf.linspace(-8.,8,100) # 设置 x 轴的采样点
y = tf.linspace(-8.,8,100) # 设置 y 轴的采样点
x,y = tf.meshgrid(x,y) # 生成网格点,并内部拆分后返回
x.shape,y.shape # 打印拆分后的所有点的 x,y 坐标张量 shape

在这里插入图片描述

30、利用生成的网格点坐标张量𝑨和𝑩,Sinc 函数在 TensorFlow 中实现如下

z = tf.sqrt(x**2+y**2)
z = tf.sin(z)/z # sinc 函数实现

31、通过 matplotlib 库即可绘制出函数在𝑥 ∈ [−8,8],𝑦 ∈ [−8,8]区间的 3D 曲面

import matplotlib
from matplotlib import pyplot as plt
# 导入 3D 坐标轴支持
from mpl_toolkits.mplot3d import Axes3D
fig = plt.figure()
ax = Axes3D(fig) # 设置 3D 坐标轴
# 根据网格点绘制 sinc 函数 3D 曲面
ax.contour3D(x.numpy(), y.numpy(), z.numpy(), 50)
plt.show()

在这里插入图片描述

五、任务小结

本节我们完成了填充、复制,tf.tile()函数实现长度为 1 的维度复制的功能。tf.tile 函数除了可以对长度为 1 的维度进行复制若干份,还可以对任意长度的维度进行复制若干份,进行复制时会根据原来的数据次序重复复制。紧接着介绍了数据的下限幅、上下边界限幅。最后展示了高阶操作如tf.gather、tf.gather_nd、tf.boolean_mask、tf.where等一系列操作。通过本节任务需要掌握以下知识:

  • 掌握张量的填充与复制
  • 掌握张量的数据限幅
  • 掌握张量的高阶操作

–end–

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1621701.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Flutter 上架如何解决 ITMS-91053 问题

最近&#xff0c;我的 Flutter App 发布到 TestFlight 后&#xff0c;就会收到一封邮件&#xff1a;The uploaded build for YOUR APP has one or more issues. 上面的邮件主要是说&#xff0c;我的 App 缺少了调用 API 的声明&#xff0c;以前从来没看到过&#xff0c;上网一查…

Python构建学生信息管理系统:构建RESTful API - 学生信息管理系统的后端逻辑

在之前的博客里&#xff0c;我们已经完成了项目初始化&#xff0c;在本篇博客中&#xff0c;我们将深入探讨如何使用Flask框架实现学生信息管理系统的后端逻辑&#xff0c;特别是通过RESTful API来实现学生信息的增删改查&#xff08;CRUD&#xff09;操作。 Flask RESTful AP…

传染病模型SIR及其变体(python版本)

文章目录 传染病模型及其变体1. SI模型1.1代码2. SIS模型2.1 代码3. 基本再生数 basic reproductive number4. SIR模型4.1 代码5. SEIR模型5.1 代码6. SEIJR模型6.1 代码7. SEIJRD模型7.1 代码传染病模型及其变体 1. SI模型 在该模型里面,群体中只有两种人:易感者和感染者。…

数据可视化-ECharts Html项目实战(14)

在之前的文章中&#xff0c;我们深入学习ECharts鼠标左键触发。想了解的朋友可以查看这篇文章。同时&#xff0c;希望我的文章能帮助到你&#xff0c;如果觉得我的文章写的不错&#xff0c;请留下你宝贵的点赞&#xff0c;谢谢。 数据可视化-ECharts Html项目实战&#xff08;…

Open-Sora:开源版的Sora

项目简介 本项目希望通过开源社区的力量复现Sora&#xff0c;由北大-兔展AIGC联合实验室共同发起&#xff0c;当前我们资源有限仅搭建了基础架构&#xff0c;无法进行完整训练&#xff0c;希望通过开源社区逐步增加模块并筹集资源进行训练&#xff0c;当前版本离目标差距巨大&…

java多功能手机

随着科技的发展&#xff0c;手机的使用已经普及到每个家庭甚至个人&#xff0c;手机的属性越来越强大&#xff0c;功能也越来越多&#xff0c;因此人们在生活中越来越依赖于手机。 任务要求&#xff0c;使用所学知识编写一个手机属性及功能分析程序设计&#xff0c;测试各个手机…

国产POL8903 LVDS转MIPI带旋转功能方案介绍

一、芯片简介 1、系统 高性能 MIPS 32bit CPU 内核&#xff1a; 高性能 DSP 内核图像处理单元 16KB指令 Cache 16KB数据 Cache 96KB片上 SRAM 内嵌DDR3控制器 2、 LVDS 输入 支持1或者2通道 LVDS 输入 支持最大1920x108060Hz输入 兼容 VESA 和 JEIDA 格式 通道内5条…

「ChatGPT」掀起新一轮AI热潮!超越GPT-4 Turbo,商汤日日新大升级!

目录 拳打 GPT-4 Turbo &#xff0c;脚踢 DALLE 3 端侧大模型&#xff0c;唯快不破 AI 应用落地需要一个即插即用的大模型超市 并不存在 AI 这个行业&#xff0c;只有 AI行业&#xff0c;强调 AI 需要与传统产业合作&#xff0c;这种关系是结合与赋能&#xff0c;而不是颠覆…

设计模式-状态模式在Java中的使用示例-信用卡业务系统

场景 在软件系统中&#xff0c;有些对象也像水一样具有多种状态&#xff0c;这些状态在某些情况下能够相互转换&#xff0c;而且对象在不同的状态下也将具有不同的行为。 为了更好地对这些具有多种状态的对象进行设计&#xff0c;我们可以使用一种被称之为状态模式的设计模式…

Adobe Illustrator 2024 v28.4.1 (macOS, Windows) - 矢量绘图

Adobe Illustrator 2024 v28.4.1 (macOS, Windows) - 矢量绘图 Acrobat、After Effects、Animate、Audition、Bridge、Character Animator、Dimension、Dreamweaver、Illustrator、InCopy、InDesign、Lightroom Classic、Media Encoder、Photoshop、Premiere Pro、Adobe XD 请…

【注解和反射】获取类运行时结构

继上一篇博客【注解和反射】类加载器-CSDN博客 目录 七、获取类运行时结构 测试 getFields()和getDeclaredFields() getMethods()和getDeclaredMethods() 七、获取类运行时结构 获取类运行时结构通常指的是在Java等面向对象编程语言中&#xff0c;使用反射&#xff08;Ref…

【git学习】Git 的基本操作

文章目录 &#x1f680;创建 Git 本地仓库&#x1f680;配置 Git&#x1f680;认识⼯作区、暂存区、版本库&#x1f680;添加⽂件操作 &#x1f680;创建 Git 本地仓库 仓库是进⾏版本控制的⼀个⽂件⽬录。我们要想对⽂件进⾏版本控制&#xff0c;就必须先创建⼀个仓库出来。 …

谷歌发布基于声学建模的无限虚拟房间增强现实鲁棒语音识别技术

声学室模拟允许在AR眼镜上以最少的真实数据进行训练&#xff0c;用于开发鲁棒的语音识别声音分离模型。 随着增强现实&#xff08;AR&#xff09;技术的强大和广泛应用&#xff0c;它能应用到各种日常情境中。我们对AR技术的潜能感到兴奋&#xff0c;并持续不断地开发和测试新…

web前端框架设计第六课-样式绑定

web前端框架设计第六课-样式绑定 一.预习笔记 1.class属性绑定 给P标签绑定一个类样式&#xff0c;类名为active。当active取值为true时&#xff0c;表示绑定样式成功&#xff0c;取值为false时&#xff0c;取消绑定 以对象形式给P标签绑定多个类样式 以数组形式给P标签绑定多…

网络安全新挑战:通用人工智能(AGI)等级保护指南

通用人工智能&#xff08;AGI&#xff09;的发展现状及趋势 随着2023年大语言模型应用的划时代突破&#xff0c;以ChatGPT为杰出代表的此类技术犹如一股洪流&#xff0c;彻底颠覆了人类与机器智能交互的疆界&#xff0c;引领通用人工智能&#xff08;AGI&#xff09;步入一个崭…

网络基础(day3)建议在电脑端注册登陆观看!!!

【 理论重点】 网络是什么&#xff1f; &#xff08;网络是载体&#xff0c;目的是传输互联网中的数据&#xff0c;数据是终端产生<手机、电脑、服务器等>。&#xff09; 如何组件网络&#xff08;良性网络架构&#xff09;&#xff1f;有网络架构思维&#xff0c;得按层…

宜搜科技死磕港交所上市:从搜索引擎到广告投放,业绩疲态凸显

近日&#xff0c;宜搜科技控股有限公司&#xff08;下称“宜搜科技”&#xff09;向港交所递交招股书&#xff0c;计划在香港主板上市&#xff0c;中银国际为其独家保荐人。 值得注意的是&#xff0c;宜搜科技已在资本市场辗转多年。该公司曾于2014年向纽交所递交上市申请&…

easyExcel快速入门

目录 &#x1f9c2;1.简单介绍 &#x1f32d;2.快速入门 &#x1f953;1.导入依赖 &#x1f37f;2.导出到excel &#x1f38f;3.读入数据 &#x1f389;4.下载 1.简单介绍 传统操作Excel大多都是利用Apach POl进行操作的,但是POI框架并不完善,使用过程非常繁琐且有较多…

Github进行fork后如何与原仓库同步

前言 fork了一个仓库以后怎么同步源仓库的代码&#xff1f; 步骤 1、执行命令 git remote -v 查看你的远程仓库的路径。 以一个实际例子说明&#xff0c; 来源仓库&#xff1a; TheFirstLineOfCode/basaltgit remote -v得到&#xff1a; origin https://github.com/ghmi…

Redis之路系列(5)功夫在诗外

5 拓展篇—功夫在诗外 6.0新特性 相对都比较鸡肋&#xff0c;谨慎在生产环境使用 ACL安全策略 Redis6版本推出了ACL(Access Control List)访问控制权限 的功能&#xff0c;基于此功能&#xff0c;可以设置多个用户&#xff0c;并且给每个用户单独设 置命令权限和数据权限。 …