可以先看看张量的官方介绍:
在tensorflow程序中所有的数据都通过张量的形式来表示。TensorFlow 中的核心数据单位是张量。张量是对矢量和矩阵向潜在的更高维度的
泛化。对内,TensorFlow 将张量表现为基本数据类型的 n 维数组。
其中零阶张量表示标量(scalar)也就是一个数;一阶张量为向量,也就是一维数组;n阶张量可以理解为一个n维数组。
但张量的实现并不是直接采用数组的形式,它只是对TensorFlow中运算结果的引用。在张量中并没有保存数字,它保存的是如何得到这些数字的计算过程。
以下是主要的特殊张量:
- tf.Variable
- tf.constant
- tf.placeholder
- tf.SparseTensor
除
tf.Variable
以外,张量的值不可变,这意味着在单一执行的情况下,张量只有一个值。然而,同一张量的两次评估可能会返回不同的值;例如,该张量可以是从磁盘读取数据的结果,或是生成随机数的结果。记住这一点,运行每一次session的时候,张量所拿到的值可能是不一样的,因为它在run的过程中重新赋值了。
一个张量主要有以下属性:
- 形状(shape)
- 类型(type),例如 float32,int32 或 string
数据类型
你可以为一个张量指定下列数据类型中的任意一个类型:
数据类型
|
Python 类型
|
描述
|
DT_FLOAT
|
tf.float32
|
32 位浮点数.
|
DT_DOUBLE
|
tf.float64
|
64 位浮点数.
|
DT_INT64
|
tf.int64
|
64 位有符号整型.
|
DT_INT32
|
tf.int32
|
32 位有符号整型.
|
DT_INT16
|
tf.int16
|
16 位有符号整型.
|
DT_INT8
|
tf.int8
|
8 位有符号整型.
|
DT_UINT8
|
tf.uint8
|
8 位无符号整型.
|
DT_STRING
|
tf.string
|
可变长度的字节数组.每一个张量元素都是一个字节数组.
|
DT_BOOL
|
tf.bool
|
布尔型.
|
DT_COMPLEX64
|
tf.complex64
|
由两个32位浮点数组成的复数:实数和虚数.
|
DT_QINT32
|
tf.qint32
|
用于量化Ops的32位有符号整型.
|
DT_QINT8
|
tf.qint8
|
用于量化Ops的8位有符号整型.
|
DT_QUINT8
|
tf.quint8
|
用于量化Ops的8位无符号整型.
|
阶(rank)
在TensorFlow系统中,张量的维数来被描述为阶
。
比如,下面的张量(使用Python中list定义的)就是2阶。
t = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
你可以认为一个二阶张量就是我们平常所说的矩阵,一阶张量可以认为是一个向量。对于一个二阶张量你可以用语句t[i, j]来访问其中的任何元素。而对于三阶张量你可以用't[i, j, k]'来访问其中的任何元素。
#直观上可以理解为左边有多少个
中括号"["
就是
多少阶
。
阶
|
数学实例
|
Python 例子
|
0
|
标量 (只有大小)
|
s = 483
|
1
|
向量(大小和方向)
|
v = [1.1, 2.2, 3.3]
|
2
|
矩阵(数据表)
|
m = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
|
3
|
3阶张量 (数据立体)
|
t = [[[2], [4], [6]], [[8], [10], [12]], [[14], [16], [18]]]
|
n
|
n阶 (自己想想看)
|
....
|
TensorFlow文档中使用了三种记号来方便地描述张量的维度:阶,形状以及维数.下表展示了他们之间的关系:
阶
|
形状
|
维数
|
示例
|
0
|
[]
|
0-D
|
0 维张量。标量。
|
1
|
[D0]
|
1-D
|
形状为 [5] 的 1 维张量。
|
2
|
[D0, D1]
|
2-D
|
形状为 [3, 4] 的 2 维张量。
|
3
|
[D0, D1, D2]
|
3-D
|
形状为 [1, 4, 3] 的 3 维张量。
|
n
|
[D0, D1, ... Dn-1]
|
n-D
|
形状为 [D0, D1, ... Dn-1] 的张量。
|
形状(shape)
张量的形状是每个维度中元素的数量, 形状(shape)不能认为它是一个元组(尽管写法一样)。
t = tf.constant([[[
1
,
1
,
1
], [
2
,
2
,
2
]], [[
3
,
3
,
3
], [
4
,
4
,
4
]]])
tf.shape(t)
# (2, 2, 3)
那么第一个
2是指[ [1, 1, 1], [2, 2, 2]] 还有 [[3, 3, 3], [4, 4, 4]], 共有2个组合, 第二个
2是指[1, 1, 1], [2, 2, 2]这个组合还有 [[3, 3, 3], [4, 4, 4]]这个组合。
3就是[1, 1, 1]这个列表里面有3个元素了。
cool_numbers = tf.
Variable
([
3.14159
,
2.71828
], tf.float32) #1阶张量,共有2个元素,所以shape是(2)
linear_squares = tf.
Variable
([[
4
], [
9
], [
16
], [
25
]], tf.int32) #2阶张量,shape是(4,1)
my_image = tf.zeros([
10
,
299
,
299
,
3
]) #4阶张量,shape是(
10
,
299
,
299
,
3
),其实zeros里面的参数就是一个shape(不要认为它是一个值列表,这跟用Variable创建一个张量参数不一样
)。