TensorFlow基本概念

xiaoxiao2023-03-22  29

一、数据流图

1、节点

通常以圆圈、椭圆和方框表示,代表对数据所做的某种运算或操作

2、边

对应于向Operation传入和从Operation传出的实际值,通常以箭头表示

3、TensorFlow中的数据流图

在TensorFlow上运行不同的模型,都有相同的两个步骤: (1)定义数据流图 例如:下面这个数据流图,用TensorFlow表示:

import tensorflow as tf a = tf.constant(5, name = 'input_a') b = tf.constant(3, name = 'input_b') c = tf.mul(a, b) d = tf.add(a, b) e = tf.add(b, c)

(2)运行数据流图 使用会话(Session)执行定义好的数据流图

sess = tf.Session() sess.run(e)

二、TensorFlow基本数据结构

1、张量思维

(1)基本概念

张量(tensor):n维矩阵的抽象。 1阶张量:向量 2阶张量:矩阵 对于更高维数的张量,可以称为“N维张量”或者“N阶张量”

上述例子中,节点输入是标量,以后为了方便使用,改换为张量,这样可以简化流图: 简化后,数据流图的定义变为:

import tensorflow as tf a = tf.constant([5, 3], name = "input_a") b = tf.reduce_prod(a, name = "prod_b") c = tf.reduce_sum(a, name = "sum_c") d = tf.add(b, c,name = "add_d")

一般来说可以不加区分地使用“张量“或者”Tensor对象“

(2)张量形状

张量对象的属性:shape 形状:描述张量的维数以及每一维的长度

例如:列表[2, 3]描述了一个2阶张量,其第1个维度上的长度是2.第2个维度上的长度为3

2、TensorFlow的Operation(节点,简称Op)

TensorFlow总的来说只有两大类数据:节点和张量 Op是对一些tensor对象执行运算的节点,计算完毕,返回0个或者多个张量

Op的功能不仅限于数据运算,有的Op既没有输入也没有输出,这是用来执行初始化任务的

3、Graph对象

Graph:数据流图 TensorFlow库被加载之后,会自动创建一个Graph对象,并将其作为默认的数据流图,获取默认数据流图的方法:

default_graph = tf.get_default_graph()
(1)创建新的数据流图
import tensorflow as tf g1 = tf.Graph() # 创建一个新的数据流图 g2 = tf.Graph() with g1.as_default(): # 定义g1的Op、张量等 .............. with g2.as_default(): # 定义g2的Op、张量等 ..............

不在Graph.as_default()内定义的节点、张量会被添加到默认的数据流图

(2)数据流图的导入

4、Session对象

(1)Session对象的参数

Session类负责数据流图的执行,有3个可选参数

-target:指定了所要使用的引擎,对大部分应用而言,该参数取默认值,即空字符串。

-graph:该参数指定了将要在Session中加载的Graph对象(数据流图),默认值为None,表示使用当前默认数据流图

import tensorflow as tf a = tf.add(2, 3) b = tf.mul(3, 5) sess = tf.Session() # 这句话等价于:sess = tf.Session(default_graph = tf.get_default_graph())

-config:允许用户指定配置Session对象,比如:限制CPU或GPU的使用数量

(2)Session对象的run方法

run方法,接受一个fetches参数,和三个可选参数:feed_dict、options、run_metadata

feches参数:接收任意的数据流图元素(Op或者Tensor对象) Tensor:输出该Tensor对象 Op:输出None # 初始化Varible对象,返回值:None sess.run(tf.initialize_all_variables())

-feed_dict参数:用于覆盖数据流图中的Tensor对象值

import tensorflow as tf a = tf.add(2, 3) b = tf.mul(a, 5) sess = tf.Session() # 定义一个字典:将节点a的输出替换为了15 replace_dict = {a:15} # 执行数据流图 sess.run(b, feed_dict = repalce_dict) # 返回值:75
(3)Session对象的close方法

创建Session对象,在使用之后需要关闭,调用close方法关闭或者写成with结构

(4)占位输入

可以看到在之前的代码里,输入都是采用固定输入的方式,总是使用相同的值作为输入,这里将会说明如何从客户端处接收输入 tf.placeholder: 创建占位符,类似于C语言里面的%d、%c… 这里,dtype参数是必选的,确定输入数据类型,shape是可选参数,确定张量形状,如果没有填写,默认是None,此时可以接收任意形状的张量

import tensorflow as tf import numpy as np a = tf.placeholder(tf.int32, shape = [2], name = "my_input") b = tf.reduce_prod(a, name = "prod_b") c = tf.reducee_sum(a, name = "sum_c") d = tf.add(c, b) input_dict = {a:np.array([5, 4], dtype = tf.int32)} with tf.Session as sess: sess.run(d, feed_dict = input_dict)

5、Varible对象

Tensor对象和Op对象都是不可改变的,因此引入了变量(Varible)对象

(1)Variable对象的创建
''' 创建函数: tf.Varible() ''' import tensorflow as tf # 创建标量变量 my_var1 = tf.Varible(3, name = "my_varible1") # 创建全1向量变量 my_var2 = tf.Varible(ones([6]), name = "my_varible2") # 创建三阶张量Variable对象,服从正态分布(均值:0, 标准差:2) var_normal1 = tf.Varible(tf.random_normal([3, 3, 3], mean=0.0, stddev = 2.0), name = "my_var_normal1") # tf.truncated_normal():创建正态分布随机值,但是所创建的值,不会偏离超过2倍的标准差值。下面的例子中,张量里元素的值的取值范围:[3, 7] var_normal2 = tf.Varible(tf.random_normal([3, 3, 3], mean=5.0, stddev = 1.0), name = "my_var_normal2") # 正态分布函数的默认参数:均值:0.0, 标准差:1.0
(2)Variable对象的初始化

Variable对象与其他的Tensorflow对象在Graph中存在的方式相似,它们的实际状态都是由Session对象管理,因此,为了能使Session对象追踪Variable对象的值的变化,需要对其进行初始化:

''' 初始化函数: tf.initialize_all_variables tf.initialize_variables ''' import tensorflow as tf init = tf.initialize_all_variables() with tf.Session() as sess: sess.run(init)

上述操作是对Session对象的Graph的所有Variable进行初始化,若要初始化一部分,则:

import tensorflow as tf var1 = tf.Variable(tf.truncated_normal([2, 3], mean = 1, stddev = 3), name = "var1") var2 = tf.Variable(tf.random_normal([3, 4], mean = 0, stddev = 2), name = "var2") init = tf.initialize_variables([var1, var2], name = "init_var") with tf.Session() as sess: sess.run(init)
(3)Variable对象的修改

使用Variable.assign()方法,修改Variable对象的值 注意Variable.assign()是一个Op,必须通过Session.run()执行,所做修改才能生效

import tensorflow as tf var1 = tf.Variable(1, name = "var1") var1_times_two = var1.assign(var1 * 2) init = tf.initialize_variables([var1], name = "init_var") with tf.Session() as sess: sess.run(init) sess.run(var1_times_two) # 输出为:2 sess.run(var1_times_two) # 输出为:4 sess.run(var1_times_two) # 输出为:8 sess.run(var1.assign_sub(1)) # 输出为:7 sess.run(var1.assign_add(10)) # 输出为:17

此外,同一个Variable对象在不同的Session对象里面的值可能是不一样的,它们之间相互独立

import tensorflow as tf var1 = tf.Variable(0, name = "var1") init = tf.initialize_all_variables() sess1 = tf.Session() sess2 = tf.Session() sess1.run(init) sess.run(var1.assign_sub(5)) # 输出:-5 sess2.run(init) sess2.run(var1.assign_add(10)) # 输出:10 # 重置为初始值: sess1.run(init) sess2.run(init)
(4)trainable参数

在使用自动训练机器学习模型的Optimizer类时,这些类会自动的修改Variable对象的值 当trainable == False,不允许Optimizer类自动修改Variable对象的值,只能手动更改

6、名称作用域

类似于封装的效果,将一部分节点隐藏起来,用一个名称显示这部分的功能 例如:

import tensorflow as tf with tf.name_scope("Scope_A"): a = tf.add(1, 2, name = "A_add") b = tf.mul(a, 3, name = "A_mul") with tf.name_scope("Scope_B"): c = tf.add(4, 2, name = "B_add") d = tf.mul(c, 7, name = "B_mul") e = tf.add(b, d, name = "output")

数据流图: 展开:

转载请注明原文地址: https://www.6miu.com/read-4987505.html

最新回复(0)