python-tensorflow基础

本文详细介绍了TensorFlow中的变量构建、更新、作用域管理,以及模型的保存和加载方法。通过实例展示了如何使用tf.assign进行变量更新,控制依赖简化操作,以及在不同设备上执行操作。此外,还探讨了变量作用域的使用,包括变量的复用和共享,以及通过tf.get_variable进行管理。最后,讲解了如何使用Saver保存和恢复模型,包括完全加载、直接加载图以及建立映射关系加载模型的方法。
摘要由CSDN通过智能技术生成
import numpy as np
import matplotlib.pyplot as plt
import tensorflow as tf

'''
1、怎么构建图,并设置为默认图
2、变量的name
3、默认情况下,创建的Session使用的是默认的graph    ,会话关闭后不能再使用
4、fetch
5、session和eval底层一致
6、交互式会话(基本不用)
7、张量:Tensor,就是数据(阶,常量,变量(变量初始化))
    全局变量初始化,也可以单个变量的初始化(初始化也是一个操作,需要在会话中run)
    name的意义:tensorflow中是通过name来查找变量
8、变量的更新
    tf.assign(ref=x,value=x+1)  更新的变量,更新的操作
    validate_shape=False参数,不检查形状
    tf.control_dependencies() 控制依赖
案例1:实现变量的累加,每次加1
案例2:实现变量的累加,每次加的数来自placeholder
9、执行设备
    一般情况下,如果安装的GPU版本,tensorflow会自动的在CPU GPU上执行
    tensorflow认为只有一个cpu,不管多少核
    tf.device('/gpu:0')
10、作用域
    python 以函数内外分为局部作用域和全局作用域
    tensorflow中作用域
    1)便于管理变量(可以使用tf.Variable()来创建变量,肯定正确,但是创建的变量名不好管理;使用tf.get_variable())
    期望重复使用某些变量
    2)便于构建共享变量(reuse=tf.AUTO_REUSE的功劳,如果变量存在,那就重用这个变量。不会像tf.Variable一样又重新建了变量)
    3)作用域支持嵌套
    4)name_score是为了可视化设计的,它限制了节点的作用域,对变量无效
11、tensorflow的可视化
12、tensorflow的线程和队列
    这个在具体的CNN案例中会提到,主要是利用多线程将训练和数据读取分开,提高训练的效率
13、tensorflow的数据读取
    三种方式
    1)feed(小数据)
    2) 明确给数据(小数据集)
    3)从文件中多线程和队列读取(大样本)
14、模型的保存和存储
    Tensorflow不管用来做深度学习还是机器学习,保存和加载模型的方式都是一样的
    saver   保存模型  saver = tf.train.Saver()  saver.save(sess,'./model/model.ckpt')
        checkpoint:不用管,就是描述信息
        index:数据的索引
        meta:源数据信息,图信息
        data:具体的数据
    restore 加载模型
        1)完全提取,完全恢复保存前的数据格式(和保存前的现场一样,变量名称值等必须都一样)saver.restore(sess,'./model/model.ckpt')
        注意:和从新定义一个模型不一样,加载模型不需要初始化所有的变量;另外,加载模型即使自己的声明了变量并给了初始值,加载
              出来的值也会赋予模型中的值。
        2)直接加载图,不定义变量
        注意:
        优点:不需要重新写代码构建图 缺点:需要通过变量或操作名获得张量的值 tf.get_default_graph().get_tensor_by_name()
        3) 完全提取,加载的时候同时建立映射关系
15、分布式训练
    
        
'''

