程序 = 数据结构 + 算法。
TensorFlow程序 = 张量数据结构 + 计算图算法语言
- 张量:即Tensorflow的基本数据结构,张量(Tensor)即多维数组
- 计算图:TensorFlow的所有计算都会被转化为计算图上的节点
前面已经介绍过,张量即多维数组。
标量为0维张量,向量为1维张量,矩阵为2维张量。彩色图像有rgb三个通道,可以表示为3维张量。视频还有时间维,可以表示为4维张量。
可以简单地总结为:有几层中括号,就是多少维的张量。
scalar = tf.constant(True)
vector = tf.constant([1.0, 2.0, 3.0, 4.0])
matrix = tf.constant([[1.0, 2.0], [3.0, 4.0]])
tensor3 = tf.constant([[[1.0, 2.0], [3.0, 4.0], [5.0, 6.0], [7.0, 8.0]]])
tf.rank() 用来返回张量的秩。需要注意的是,张量的秩与矩阵的秩不一样。张量的秩是唯一选择张量的每个元素所需的索引的数量。秩也被称为 “order”,“degree” 或 “ndims”。这里张量的秩,可以直接理解维度,就是说这个张量是几维的,它不是矩阵的秩也不是数组的shape,简单的理解,可以它就是中括号的层数。
with tf.Session() as sess:
print(sess.run(tf.rank(scalar)))
print(sess.run(tf.rank(vector)))
print(sess.run(tf.rank(matrix)))
print(sess.run(tf.rank(tensor3)))
输出
0
1
2
3
从行为特性来看,有两种类型的张量,常量constant和变量Variable
1 常量张量
常量张量:计算图中不可以被重新赋值
import tensorflow as tf
i = tf.constant(1)
l = tf.constant(1, dtype=tf.int64)
f = tf.constant(1.23)
d = tf.constant(3.14, dtype=tf.double)
s = tf.constant("hello world")
b = tf.constant(True)
可以用tf.cast() 改变张量的数据类型。
h = tf.constant([123, 456], dtype=tf.int32)
f = tf.cast(h, tf.float32)
print(h.dtype)
print(f.dtype)
<dtype: 'int32'>
<dtype: 'float32'>
进行类型转换时,需要保证转换操作的合法性,例如将高精度的张量转换为低精度的张量时,可能发生数据溢出隐患:
num = tf.constant(123456789, dtype=tf.int32)
tf.cast(num, tf.int16))
!!!!!这个地方我可能写得不对,不确定c = c + …能不能这么写
c = tf.constant([1.0,2.0])
with tf.Session() as sess:
print(sess.run(c))
print(id(c))
c = c + tf.constant([1.0, 1.0])
print(sess.run(c))
print(id(c))
输出
[1. 2.]
140336520958752
[2. 3.]
140336520960880
2 变量张量
变量张量:计算图中可以用assign等算子重新赋值。
模型中需要被训练的参数一般被设置成变量。
Variable类型对象不能直接输出,因为当前对象只是一个定义。这里还需要解释一下。
v = tf.Variable([1.0,2.0],name = "v")
v.assign_add([1.0,1.0])
|