TensorFlow(R与Python系列第四篇)

news2024/10/7 12:17:59

目录

一、TensorFlow介绍

二、张量

三、有用的TensorFlow运算符

四、reduce系列函数实现约减

1-第一种理解方式:引入轴概念后直观可理

2-第二种理解方式:按张量括号层次的方式

参考:

一、TensorFlow介绍

TensorFlow是一个强大的用于数值计算的库,特别适合大规模机器学习或者可以将其用于需要大量计算的任何其他场景。TensorFlow是由Google Brain团队开发,并未许多Google的大规模服务提供了支持,例如Google Cloud Speech、Google Photos和Google Search。它于2015年11月开源,现在是最受欢迎的深度学习库。

TensorFlow提供什么?

  • TensorFlow核心与NumPy非常相似,但具有GPU支持;
  • TensorFlow支持分布式计算(跨多个设备和服务器);
  • TensorFlow包含一种即时(JIT)编译器,可使其针对速度和内存使用情况来优化计算,它的工作方式是从Python函数中提取计算图,然后进行优化(通过修剪未使用的节点),最后有效地运行它(通过自动并行运算相互独立的操作);
  • 计算图可以导出为可移植格式,因此那你可以在一个环境中(例如Linux上使用Python)训练TensorFlow模型,然后在另一个环境中(例如在Android设备上使用Java)运行TensorFlow模型;
  • TensorFlow实现了自动微分(autodiff),并提供了一些优秀的优化器,例如RMSProp和Nadam,因此你可以轻松地最小化各种损失函数。

TensorFlow使用图(Graph)来表示计算任务,图中的节点(Node)称为op(“operation”的缩写)。一个op获得0个或者多个张量,执行计算,产生0个或者多个张量。每个张量是要给类型化的多维数组。一个TensorFlow图描述了计算的过程。为了进行计算,图必须在Session(会话)里被启动。会话将图的op分发到诸如CPU或GPU之类的设备上,同时提供执行op的方法。这些方法执行后,将所产生的张量返回。

一开始,我们需要导入tensorflow这个包,为了以后调用tensorflow包中的对象、成员变量和成员函数更加方便,我们import tensorflow后面加上了as tf,表示以后可以用tf这个简写来代表tensorflow的全名。

#载入库
import tensorflow as tf

#显示版本
print(tf.__version__) #注意是version前后都是两个下划线。

二、张量

TensorFlow中Tensor意思是“张量”,Flow意思是“流或流动”。任意维度的数据可以称为“张量”,如一维数组、二维数组、N维数组。它最初想要表达的含义是保持计算节点不变,让数据在不同的计算设备上传输并计算。

  • 零阶张量表示标量,一个数;
  • 一阶张量表示一维向量;
  • 2阶张量表示矩阵;
  • n阶张量表示n维数组;

张量中并没有真正存储数字,它存储的是如何得到这些数字的计算过程。TesorFlow中的张量和NumPy中的数组不同,TensorFlow的计算结果不是一个具体的数字,而是一个张量的结构。如:

>>> a = tf.constant([1.0, 2.0], name="a")
>>> a
<tf.Tensor: shape=(2,), dtype=float32, numpy=array([1., 2.], dtype=float32)>
>>> print(a)
tf.Tensor([1. 2.], shape=(2,), dtype=float32)
表 张量数据类型

 

  • 占位符(placeholder):事先未指定的值,(个人理解为C语言中对变量使用前进行定义)
  • 变量(variable):一个可以改变的值,
>>> tf.Variable([[1., 2., 3.],[4., 5., 6]])#matirx
<tf.Variable 'Variable:0' shape=(2, 3) dtype=float32, numpy=
array([[1., 2., 3.],
       [4., 5., 6.]], dtype=float32)>
  • 常量(constant):一个不可变的值,使用tf.constant()创建张量,
>>> tf.constant([[1., 2., 3.],[4., 5., 6]])  #矩阵
<tf.Tensor: shape=(2, 3), dtype=float32, numpy=
array([[1., 2., 3.],
       [4., 5., 6.]], dtype=float32)>
>>> tf.constant(42)                          #标量
<tf.Tensor: shape=(), dtype=int32, numpy=42>

三、有用的TensorFlow运算符

  • tf.add(x,y) 两个类型相同张量相加,x+y;
  • tf.subtract(x,y)两个类型相同张量相减,x-y;
  • tf.multiply(x,y)两个张量元素相乘
  • tf.pow(x,y)求元素x的y次方
  • tf.exp(x)相当于pow(e,x)其中e为欧拉常数(2.718...)
  • tf.sqrt(x)相当于pow(x,0.5)
  • tf.div(x,y)两个张量元素相除
  • tf.truediv(x,y)与tf.div相同,但将参数转换为浮点数
  • tf.floordiv(x,y)与tf.truediv相同,但将最终结果取整
  • tf.mod(x,y)取元素商的余数
  • tf.negative(x)每个元素都取反

