1. 文章
  2. 文章详情

TensorFlow数据类型入门

GitHub仓库:https://github.com/ZhongFuCheng3y/3y

前篇:从零开始学TensorFlow【01-搭建环境、HelloWorld篇】

一、Tensor介绍

TensorFlow使用Tensor(张量)来表示数据

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

《怎么通俗地理解张量?》https://www.zhihu.com/question/23720923

一种相对通俗易懂的定义:一个量, 在不同的参考系下按照某种特定的法则进行变换, 就是张量。

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

1.1 Tensor的基础

Tensor(张量)实际上就是一个n维的数组。

1.1.1 阶(秩)

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

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

我们可能会看到有下面的一个数组输出形式:

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

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

1.1.2 形状

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

在TensorFlow一般我们会这样描述:在维度一上元素的个数有3个,在维度二上元素的个数有4个。

打印结果:shape = (3,4)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]]

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

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

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

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

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

什么是TensorFlow?

1.1.3 Tensor数据类型

TensorFlow 在内部将张量表示为基本数据类型的 n维数组。

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

Tensor的数据类型如下所示:

什么是TensorFlow?

二、特殊的张量

特殊的张量由一下几种:

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占位符

有些变量可能需要等到运行的时候才把某些变量确定下来,于是我们就有了占位符。

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

# 文件名需要等到运行的时候才确定下来
train_filenames = tf.placeholder(tf.string, shape=[None])

#  ..省略一堆细节
# 运行的时候,通过feed_dict将占位符具体的值给确定下来
feed_dict={train_filenames: training_filenames}

三、Flow--图和节点

在TensorFlow中,使用图 (graph) 来表示计算任务。其实TensorFlow默认会给我们一张空白的,一般我们会叫这个为”数据流图“。数据流图由有向边和节点组成,在使用TensorFlow的时候我们会在图中创建各种的节点,而Tensor会在这些节点中流通。所以,就叫做TensorFlow

在TensorFlow中,节点的类型可以分为三种:

  • 存储节点:有状态的变量操作,通常用于存储模型参数
  • 计算节点:无状态的计算和控制操作,主要负责算法的逻辑或流程的控制
  • 数据节点:数据的占位符操作,用于描述图外输入的数据

在上面创建的变量、常量和占位符在TensorFlow中都会生成一个节点!对于这类的操作Operation(行为)一般大家会简说成op

所以,op就是在TensorFlow中所执行的一个操作统称而已(有可能是创建变量的操作、也有可能是计算的操作)。在TensorFlow的常见的op有以下:

什么是TensorFlow?

其实说白了就是TensorFlow会给我们一张空白的数据流图,我们往这张数据流图填充(创建节点),从而实现想要效果。

什么是TensorFlow?

我们来看看官方的给出数据流图的gif,加深下印象。

  • TensorFlow使用数据流图来表示计算任务
  • TensorFlow使用Tensor来表示数据,Tensor在数据流图中流动。
  • 在TensorFlow中”创建节点、运算“等行为统称为op

什么是TensorFlow?

四、session会话

TensorFlow程序通常被组织成一个构建阶段和执行阶段. 在构建阶段, op的执行步骤被描述成一个图. 在执行阶段, 使用会话执行执行图中的op。

  • 注意:因为是有向边,所以只有等到之前的入度节点们的计算状态完成后,当前节点才能执行操作

我们想要运行出图的结果,那就必须通过session来执行。

例子:

import tensorflow as tf
# 创建数据流图:y = W * x + b,其中W和b为存储节点,x为数据节点。
x = tf.placeholder(tf.float32)
W = tf.Variable(1.0)
b = tf.Variable(1.0)
y = W * x + b

# =========如果不使用session来运行,那上面的代码只是一张图。我们通过session运行这张图,得到想要的结果
with tf.Session() as sess:
    tf.global_variables_initializer().run() # Operation.run
    fetch = y.eval(feed_dict={x: 3.0})      # Tensor.eval
    print(fetch)   # fetch = 1.0 * 3.0 + 1.0

4.1 Fetch

Fetch可以在session.run的时候传入多个op(tensor),然后返回多个tensor(如果只传入一个tensor的话,那就是返回一个tensor)

4.2 tensor.eval()和Operation.run()

有的同学在查阅资料的时候,发现可能调用的不是session.run,而是tensor.eval()和Operation.run()。其实,他们最后的调用的还是session.run。不同的是session.run可以一次返回多个tensor(通过Fetch)。

什么是TensorFlow?

总结

  • 使用 tensor 表示数据.
  • 使用图 (graph) 来表示计算任务.
  • 在会话(session)中运行图
  • 通过 变量 (Variable) 维护状态.

TensorFlow 是一个编程系统, 使用图来表示计算任务. 图中的节点被称之为 op (operation 的缩写). 一个 op 获得 0 个或多个 Tensor, 执行计算, 产生 0 个或多个 Tensor. 每个 Tensor 是一个类型化的多维数组.

参考资料:

乐于输出干货的Java技术公众号:Java3y。公众号内有200多篇原创技术文章、海量视频资源、精美脑图,不妨来关注一下!

什么是TensorFlow?

参考:https://www.jianshu.com/p/462838296ac6

发表评论

登录后才能评论

评论列表(0条)