一、计算图模型


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]