四、reduce系列函数实现约减

  • tf.reduce_mean()
  • tf.reduce_sum()
  • tf.reduce_max()
  • tf.math.log()

约减这一概念的解释,可以通过以下两种方法来理解:

  1. 引入轴的概念,0表示垂直方向,即沿着行的方向,1表示水平方向,即沿着列的方向;
  2. 按张量括号层次的方式

其中第一种理解方式简单且直观,但是仅限于2维以内的数组,当维数超过3时,我们很闹找到直观可以理解的方向。

1-第一种理解方式:引入轴概念后直观可理

tf.reduce_sum()功能时对张量中的所有元素进行求和,它的函数原型如下:

reduce_sum( input_tensor,  axis=None,  keep_dims=False,  name=None, reduction_indices=None)

  • 第一个参数input_tensor时必需的
  • 第二个参数axis,决定了约减的轴方向,
    • 如果axis=0,则可以简单的将其理解为从垂直方向进行约减,也就是说,对按行进行处理;
    • 如果axis=1,则可以简单的将其理解为从水平方向进行约减,也就是说,对按列进行处理;
    • 对张量而言,约减可以有先后顺序的。因此,axis的值可以是一个向量,axis=[1,0]表示先水平方向约减,再垂直方向约减。反之,axis=[0,1]表示先垂直方向约减,再水平方向约减。
    • 如果axis没有指定方向,那么将采用默认值None,表示所有维度的张量都会被依次约减。
    • 个人感觉:有点像apply(x,1, function)的感觉。
  • keep_dims为真True,则每个维度的张量被约减到长度为1,即保留了维度信息。
  • 参数name是可选项,表示为这个操作取一个名字。
  • 参数reduction_indices已经过时,它已经完全被axis取代,此处保留的目的仅为兼容旧代码。
>>> x = tf.constant([[1, 2, 3],[4, 5, 6]])
>>> x
<tf.Tensor: shape=(2, 3), dtype=int32, numpy=
array([[1, 2, 3],
       [4, 5, 6]])>
>>> tf.reduce_sum(x)  #axis取默认值,即对两个维度都执行约减
<tf.Tensor: shape=(), dtype=int32, numpy=21>
>>> tf.reduce_sum(x,0)  #axis=0
<tf.Tensor: shape=(3,), dtype=int32, numpy=array([5, 7, 9])>
>>> tf.reduce_sum(x,1)  #axis=1
<tf.Tensor: shape=(2,), dtype=int32, numpy=array([ 6, 15])>

2-第二种理解方式:按张量括号层次的方式

由于第一种理解方式对三维以上数组的约减没办法找到直观可以理解的方向,因此,更加普适的解释应该是按张量括号层次的方式来理解。张量括号由外到内,对应从小到大的维数,最外面的括号为0,表示第0维度;倒数第二括号,记为1,表示第1维度;以此类推0,1,2,。。。

>>> y=tf.constant([[[1, 1, 1],[2, 2, 2]],[[3, 3, 3],[4, 4, 4]]])
>>> y
<tf.Tensor: shape=(2, 2, 3), dtype=int32, numpy=
array([[[1, 1, 1],
        [2, 2, 2]],

       [[3, 3, 3],
        [4, 4, 4]]])>
>>> tf.reduce_sum(y,0)
<tf.Tensor: shape=(2, 3), dtype=int32, numpy=
array([[4, 4, 4],
       [6, 6, 6]])>
>>> tf.reduce_sum(y,1)
<tf.Tensor: shape=(2, 3), dtype=int32, numpy=
array([[3, 3, 3],
       [7, 7, 7]])>
>>> tf.reduce_sum(y,2)
<tf.Tensor: shape=(2, 2), dtype=int32, numpy=
array([[ 3,  6],
       [ 9, 12]])>
>>> tf.reduce_sum(y,[0,1])
<tf.Tensor: shape=(3,), dtype=int32, numpy=array([10, 10, 10])>
>>> tf.reduce_sum(y,[0,1,2])
<tf.Tensor: shape=(), dtype=int32, numpy=30>
  • 当axis=0时:

  • 当axis=1时:

  • 当axis=2时:

总结使用外层括号的进行约减的步骤:

  1. 根据axis的值,将相应的成对括号进行配对,括号内的元素表示这个维度下的元素,注意,这个维度下的元素可以根据相应的成对括号有几对便有几组;
  2.  计算每组这个维度下元素的和,注意,这里的元素可以表示标量、矩阵、三维数组、N维数组;
  3. 将每组这个维度下的计算结果放回到原先划分这个维度的元素的位置里,同时去掉这个维度的配对的括号。