'''变量的更新'''
def variable_update():
    #案例2:实现变量的累加,每次加的数来自placeholder
    #方法:更新操作tf.assign
    # a = tf.Variable(0,dtype=tf.float32,name = "v_a")
    # h_a = tf.placeholder(shape=[],dtype=tf.float32,name='v_h_a')
    # assign_op = tf.assign(ref=a,value=a+h_a)
    #
    # with tf.Session(config=tf.ConfigProto(log_device_placement=True,allow_soft_placement=True)) as sess:
    #     tf.global_variables_initializer().run()
    #     for i in range(5):
    #         sess.run(assign_op,feed_dict={h_a:i})
    #     print(a.eval())

    #tf.assign是很重要的更新操作,控制依赖会简化操作,期望使用控制依赖
    #优化:控制依赖
    with tf.device("/gpu:0"):
        a = tf.Variable(0,dtype=tf.float32,name = "v_a")
        h_a = tf.placeholder(shape=[],dtype=tf.float32,name='v_h_a')
        assign_op = tf.assign(ref=a,value=a+h_a)

        #每次执行op_a操作之前,都会先执行assign_op操作
        with tf.control_dependencies([assign_op]):
            op_a = a + tf.constant(0.0)  #此处必须形成一个操作

        with tf.Session(config=tf.ConfigProto(log_device_placement=True,allow_soft_placement=True)) as sess:
            tf.global_variables_initializer().run()
            for i in range(5):
                r = sess.run(op_a,feed_dict={h_a:i})
            print(r)
# variable_update()

'''变量的作用域'''
def variable_scope():
    def f(x):
        w = tf.get_variable('w',[],dtype=tf.float32,initializer=tf.random_normal_initializer(seed=0))
        b = tf.get_variable('b',[],dtype=tf.float32,initializer=tf.random_normal_initializer(seed=0))
        r = tf.add(tf.multiply(w,x),b,name='add_r')
        # r = w*x+b

        return r

    def f1(x):
        with tf.variable_scope('op1',reuse=tf.AUTO_REUSE):    #为什么加上reuse,因为默认是不允许重用的,重复建一个变量报错,如果是True,如果变量存在就新建(期望存在就重用)
            r1 = f(x)
        with tf.variable_scope('op2',reuse=tf.AUTO_REUSE):
            r2 = f(x)
        return r1,r2
    r1,r2 = f1(2)
    r3,r4 = f1(1)
    with tf.Session(config=tf.ConfigProto(log_device_placement=True,allow_soft_placement=True)) as sess:
        tf.global_variables_initializer().run()
        print(r1.eval())
        print(r2.eval())
        print(r3.eval())
        print(r4.eval())
# variable_scope()

'''模型保存'''
def model_saver_save():
    w = tf.Variable(3,dtype=tf.float32,name='w')
    b = tf.Variable(1,dtype=tf.float32,name='b')
    r = w*tf.constant(3.0)+b

    saver = tf.train.Saver()        #模型保存类库

    with tf.Session(config=tf.ConfigProto(log_device_placement=True,allow_soft_placement=True)) as sess:
        tf.global_variables_initializer().run()
        saver.save(sess,'./model/model.ckpt')   #保存模型
# model_saver_save()

'''模型加载,完全加载'''
def model_saver_restore():
    w = tf.Variable(3,dtype=tf.float32,name='w')
    b = tf.Variable(1,dtype=tf.float32,name='b')
    r = w*tf.constant(3.0)+b

    saver = tf.train.Saver()        #模型保存类库

    with tf.Session(config=tf.ConfigProto(log_device_placement=True,allow_soft_placement=True)) as sess:
        saver.restore(sess,'./model/model.ckpt')   #加载模型
        print(sess.run(r))
# model_saver_restore()

'''模型加载,直接加载图'''
def model_saver_restore_graph():
    #加载图
    saver = tf.train.import_meta_graph('./model/model.ckpt.meta')
    with tf.Session(config=tf.ConfigProto(log_device_placement=True, allow_soft_placement=True)) as sess:
        saver.restore(sess, './model/model.ckpt')  # 加载模型
        #问题在于r操作没了,那只能用名字去找
        print(sess.run(tf.get_default_graph().get_tensor_by_name('add:0')))
# model_saver_restore_graph()

'''模型加载,完全加载,加载的时候建立映射关系'''
def model_saver_restore_mapping():
    v1 = tf.Variable(3,dtype=tf.float32,name='v1')
    v2 = tf.Variable(1,dtype=tf.float32,name='v2')
    r = v1*tf.constant(3.0)+v2

    saver = tf.train.Saver({'w':v1,'b':v2})        #模型保存类库,建立映射关系
    with tf.Session(config=tf.ConfigProto(log_device_placement=True,allow_soft_placement=True)) as sess:
        saver.restore(sess,'./model/model.ckpt')   #加载模型
        print(sess.run(r))
# model_saver_restore_mapping()

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值