从零开始学TensorFlow【什么是TensorFlow?】上

简介: 笔记

一、Tensor介绍


在介绍之前,首先要记住一个结论:TensorFlow使用Tensor来表示数据

接着我们来看看什么是Tensor,在官网的文档中,Tensor被翻译成”张量“。其中也给出了一个定义:

张量是对矢量和矩阵向潜在的更高维度的泛化,TensorFlow 在内部将张量表示为基本数据类型的n维数组

不知道你们看完这句话有啥感受,反正我当时就看不懂,啥是”张量“?。于是,我就跑去知乎里边用关键字搜了一下:”张量是什么“。果真给我搜到了相关的问题:《怎么通俗地理解张量?》

我本以为通过知乎,就可以通俗易懂地理解什么是张量,能给我一个清晰的认识。殊不知,大多数答主都在回答在物理和数学中张量的定义,随后贴出了一堆我看不懂的公式。其中,也看到了一种相对通俗易懂的定义:

一个量, 在不同的参考系下按照某种特定的法则进行变换, 就是张量.

把所有答主的回答都阅读了一遍,看完就更加抽象了。再回到官方文档中,看看官方介绍张量的例子,貌似有点懂了。

目前为止我们有两个结论:

  • TensorFlow使用Tensor来表示数据
  • TensorFlow 在内部将张量表示为基本数据类型的n维数组

我再翻译一下上面的两句话:在TensorFlow所有的数据都是一个n维的数组,只是我们给它起了个名字叫做张量(Tensor)

中间折腾了一大堆,实际上还是将最开头的结论和官方的定义再翻译成自己觉得好理解的话…但很多时候,学习就这么一个过程。


1.1Tensor的基础


从上面我们已经得知,Tensor(张量)实际上就是一个n维的数组。这就延伸了几个的术语:

  • 阶(秩)
  • 形状


1.1.1阶(秩)


其实上,阶就是平时我们所说的维数

  • 比如我们有一个二维的数组,那么这个阶就是2
  • 比如我们有一个三维的数组,那么这个阶就是3

以前在写Java的时候,可能一般接触到的都是二维的,但在机器学习上就很可能有很高的维度,那维数我们怎么数?很简单,我们数括号就行了。举个例子,我们可能会看到有下面的一个数组输出形式:

[[[9 6]
  [6 9]
  [8 8]
  [7 9]]
 [[6 1]
  [3 5]
  [1 7]
  [9 4]]]