参考:

《深度学习之美:AI时代的数据处理与最佳实践》(2018年6月出版,电子工业出版社)(这本书是我目前看到的介绍reduce(约减)最棒的书!把约减这个概念介绍的很清楚!其他书在介绍约减时很含糊,对于初学者不友好。)

《机器学习实战:基于Scikit-Learn、Keras和TensorFlow(原书第2版)》(2020年10月出版,机工社)

《Python深度学习:基于TensorFlow》(Python深度学习:基于TensorFlow)

《TensorFlow机器学习(原书第2版)》(2022年5月出版,机工社)

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

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

相关文章

通过HFS低成本搭建NAS,并内网穿透实现公网访问

文章目录 前言1.下载安装cpolar1.1 设置HFS访客1.2 虚拟文件系统 2. 使用cpolar建立一条内网穿透数据隧道2.1 保留隧道2.2 隧道名称2.3 成功使用cpolar创建二级子域名访问本地hfs 总结 前言 云存储作为一个新概念&#xff0c;在前些年炒的火热&#xff0c;虽然伴随一系列黑天鹅…

打不开github,解决方案

国内加载Githup会很慢&#xff0c;有时候会自己连接超时进不去&#xff0c; 那么如何访问呢&#xff0c;下面就带大家来一起操作 这篇文章借鉴于&#xff08;解决国内 github.com 打不开的最最最准确方法_杨大脸I的博客-CSDN博客&#xff09; 原作者是它&#xff0c;我这里也是…

同步推送?苹果计划本月推出 iOS17和iPadOS17,你的手机支持吗?

据报道&#xff0c;苹果公司计划在本月推出 iOS 17 和 iPadOS 17 正式版更新。与去年不同的是&#xff0c;这次更新将同时发布&#xff0c;而不是分别发布。根据彭博社的一位消息人士马克・古尔曼的说法&#xff0c;苹果公司认为 iOS 17 和 iPadOS 17 的第八个测试版已经非常接…

若伊代码分析(前端 vue2 登录页)

目录 前端项目搭建 项目调整及element引入 登录界面样式 获取验证码 全局变量 vue中利用.env文件存储全局环境变量&#xff0c;以及配置vue启动和打包命令 配置.env文件 获取.env中的全局变量 实际用处 --------项目代码------- 跨域配置 配置代理方式一 配置代理…

更健康舒适更科技的照明体验!书客SKY护眼台灯SUKER L1上手体验

低价又好用的护眼台灯是多数人的需求&#xff0c;很多人只追求功能性护眼台灯&#xff0c;显色高、无频闪、无蓝光等基础需求。但是在较低价格中很难面面俱到&#xff0c;然而刚发布的SUKER书客L1护眼台灯却是一款不可多得的性价比护眼台灯&#xff0c;拥有高品质光源&#xff…

【2023】CompletableFuture使用代码案例实习使用场景介绍

CompletableFuture 一、介绍1、概述2、常用方法 二、方法使用1、异步操作1.1、创建任务&#xff08;runAsync | supplyAsync&#xff09;runAsyncsupplyAsync 1.2、获取结果&#xff08;get | join&#xff09;1.3、异常处理&#xff08;whenComplete | exceptionally&#xff…

机器学习(吴恩达第一课)

