Fork me on github

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 简单的操作

在这里插入图片描述

在这里插入图片描述

posted @ 2022-01-23 11:59  不想努力的小龙  阅读(230)  评论(0编辑  收藏  举报