python人脸识别项目之基础学习(二):TensorFlow的简单操作
你将要学习的内容
- 你将要了解什么是张量
- 数据流图是什么
- 如何创建一个简单的TensorFlow代码
- 如何创建一个常量
- 如何创建一个变量
- 如何创建一个占位符
- tensorflow 会话如何创建?
- 如何通过看数据流图,写一个TensorFlow代码
1. 基础知识的学习
1.1.TensorFlow概述
TensorFlow是一个采用数据流图,用于数值计算的开源软件库
-
节点(Nodes):在图中表示数学操作
-
线(edges):表示在节点间相互联系的多维数据
数组,即张量(tensor)
TensorFlow的特征
- 高度的灵活性
- 真正的可移植性(Portability)
- 将科研和产品联系在一起
- 自动求微分
- 多语言支持
- 性能最优化
1.2.1 TensorFlow张量
张量(tensor)是多维数组,目的是把向量、矩阵推向更高的维度
你就把他理解为一个数组
一维数组,二维数组…
张量的阶
TensorFlow用张量表示所有的数据
张量的维数称为阶,注:张量的阶和矩阵的阶不是同一个概念。
例如:
这是一个二阶的张量(面),矩阵不就是一个面吗?
1.2.2 数据流图 Data flow graph
TensorFlow 的名字本身描述了它自身的执行原理: Tensor (张量)意味着N维数组,Flow (流)意味着基于数据流图的计算
数据流图中的图就是我们所说的有向图,在图这种数据结构中包含两种基本元素:节点和边。
节点:对数据所做的运算或某种算子(Operation)。任何一种运算都有输人/输出,因此它也可以表示数据输人的起点或输出的终点
边:表示节点与节点之间的输人和输出关系,一种特殊类型的数据沿着这些边传递。这种特殊类型的数据在TensorFlow中被称为Tensor,即张量,所谓的张量通俗点说就是多维数组。
当我们输入张量的时候,节点代表的操作就会分配到计算设备完成计算
2.1.2一个简单的tensorflow 程序
import tensorflow as tf
# constant是TensorFlow的常量节点
message = tf.constant("hello")
# 方式一:
with tf.Session() as sess:
ms = sess.run(message).decode()
print(ms)
pass
执行结果
如果不想看到收到的消息可以通过这段代码屏蔽掉他
import os
os.environ['TF_CPP_MIN_LOG_LEVEL']='2'
就会这样子
2.2 程序结构的介绍
这是一个计算图。假设两个向量v_1和v_2,作为输出提供的add操作
在例子中,计算图由三个节点组成, v_1 和 v_2 表示这两个向量,Add 是要对它们执行的操作。
- 首先需要使用 tf.Session() 定义一个会话对象 sess。然后使用 Session 类中定义的 run 方法运行它
run(fetches,feed_dict=None,options=None,run_metadata)
- 运算结果的值在 fetches 中提取,提取的张量为 v3
- run 方法将导致在每次执行该计算图的时候,都将对与 v_3相关的张量和操作进行赋值
- 如果抽取的不是 v_3 而是 v_1,那么最后给出的是向量 v_1 的运行结果,v_1 的运行结果
{1,2,3,4}
- 此外,一次可以提取一个或多个张量或操作对象
{array([1,2,3,4]),array([2,1,5,3]),array([3,3,8,7])}
- 在同一段代码中,可以有多个会话对象
import tensorflow as tf
import os
os.environ['TF_CPP_MIN_LOG_LEVEL']='2'
def rask():
v_1 = tf.constant([1,2,3,4])
v_2 = tf.constant([1,2,3,4])
v_3 = tf.add(v_1, v_2)
# 还可以使用 v_3 = v_1 + v_2
# 方式二:
sess = tf.Session()
print(sess.run(v_3))
sess.close()
pass
if __name__ == "__main__":
rask()
执行结果
2.3 TensorFlow常量、变量和占位符
- TensorFlow 支持以下三种类型的张量:
- 常量:值不能够改变的张量
- 变量:当一个量在会话中的值需要改变时,使用变量来表示
- 占位符:用于将值输入 TensorFlow 图中。它们可以和 feed_dict 一起使用来输入数据。在会话中运行计算图时,可以为占位符赋值。这样在构建一个计算图时不需要真正地输入数据。需要注意的是,占位符不包含任何数据,因此不需要初始化它们。
常量
# 声明一个标量常量:
t_1 = tf.constant(10)
# 一个形如 [1,3] 的常量向量可以用如下代码声明:
t_2 = tf.constant([4,3,2])
# 要创建一个所有元素为零的张量,可以使用 tf.zeros() 函数。
# 这个语句可以创建一个形如 [M,N] 的零元素矩阵
# 数据类型(dtype)可以是 int32、float32 等:
t_3 = tf.zeros([M,N],tf.dtype)
# 创建一个与0矩阵具有相同形状的张量常量
tf.zeros_like(t_3)
# 创建一个与单位矩阵具有相同形状的张量常量
tf.ones_like(t_3)
# 在一定范围内生成一个从初值到终值等差排布的序列:
tf.linspace(start,stop,num)
# 相应的值为 (stop-start)/(num-1)
# 从开始(默认值=0)生成一个数字序列,增量为 delta(默认值=1),直到终值(但不包括终值):
tf.range(start,limit,delta)
tf.zeros([3,2],tf.int32)
的执行结果
tf.linspace(2.0, 10.0 , 5)
的执行结果
tf.range(1, 10, 3)
的执行结果
变量
Vatiable是tensorflow的变量节点,通过Variable(注:V大写)方法创建,并且需要传递初始值。在使用前需要通过tensorflow的初始化方法进行初始化。通过变量 (Variable) 维护状态。
常用的参数:initial_value,dtype,name,创建代码类似下面这样
W = tf.Variable(tf.zeros([3, 10]), dtype=tf.float64, name='W')
# 注意:变量通常在神经网络中表示权重和偏置。
# 创建了两个不同的张量变量 t_a 和 t_b。两者将被初始化为形状为 [50,50] 的随机均匀分布,最小值=0,最大值=10:
rand_t = tf.random_uniform([50, 50], 0, 10, seed = 0)
t_a = tf.Variable(rand_t)
t_b = tf.Variable(rand_t)
# 定义了两个变量的权重和偏置。权重变量使用正态分布随机初始化,均值为 0,标准差为 2,权重大小为 100×100。偏置由 100 个元素组成,每个元素初始化为 0。在这里也使用了可选参数名以给计算图中定义的变量命名:
weights = tf.Variable(tf.random_normal([100,100], stddev = 2))
bias = tf.Varible(tf.zeros[100], name = "biases")
占位符
placeholder是TensorFlow的占位符节点,由placeholder方法创建,其也是一种常量,但是由用户在调用run方法是传递的,也可以将placeholder理解为一种形参。即其不像constant那样直接可以使用,需要用户传递常数值。
tf.placeholder(dtype,shape=None,name=None)
dtype:数据类型
shape:数据形状
name:常量名
tf.placeholder(dtype,shape=None,name=None)
# dtype 定占位符的数据类型,并且必须在声明占位符时指定。在这里,为 x 定义一个占位符并计算 y=2*x,使用 feed_dict 输入一个随机的 4×5 矩阵:
x = tf.placeholder("float")
y = 2*x
data = tf.random_uniform([4,5], 10)
sess = tf.Session()
x_data = sess.run(data)
# feed "喂"的意思 dict字典的意思,通过字典的方式给占位符喂数据
print(sess.run(y, feed_dict = {x: x_data}))
sess.close()
2.4 数据类型
2.5 TensorFlow会话
import tensorflow as tf
# 创建一个会话
sess = tf.Session()
# 使用这个创建好的会话来得到关心的运算的结果
# 如 sess.run(result)
# 得到张量result的取值
sess.run(...)
# 关闭会话得到本次运行使用的资源可以释放
会话中张量的取值
import tensorflow as tf
a = tf.constant([1.0], name = "a")
b = tf.constant([2.0], name = "b")
result = a + b
sess = tf.Session()
print(sess.run(result))
print(result.eval(session = sess))
2.6 简单的操作