我们直接看第一个括号到第一个数字,有多少个括号就知道了。[[[9可以发现有3个括号,那这个就是一个三维的数组,它的阶(秩)就是3


1.1.2形状


张量的形状可以让我们看到每个维度中元素的数量

比如我们在Java中创建出一个二维的数组:int [][] array = new int[3][4],我们就可以知道这个数组有三行有四列。但如果我们创建出一个多维的数组,单单只用行和列就描述不清了。所以,在TensorFlow一般我们会这样描述:

  • 在维度一上元素的个数有3个,在维度二上元素的个数有4个。
  • 其实说到底还是一个意思,但只是说法变了而已。

如果我们要打印上面数组的形状时,我们可以得到这样的结果:shape = (3,4)。我们再看看第一篇写”机器学习HelloWorld“的时候,再来看看当时打印的结果:shape = (60000, 28, 28)。通过shape我们就可以得到一些信息

  • 当前数组是三维的
  • 在第一维中有60000个元素
  • 在第二维中有28个元素
  • 在第三维中有28个元素

那我们如果拿到一个数组,怎么通过肉眼看他的shape呢?

比如说:m = [[1, 2, 3], [4, 5, 6], [7, 8, 9]],这个很简单,一眼就可以看出这个是一个二维数组(矩阵),有三行三列。所以shape的结果应该是(3,3)

再来看一个:t = [[[2], [4], [6]], [[8], [10], [12]], [[14], [16], [18]]],从多个括号上我们可以看出,这是三维的。我们先把最外层括号去掉得到的结果是[[2], [4], [6]], [[8], [10], [12]], [[14], [16], [18]]

Ok,到这一步,我们可以理解成有个子数组,于是我们的shape可以先写成shape(3,?,?)

  • 我们从括号上判断一定是三维的,所以肯定是(?,?,?)的。从“子数组”的个数我们将第一个“?”号填充为3

随后,我们继续把外层的括号去除,得到这样的结果:[2], [4], [6],也是有三个元素,于是我们的shape就可以填成shape(3,3,?)

最后,再把括号去掉,我们可以发现只有一个元素,于是最后的结果就是shape(3,3,1)

我们可以看下图来巩固一下上面所说的概念:

40.jpg                                                                       例子


1.1.3 Tensor数据类型


TensorFlow 在内部将张量表示为基本数据类型的 n维数组,没错的。在一个数组里边,我们总得知道我们的存进去的数据究竟是什么类型

  • 我们可以将任意数据结构序列化为 string 并将其存储在 tf.Tensor 中。通过tf.cast可以将 tf.Tensor 从一种数据类型转型为另一种。

Tensor的数据类型如下所示:

41.jpg                                                   Tenor的数据类型


二、特殊的张量


特殊的张量由一下几种:

  • tf.Variable— 变量
  • tf.constant— 常量
  • tf.placeholder—占位符
  • tf.SparseTensor—稀疏张量

这次,我们先来讲讲前三种(比较好理解),分别是变量、常量和占位符。


2.1 常量


常量就是常量的意思,一经创建就不会被改变。(相信大家还是能够理解的)

在TensorFlow中,创建常量的方式十分简单:

a = tf.constant(2)
b = tf.constant(3)


2.2变量


变量也挺好理解的(就将编程语言的概念跟这里类比就好了)。一般来说,我们在训练过程中的参数一般用变量进行存储起来,因为我们的参数会不停的变化。

在TensorFlow创建变量有两种方式:

# 1.使用Variable类来创建
# tf.random_normal 方法返回形状为(1,4)的张量。它的4个元素符合均值为100、标准差为0.35的正态分布。
W = tf.Variable(initial_value=tf.random_normal(shape=(1, 4), mean=100, stddev=0.35), name="W")
b = tf.Variable(tf.zeros([4]), name="b")
# 2.使用get_variable的方式来创建
my_int_variable = tf.get_variable("my_int_variable", [1, 2, 3], dtype=tf.int32,
  initializer=tf.zeros_initializer)

值得注意的是:当我们创建完变量以后,我们每次使用之前,都需要为其进行初始化!

tf.global_variables_initializer()


2.3占位符


我最早接触占位符这个概念的时候是在JDBC的时候。因为SQL需要传入的参数才能确定下来,所以我们可能会写出这样的SQL语句:select * from user where id =?

同样地,在TensorFlow占位符也是这么一个概念,可能需要等到运行的时候才把某些变量确定下来,于是我们就有了占位符。

在TensorFlow使用占位符也很简单:

# 文件名需要等到运行的时候才确定下来
train_filenames = tf.placeholder(tf.string, shape=[None])
#  ..省略一堆细节
# 运行的时候,通过feed_dict将占位符具体的值给确定下来
feed_dict={train_filenames: training_filenames}

上面的东西说白了在编程语言中都是有的,只是语法变了而已


目录
相关文章
|
存储 关系型数据库 MySQL
大数据量分页查询怎么优化提速
大数据量分页查询怎么优化提速
273 2
|
图形学
unity3d UGUI常用游戏进度条实现方式
测试.png 直接将脚本挂载到进度条image对象上即可,这种方式可以解决当进度条使用图片的时候,防止图片拉伸变形 using UnityEngine; using UnityEngine.
3358 0
|
云安全 存储 监控
云安全:云计算安全
云安全是指在云计算环境中保护数据、应用程序和相关服务不受威胁的一系列策略、技术和控制措施。随着云计算的快速发展,云安全已成为企业和个人用户最关心的问题之一。云安全的目标是确保云环境中数据的机密性、完整性和可用性,同时防止数据丢失、服务中断和不正当访问。
1139 81
|
iOS开发 索引 MacOS
mac文件搜索工具
【10月更文挑战第11天】
1280 2
|
中间件 编译器 数据处理
在web开发中应用管道过滤器
【9月更文挑战第1天】本文介绍管道-过滤器架构将数据处理流程分解为一系列独立组件,通过管道连接,适用于数据流处理如图像处理、编译器设计等。通过具体实例说明了Gin如何有效支持管道-过滤器风格的设计,构建高性能Web服务。
335 10
|
人工智能 自动驾驶 云栖大会
2023云栖大会 阿里云CTO周靖人,打造一朵AI时代最开放的云
2023云栖大会上,阿里云宣布了一项重磅计划:阿里云高校计划,助力高校科研与教育加速,让每位中国在校大学生真实受益于普惠算力。目前,清华大学、北京大学、浙江大学、上海交通大学、中国科学技术大学、华南理工大学等高校已首批达成合作。
89897 307
|
弹性计算 负载均衡 关系型数据库
使用资源编排 ROS 轻松部署高可用架构网站——以 WordPress 为例
WordPress 是流行的开源 CMS,阿里云的资源编排服务 (ROS) 提供 IaC 功能,简化云上资源自动化部署,如创建 VPC、ECS、SLB、RDS 和弹性伸缩等。通过 ROS 模板(JSON/YAML),用户能快速部署高可用的 WordPress 环境,包括负载均衡、多可用区的 ECS 服务器集群、高可用 RDS 数据库等。模板定义了资源、参数和输出,用户在 ROS 控制台配置参数后一键部署。ROS 提升了部署效率,便于跨地域复制相同架构。
使用资源编排 ROS 轻松部署高可用架构网站——以 WordPress 为例
|
移动开发 网络协议 编译器
实战案例3:C语言实现的HTTP服务器
实战案例3:C语言实现的HTTP服务器
|
JavaScript
vue 批量绑定属性(你可能没这样用过 v-bind)
vue 批量绑定属性(你可能没这样用过 v-bind)
449 0
|
机器学习/深度学习 传感器 人工智能
敢不敢和AI比猜拳?能赢算我输----基于手势识别的AI猜拳游戏【含python源码+PyqtUI界面+原理详解】-python手势识别 深度学习实战项目
敢不敢和AI比猜拳?能赢算我输----基于手势识别的AI猜拳游戏【含python源码+PyqtUI界面+原理详解】-python手势识别 深度学习实战项目