TensorFlow基本概念之张量
张量:Tensor
在TensorFlow中,张量是数据流图上的数据载体,tensorflow中的tensor就是张量的意思,使用张量统一表示所有数据。
张量可以看做是0阶标量,1阶向量和2阶矩阵在高维空间的推广。
张量与常见数据实体的关系如图所示:
阶数 | 数据实体 | python样例 |
---|---|---|
0 | 标量 | scalar = 1 |
1 | 向量 | vector =[1,2,3] |
2 | 矩阵 | matirx=[[1,2],[3,4]] |
3 | 数据立方 | tensor=[[[1,2],[3,4]],[[5,6],[7,8]]] |
n | n阶张量 | … |
1.打印hello world
import tensorflow as tf
hello = tf.constant("hello world")
sess = tf.Session()
print(sess.run(hello))
2.张量支持的数据类型
张量支持多种数据类型,除了浮点数、整数、字符串、布尔等类型外,还支持复数和量化整数类型,主要的数据类型如下:
TensorFlow数据类型 | 说明 |
---|---|
tf.float16 | 半精度浮点数 |
tf.float32 | 单精度浮点数 |
tf.float64 | 双精度浮点数 |
tf.bfloat16 | 裁短浮点数 |
tf.int8 | 8位有符号整数 |
tf.int16 | 16位有符号整数 |
tf.int32 | 32位有符号整数 |
tf.int64 | 64位有符号整数 |
tf.uint | 8位无符号整数 |
tf.uint16 | 16位无符号整数 |
tf.string | 字符串 |
tf.bool | 布尔值 |
tf.complex64 | 单精度复数 |
tf.complex128 | 双精度复数 |
tf.qint8 | 量化的8位有符号整数 |
tf.qint16 | 量化的16位有符号整数 |
tf.qint32 | 量化的32位有符号整数 |
tf.quint | 量化的8位无符号整数 |
tf.quint16 | 量化的16位无符号整数 |
3.创建张量
a = tf.constant(1.0)
print(a)
输出结果
<tf.Tensor 'Const_2:0' shape=() dtype=float32>
shape=() 表示是标量
d = tf.constant([1.0,2.0])
print(d)
Tensor("Const_5:0", shape=(2,), dtype=float32)
shape=(2,)说明张量是一维数组,并且长度为2
d = tf.constant([[1.0,2.0],[3.0,4.0]])
print(d)
Tensor("Const_7:0", shape=(2, 2), dtype=float32)
shape=(2, 2)说明是二维矩阵,并且行数和列数都为2
d = tf.constant([[[1.0,2.0],[3.0,4.0]],[[5.0,6.0],[7.0,8.0]]])
print(d)
Tensor("Const_9:0", shape=(2, 2, 2), dtype=float32)
shape=(2, 2, 2)说明是三维向量,第一个2可以当做是块数,第二个2是行数,第三个2是列数,也就是有两块两行两列的矩阵
张量的属性
属性名称 | 功能说明 |
---|---|
dtype | 张量的数据类型 |
name | 张量在数据流图中的名称 |
graph | 张量所属的数据流图 |
op | 生成该张量的前置操作 |
shape | 张量传输数据的形状 |
value_index | 张量在前置操作所有输出值的索引 |
4.计算张量
a = tf.constant(1.0)
b = tf.constant(2.0)
c = tf.add(a,b)
with tf.Session() as sess:
print(c.eval())
print(sess.run([a,b,c]))
print(c.get_shape())
3.0
[1.0, 2.0, 3.0]
()
张量的成员方法
方法名 | 功能说明 |
---|---|
eval | 取出张量的值 |
get_shape | 获取张量的形状 |
set_shape | 修改张量的形状 |
consumers | 获取张量的后置操作 |
a = tf.constant([1,1])
b = tf.constant([2,3])
c = tf.add(a,b)
with tf.Session() as sess:
print(a[0].eval(),a[1].eval())
print(c.name)
print(c.eval())
print(c.shape)
print(a.consumers())
print(c.op)
1 1
Add_1:0
[3 4]
(2,)
[<tf.Operation 'Add_1' type=Add>, <tf.Operation 'strided_slice' type=StridedSlice>, <tf.Operation 'strided_slice_1' type=StridedSlice>]
name: "Add_1"
op: "Add"
input: "Const_12"
input: "Const_13"
attr {
key: "T"
value {
type: DT_INT32
}
}
张量的操作
操作类型 | 典型操作 |
---|---|
一元代数操作 | abs,neg,invert |
二元代数操作 | add,multiply,sub |
形状操作 | chip,reshape,slice,shuffle |
归约操作 | reduce_mean,reduce_sum |
神经网络操作 | conv,pool,softmax,relu |
条件操作 | cond |
5.稀疏张量 SparseTensor
创建
sp = tf.SparseTensor(indices=[[0,2],[1,3]],values=[1,2],dense_shape=[3,4])
'''
稀疏张量sp的键值对如下:
[0,2]:1
[1,3]:2
形状等价于:
[[0,0,1,0]
[0,0,0,2]
[0,0,0,0]
]
'''
with tf.Session() as sess:
print(sp.eval())
SparseTensorValue(indices=array([[0, 2],
[1, 3]]), values=array([1, 2], dtype=int32), dense_shape=array([3, 4]))
稀疏张量的操作
操作类型 | 典型操作 |
---|---|
转换操作 | sparse_to_dense,sparse_to_indicator,sparse_merge |
代数操作 | sparse_add,sparse_softmax,sparse_tensor_dense_matmul,sparse_maxium |
几何操作 | sparse_concat,sparse_reorder,sparse_split,sparse_transpose |
归约操作 | sparse_reduce_sum,sparse_reduce_sum_sparse |
x = tf.SparseTensor(indices=[[0,0],[0,2],[0,1]],values=[1,1,1],dense_shape=[2,3])
reduce_x = [tf.sparse_reduce_sum(x),
tf.sparse_reduce_sum(x,axis=1),
tf.sparse_reduce_sum(x,axis=1,keep_dims=True),
tf.sparse_reduce_sum(x,axis=[0,1])
]
with tf.Session() as sess:
print(sess.run(reduce_x))
[3, array([3, 0], dtype=int32), array([[3],
[0]], dtype=int32), 3]
张量的基础部分差不多就这些了。