课程链接 文章目录 第一周1、机器学习定义2、监督学习(Supervised learning)1、回归(Regression)2、分类(Classification) 3、无监督学习(Unsupervised learning)4、线性回归模型5、代价函数6、梯度下降(Gradient descent)1、学习率2、用于线性回归的梯度下降 第二周(多维特征…

根据梁山好汉的武力值排交椅:python知识点串联sorted,enumerate,zip,list comprehension

故事发生的背景是这样的&#xff0c;水泊梁山好汉武松&#xff0c;鲁智深&#xff0c;杨志三人在上梁山前&#xff0c;共同落草过二龙山&#xff0c;好汉们需要根据其战斗力的高低来排座次&#xff0c;战斗力最高的坐第一把交椅&#xff0c;其次的坐第二把交椅&#xff0c;以此…

【业务功能篇96】微服务-springcloud-springboot-认证服务-登录注册功能-Auth2.0-分布式session

5.登录功能 通过最基础的登录操作来完成登录处理 登录页面处理 认证服务的处理 /*** 注册的方法* return*/PostMapping("/login")public String login(LoginVo loginVo , RedirectAttributes redirectAttributes){R r memberFeginService.login(loginVo);if(r.getC…

22 元类技术(面向切片编程)|ORM的实现|抽象类与接口类

文章目录 前情知识补充hasattr 函数setattr函数getattr函数join 函数 元类技术使用type创建类什么是元类&#xff08;概念总结&#xff09;\_\_metaclass\_\_属性使用metaclass 的函数方式进行创建类使用metaclass 的类方式进行创建类 自定义元类 元类实现ORM接口类与抽象类抽象…

分治NTT/在线卷积

https://www.luogu.com.cn/problem/P4721 已知 g g g&#xff0c;求 考虑分治&#xff0c;现在在 [ l , r ] [l,r] [l,r]&#xff0c;先计算 [ l , m i d ] [l, mid] [l,mid]&#xff0c;然后计算 [ l , m i d ] [l, mid] [l,mid] 对 [ m i d 1 , r ] [mid1,r] [mid1,r…

Java elasticsearch scroll模板实现

一、scroll说明和使用场景 scroll的使用场景&#xff1a;大数据量的检索和操作 scroll顾名思义&#xff0c;就是游标的意思&#xff0c;核心的应用场景就是遍历 elasticsearch中的数据&#xff1b; 通常我们遍历数据采用的是分页&#xff0c;elastcisearch还支持from size的方…

Redis基础知识(二):事务机制

文章目录 一、什么是事务机制&#xff1f;二、Redis模式下如何实现事务机制&#xff1f;2.1 显式开启一个事务2.2 将命令入队列Queue2.3 执行事务或丢弃2.4 EXEC命令执行示例2.5 DISCARD命令&#xff1a;放弃事务2.6 因为命令错误导致的事务回滚 三、Redis事务机制能实现哪些属…

气象监测——关于气象监测站的介绍

在科技日益发展的今天&#xff0c;人类对自然环境的认识和依赖程度越来越高。气象监测站作为用于收集、分析和传播气象数据的设施&#xff0c;为天气预报、气候变化研究、灾害防治等方面提供数据支持。随着科技的不断进步&#xff0c;气象监测站已经发展成为集多种高科技设备于…

leetcode 594.最长和谐子序列(滑动窗口)

⭐️ 题目描述 &#x1f31f; leetcode链接&#xff1a;最长和谐子序列 思路&#xff1a; 第一步先将数组排序&#xff0c;在使用滑动窗口&#xff08;同向双指针&#xff09;&#xff0c;定义 left right 下标&#xff0c;比如这一组数 {1,3,2,2,5,2,3,7} 排序后 {1,2,2,2,3,…

Java问题诊断和排查工具

文章目录 一、前言二、Java问题诊断和排查工具1、JDK自带工具2、常用命令3、JAVA Dump&#xff1a;3.1、jps3.2、jstack3.3、jmap3.3.1、jmap -heap pid:查看堆使用情况3.3.2、jmap -histo pid&#xff1a;查看堆中对象数量和大小3.3.3、jmap -dump:formatb,fileheapdump pid&a…

教你如何高效批量分割长视频,让你的视频制作更轻松

在视频制作过程中&#xff0c;我们常常需要从长视频中分割出一些重要的片段&#xff0c;以便进行后续的编辑和处理。然而&#xff0c;这是一项耗时且繁琐的任务。今天&#xff0c;我们将为您介绍一种高效分割长视频的方法&#xff0c;让您在视频制作中更高效、更便捷。 首先&am…

C. To Add or Not to Add

题目&#xff1a; 样例1&#xff1a; 输入 5 3 6 3 4 0 2输出 3 4 样例2&#xff1a; 输入 3 4 5 5 5输出 3 5 样例3&#xff1a; 输入 5 3 3 1 2 2 1输出 4 2 思路&#xff1a; 贪心题目&#xff0c;化分离数为块。这里要注意的是 需要进行的排序 以及操作的过程是什么样子…

【本地代码问题】启动程序,报错:java.lang.IllegalArgumentException: No selectors

启动程序的时候报错了 问题怎么出现的解决方式&#xff0c;注释掉jetty的内容&#xff0c;回归tomcat的使用 问题怎么出现的 我本地启动程序的时候报错了&#xff1a;报的是这个错误&#xff0c;可能和容器的选择有关吧 解决方式&#xff0c;注释掉jetty的内容&#xff0c;回…

2.2 PE结构:文件头详细解析

PE结构是Windows系统下最常用的可执行文件格式&#xff0c;理解PE文件格式不仅可以理解操作系统的加载流程&#xff0c;还可以更好的理解操作系统对进程和内存相关的管理知识&#xff0c;DOS头是PE文件开头的一个固定长度的结构体&#xff0c;这个结构体的大小为64字节&#xf…