tensor 即张量,是 tf 的核心数据结构,它可以是一个标量、向量、矩阵、多维数组

 

基本属性

Tensor 有 3 个基本属性

d2 = tf.constant([1., 2.])
print(d2)           # Tensor("Const:0", shape=(2,), dtype=float32)

解释如下

节点名:输出:Tensor 是节点的输入和输出,节点就是操作 op,上图中 add 就是一个 op,代表这个 Tensor 是 add 操作的输出

这点很重要,用来判断是不是 操作op   

数据格式:tf.string、tf.float32、tf.int16、tf.int32、tf.complex64(复数)、tf.bool 等 

 

基本属性可直接获取,无需 Session

d1 = tf.ones((2, 3))
## 直接获取属性,无需 session
print(d1)           # Tensor("ones:0", shape=(2, 3), dtype=float32)
print(d1.shape)     # (2, 3)
print(d1.dtype)     # <dtype: 'float32'>

 

shape

值得注意的是第二个属性 shape,它和 numpy 中的 shape 是一样的

先看个例子:

d2 = tf.constant([1., 2.])
print(d2)           # Tensor("Const:0", shape=(2,), dtype=float32)      ### 我们发现 shape 并不是 (1, 2)
#### vs numpy
d3 = np.array([1, 2])
print(d3.shape)     # (2,)      ### numpy 的 shape 与 Tensor 的 shape 一致

跟我们理解的 shape 略有不同,其实 shape 是这样的,

shape 中 元素的个数 代表 Tensor 的维度,或者说阶数,每个元素的值 代表 这个维度上的 长度;

# shape=(100,784) 代表该张量有两个维度,第一个维度长度为100,第二个维度长度为784,二维数组100行784列;
# shape=(2,) 代表该张量有一个维度,第一个维度长度为2,一维数组1行2列

 

再看个例子:

d4 = tf.constant([[[1, 1, 1, 1], [2, 2, 2, 3]], [[3, 3, 3, 3], [4, 4, 4, 4]]])
print(d4)           # Tensor("Const_1:0", shape=(2, 2, 4), dtype=int32)
#### vs numpy
d5 = np.array([[[1, 1, 1, 1], [2, 2, 2, 3]], [[3, 3, 3, 3], [4, 4, 4, 4]]])
print(d4.shape)     # (2, 2, 4)     ### numpy 的 shape 与 Tensor 的 shape 一致

其实对于高维数组来说,shape 就是矩阵的形状,如

[[[1,2,3],[4,5,6]]]
# 第一个维度中只有一个元素[[1,2,3][4,5,6]],所以第一个维度长度为1
# 第二个维度中有两个元素[1,2,3][4,5,6],所以第二个维度长度为2
# 第三个维度中有三个元素“1,2,3”或“4,5,6”,所以第三个维度长度为3
# 那么它的shape参数就是[1,2,3]

 

注意:形状不一定在编译时确定,可以在运行是通过推断得出

 

阶数:Tensor 的维度

阶数的获取需要 session

示例

d1 = tf.ones([3, 2])
n1 = tf.rank(d1)
print(n1)               # Tensor("Rank:0", shape=(), dtype=int32)  阶数 不可直接获取,需要 session
d2 = tf.constant([[[1, 1, 1, 1], [2, 2, 2, 3]], [[3, 3, 3, 3], [4, 4, 4, 4]]])
n2 = tf.rank(d2)
with tf.Session() as sess:
    print(sess.run(n1))     # 2 阶张量
    print(sess.run(n2))     # 3 阶张量

 

tf 中有几种比较特别的张量

tf.constant  常量

tf.Variable   变量

tf.placeholder  占位符

他们都具有 Tensor 的属性 

 

常量

注意几点:

1. 不同类型的常量不能运算

2. 常量可像 python 变量一样直接赋值

def constant(value, dtype=None, shape=None, name="Const")

 

示例

### 单个元素
d1 = tf.constant(1)
d2 = tf.constant(2, dtype=tf.int32, name='int')
d3 = tf.constant(3., dtype=tf.float32, name='float')
d4 = tf.add(d1, d2)
# d5 = d1 + d3                ### 不同类型的数据不能运算
d6 = d1 + d2

sess1 = tf.Session()
print(sess1.run(d4))        # 3
# print(sess1.run(d5))        ### 报错 type float32 does not match type int32
print(sess1.run(d6))        # 3
print(type(d6))             # <class 'tensorflow.python.framework.ops.Tensor'>


### 矩阵
d1 = tf.constant([[1., 2.]])
d2 = tf.constant([[2.], [3.]])
d3 = tf.matmul(d1, d2)

## 常数赋值
d2 = d1

sess2 = tf.Session()
print(sess2.run(d3))        # [[8.]]
print(sess2.run(d2))        # [[1. 2.]]

 

 

 

参考资料: