一、计算图模型
Tensorflow是一种计算图的模型,即用图的形式来计算过程的一种模型
程序分为图的构建(图的定义)和图的执行(图的运算)两个部分
每次运算的结果以及原始的输数据都可以称为一个节点(operation,op)
在操作的过程中传输的数据都可以看作是Tensor——张量(维度)
这样做可以节约系统开销,提高资源利用率;方便提取中间的某个节点的结果,方便运算
1、图的构建
import tensorflow as tf
#道路tensorflow模块命名为tf
a = tf.constant([1,2])
b = tf.constant([3,4])
#定义两个常量op
result = tf.add(a,b)
#矩阵加法运算
print(result)
#输出
Tensor("Add:0", shape=(2,), dtype=int32)
构建图的运算的过程输出是一个Tensor
主要由三个属性构成:name、shape、dtype
name:张量的名字,张量的唯一标识符,后面的值表示该张量来自于第几个输出结果(从0开始)
shape:表示张量的维度
dtype:表示张量的数据类型
需要保证参与运算的的张量数据类型需要相同
2、图的执行
sess = tf.Session()
#启动默认图模型
print(sess.run(result))
#调用run()方法运行模型,再传入参数result,执行矩阵加法运算
#打印输出结果
sess.close()
#任务完成记得调用close()方法,关闭会话
#输出
[4 6]
- 建议大家写成下面这种写法
- with代码块的形式就无需 调用close释放资源,而是自动关闭会话
-
with tf.Session() as sess: res = sess.run(result) print(res) #输出 [4 6]
- 也可以利用CPU或GPU等计算资源分布式执行图的运算,当不指定的时候,tensorflow可以自动识别
- 如果检测到我们的gpu环境,会优先利用gpu环境执行我们的程序
- 但是要是计算机里面有多个gpu,这需要我们手动指派gpu去执行特定的op
- 使用with...device语句来指定
with tf.Session() as sess:
with tf.device('/gpu:2'):
#这个表示选择第二个gpu来执行特定的op
a = tf.constant([1,2])
b = tf.constant([3,4])
result = tf.add(a,b)
res = sess.run(result)
- 好的我的电脑只有一个一个一个gpu,这个魔法对我无效
二、常量的定义
1、constant()
- tensorflow中对常量的初始化,不管是数值、向量还是对矩阵的初始化都是动用constant()函数实现的
- 用于构建图模型中常量的定义
-
import tensorflow as tf a = tf.constant([[1.0,2.0,3.3],[1.3,5.0,4.0]], name='op1', shape=(2,3), dtype='float32', verify_shape='true') print(a)
-
constant一共有5个参数:value、name、dtype、shape、verify_shape
value:(必选)可以是数字,一维或多维向量矩阵
name:常量的名字,用于区分其他常量
dtype:数据类型
shape:常量的维度,我们可以自定义
verify_shape:验证shape是否正确,默认处于false状态
2、常见常量的初始化
例如:tf.zeros()\tf.ones()\tf.fill()\tf.linspace()\tf.range() ......
生成随机的张量:tf.random_normal()\tf.random_uniformal()\tf.truncated_normal() ......
zeros()a = tf.zeros([2,2]) print(a) with tf.Session() as sess: print(sess.run(a)) #输出 Tensor("zeros:0", shape=(2, 2), dtype=float32) [[0. 0.] [0. 0.]]
-
ones()
-
a = tf.ones([2,2]) print(a) with tf.Session() as sess: print(sess.run(a)) #输出 Tensor("ones:0", shape=(2, 2), dtype=float32) [[1. 1.] [1. 1.]]
-
zeros_like() 和 ones_like()
- 会输出与输入张量相同大小的全零/全一张量,用于做mask时候十分有用
a = tf.constant([[1,2,3],[4,5,6]]) b = tf.zeros_like(a) c = tf.ones_like(a) print(b) print(c) with tf.Session() as sess: print(sess.run(b)) print(sess.run(c)) #输出 Tensor("zeros_like:0", shape=(2, 3), dtype=int32) Tensor("ones_like:0", shape=(2, 3), dtype=int32) [[0 0 0] [0 0 0]] [[1 1 1] [1 1 1]]
-
random_normal()
-
a = tf.random_normal(shape=[2,3], mean=-1, stddev=4, dtype=tf.float32, seed=None, name='rand_num') with tf.Session() as sess: print(sess.run(a)) #输出 [[ -0.7358203 -4.64795 -5.9902425] [ -2.810855 -11.305333 -7.15732 ]]
- shape:张量的形状(可以不用写shape=)
- mean:正态分布的均值
- stddev:正态分布的标准值
- dtype:数据类型
- seed:分发创建的一个随机种子
- name:张量的名字
-
a = tf.fill([2,3],8) with tf.Session() as sess: print(sess.run(a)) #输出 [[8 8 8] [8 8 8]]
-
range()
-
a = tf.range(start=1,limit=8,delta=2) with tf.Session() as sess: print(sess.run(a)) #输出 [1 3 5 7]
三、变量的定义
变量的作用是保存和更新参数
执行图模型时候,一定要对变量进行初始化,不然变量无法使用
变量的使用包括创建、初始化、保存、加载等操作
variable()
1.创建变量
variable()可以理解为构造函数,构造函数需要的初始值可以是任意的张量
可以是数字变量、一维向量、二维矩阵,也可以是常量
import tensorflow as tf
a = tf.Variable(3,name='number')
b = tf.Variable([1,3],name='vector')
c = tf.Variable(tf.zeros([2,3]),name='numberzero')
-
2.初始化变量
- 三种方式初始化变量
- 初始化全部变量 global_variables_initializer():不管全局有多少个变量,全部初始化(最简单的一种方式)
-
init = tf.global_variables_initializer() with tf.Session() as sess: sess.run(init)
- 初始化变量的子集 variables_initializer():比上一个要节约一点内存;var_list:要初始化的 Variable 对象列表.
-
init_subset = tf.variables_initializer([a,b],name='init_subset') with tf.Session() as sess: sess.run(init_subset)
- 初始化单个变量 variable():初始化单个变量,函数的参数便是初始化的变量内容了
-
3.保存变量
- 在训练模型之后,希望保存训练结果,方便日后查看
- 通过tf.train.Saver()方法,创建一个server管理器,来保存计算图模型中的所有变量
-
import tensorflow as tf var1 = tf.Variable([1,3],name='v1') var2 = tf.Variable([2,4],name='v2') #构建变量 init = tf.global_variables_initializer() #初始化所有变量 saver = tf.train.Saver() #调用saver()存储器方法 with tf.Session() as sess: sess.run(init) saver_path = saver.save(sess,'test/first_data.ckpt') #设置存储路径,这个test/指的是在py的目录里面自动建一个test文件,然后把存储文件放在里面
- 存储文件first_data.ckpt是一个二进制文件,server管理器提供了向该二进制文件保存变量和回复变量的方法
- 保存的内容是从变量名到tensor值得映射关系
-
4.加载数据
- 一定要用和保存变量相同的server对象来恢复变量
- 其次,不需要事先对变量进行初始化,通过restore()方法来获取,分别是session和获取变量文件的位置
-
import tensorflow as tf var1 = tf.Variable([0,0],name='v1') var2 = tf.Variable([0,0],name='v2') #构建原始变量 init = tf.global_variables_initializer() saver = tf.train.Saver() module_file = tf.train.latest_checkpoint('test/') #保存到该文件夹下面的最新的一保存的模型 with tf.Session() as sess: saver.restore(sess,module_file) #通过retore()方法来获取 print('model restore') print(sess.run(var1)) print(sess.run(var1)) #输出 model restore [1 3] [2 4]
-
四、placeholder
- 一个数据初始化的容器
- 它与变量最大的不同是placeholder定义的是一个模版
- 这样我们就可以session运行阶段,利用feed_dict的字典结构给placeholder填充具体的内容,而无需每次都提前定义好变量的值
- 提高代码的利用率
-
import tensorflow as tf a = tf.placeholder(tf.float32,shape=(2,2),name=None) b = tf.constant([[6,4],[2,3]],tf.float32) c = tf.add(a,b) with tf.Session() as sess: res = sess.run(c,feed_dict={a:[[10,10],[10,10]]}) print(res) #输出 [[16. 14.] [12. 13.]]
- 三个参数:dtype、shape、name
dtype:(必填)表示传入value的数据类型
shape:value的维度
name:传入value的名字
不可以直接拿来用,而是需要用户传递常数值
五、重要概念-Fetch
英文:取回,拿回
指可以在一个会话中可以运行同时多个op
方便我们在实际建模过程中,输出一些中间的op,取回多个tensor
import tensorflow as tf a = tf.constant(2) b = tf.constant(3) c = tf.constant(6) add = tf.add(b,c) mul = tf.multiply(a,add) with tf.Session() as sess: result = sess.run([add,mul]) print(result) #输出 [9, 18]
评论(0)
您还未登录,请登录后发表或查看评论