Python神经网络3之TensorFlow

TensorFlow框架介绍

变量OP

TensorFlow变量是表示程序处理的共享持久状态的最佳方法,变量通过tf.Variable OP类进行操作
变量的特点:

  1. 存储持久化
  2. 可修改值
  3. 可指定被训练

变量可存储模型参数

创建变量

  • tf.Variable(initial_value=None,trainable=True,collections=None,name=None)
    initial_value:初始化的值
    trainable:是否被训练
    collections:新变量将添加到列出的图的集合中collections,默认为[GraphKeys.GLOBAL_VARIABLES],如果trainable是True变量也被添加都图形集合GraphKeys.TRAINABLE_VARIABLES
  • 变量需要显式初始化,才能运行值
def variable_demo01():
    #变量的演示
    a=tf.Variable(initial_value=50)
    b=tf.Variable(initial_value=60)
    c=a+b
    print("a:\n",a)
    print("b:\n",b)
    print("c:\n",c)

    #初始化变量
    init=tf.global_variables_initializer();

    with tf.Session() as sess:
        #运行初始化
        sess.run(init)
        a_value,b_value,c_value=sess.run([a,b,c])
        print("a_value:\n",a_value)
        print("b_value:\n",b_value)
        print("c_value:\n",c_value)

请添加图片描述

使用tf.variable_scope()修改变量的命名空间

优点:结构更加清晰

def variable_namespace():
    with tf.variable_scope("a_scope"):
        a=tf.Variable(initial_value=10)
    with tf.variable_scope("b_scope"):
        b=tf.Variable(initial_value=20)
    with tf.variable_scope("c_scope"):
        c=tf.add(a,b)
    print("a:\n",a)
    print("b:\n",b)
    print("c:\n",c)

    init=tf.global_variables_initializer()

    with tf.Session() as sess:
        sess.run(init)
        a_value,b_value,c_value=sess.run([a,b,c])
        print("a_value:\n",a_value)
        print("b_value:\n",b_value)
        print("c_value:\n",c_value)

请添加图片描述

高级API

基础API

  1. tf.app
    为TensorFlow进行的脚本提供一个main函数入口,可以定义脚本运行的flags
  2. tf.image
    TensorFlow的图像处理操作,主要是一些颜色变换,变形和图像的编码和解码
  3. tf.gfile
    提供了一组文件操作函数
  4. tf.summary
    用来生成TensorBoard可用的统计日志,生成了4种类型:audio,image,histogram,scalar
  5. tf.python_io
    用来读写TFRecords文件
  6. tf.train
    这个模块提供了一些训练器,与tf.nn组合起来,实现一些网络的优化计算
  7. tf.nn
    这个模块提供了一些构建神经网络的底层函数,TensorFlow构建网络的核心模块,其中包含了添加各种层的函数,比如添加卷积层,池化层等

高级API

  1. tf.keras
    keras本来是一个独立的深度学习库,tensorflow将其学习过来,增加这部分模块在于快速构建模型
  2. tf.layers
    高级API,以更高级的概念层来定义一个模型,类似tf.keras
  3. tf.contrib
    tf.contrib.layers提供将计算图中的网络层、正则化、摘要操作、是构建计算图的高级操作,但是tf.contrib包含不稳定和实验代码,有可能以后API会改变
  4. tf.estimator
    一个Estimator相当于Model+Training+Evaluate的合体,在模块中,已经实现了几种简单的分类器和回归器,包括:Baseline,Learning和DNN。这里的DNN的网络,只是全连接网络,没有提供卷积之类的

关于TensorFlow的API图示
请添加图片描述

案例:实现线性回归

线性回归原理复习

  1. 构建模型
    目标值和特征值关系:
    y=w1x1+w2x2+…+wnxn+b
  2. 构造损失函数
    均方误差
  3. 优化损失
    梯度下降

实现线性回归的训练

  • 假设随机指定100个点,只有一个特征
  • 数据本身的分布为y=0.8*x+0.7
API
  • 矩阵运算 tf.matmul(x,w)
  • 平方 tf.square(error)
  • 均值 tf.reduce_mean(error)

梯度下降优化

  • tf.train.GradientDescentOptimizer(learning_rate)
    梯度下降优化
    learning_rate:学习率,一般为0~1之间比较小的值
    method: minimize(loss)
    return:梯度下降op
  1. 准备真实数据
    100个样本
    x 特征值 (100,1)
    y_true 目标值 (100,1)
    y_true=0.8x+0.7
  2. 假定x和y之间的关系满足
    y=kx+b
    k≈0.8,b≈0.7
    流程分析:
    (100,1)*(1,1)=(100,1)
    y_predict=x*weights(1,1)+bias(1,1)
    (1) 构建模型
    y_predict=tf.matmul(x,weights)+bias
    (2)构造损失函数——均方误差
    error=tf.reduce_mean(tf.square(y_predict-y_true))
    (3)优化损失
    optimizer=tf.train.GradientDescentOptimizer(learning_rate=0.01).minimize(error)
def test_demo():
    """
    自定义线性回归模型
    :return:
    """
    #1.准备数据
    X=tf.random_normal(shape=[100,1])
    y_true=tf.matmul(X,[[0.8]])+0.7

    #2.构造模型
    # 定义模型参数用变量
    weights=tf.Variable(initial_value=tf.random_normal(shape=[1,1]))
    bias=tf.Variable(initial_value=tf.random_normal(shape=[1,1]))
    y_predict=tf.matmul(X,weights)+bias

    #3.构造损失函数
    error=tf.reduce_mean(tf.square(y_predict-y_true))

    #4.优化损失
    optimizer=tf.train.GradientDescentOptimizer(learning_rate=0.01).minimize(error)

    #5.初始化变量
    init=tf.global_variables_initializer()

    #6.开启会话
    with tf.Session() as sess:
        #初始化变量
        sess.run(init)
        #查看初始化模型参数后的值
        print("训练前模型的参数为:权重%f,偏置%f,损失为%f"%(weights.eval(),bias.eval(),error.eval()))
        #开始训练
        for i in range(1000):
            sess.run(optimizer)
            print("第%d次训练后模型的参数为:权重%f,偏置%f,损失为%f"%(i+1,weights.eval(),bias.eval(),error.eval()))
    return None;

请添加图片描述
请添加图片描述
请添加图片描述
在迭代次数一定的情况下,学习率越高,训练速度越快;
学习率一定的情况下,迭代次数越多,训练速度越快。

学习率的设置,步数的设置与梯度爆炸

学习率过大会出新梯度爆炸现象,如何解决梯度爆炸问题:

  1. 重新设计网路
  2. 调整学习率
  3. 使用梯度截断(在训练过程中检查和限制梯度的大小)
  4. 使用激活函数

变量的trainable设置观察

trainable变量设置是否学习
weights=tf.Variable(initial_value=tf.random_normal(shape=[1,1]),trainable=False)
设置为false,则weights变量不会再学习

增加其他功能

  1. 变量Tensorboard显示
  2. 增加命名空间
  3. 模型保存与加载
  4. 命令行参数设置
增加变量显示
  1. 收集变量
    tf.summary.scalar(name=",tensor)收集对于损失函数和准确率等单值变量,name为变量的名字,tensor为值
    tf.summary.histogram(name=",tensor)收集高维度的变量参数
    tf.summary.image(name=",tensor)收集输入的图片张量能显示图片
  2. 合并变量写入事件文件
    merged=tf.summary.merge_all()
    运行合并:summary=sess.run(merged),每次迭代都需要运行
    添加:FileWriter.add_summary(summary,i),i表示第几次的值
def test_demo02():
    """
    自定义线性回归模型
    :return:
    """
    #1.准备数据
    X=tf.random_normal(shape=[100,1])
    y_true=tf.matmul(X,[[0.8]])+0.7

    #2.构造模型
    # 定义模型参数用变量
    weights=tf.Variable(initial_value=tf.random_normal(shape=[1,1]))
    bias=tf.Variable(initial_value=tf.random_normal(shape=[1,1]))
    y_predict=tf.matmul(X,weights)+bias

    #3.构造损失函数
    error=tf.reduce_mean(tf.square(y_predict-y_true))

    #4.优化损失
    optimizer=tf.train.GradientDescentOptimizer(learning_rate=0.01).minimize(error)

    #(2)收集变量
    tf.summary.scalar("error",error)
    tf.summary.histogram("weights",weights)
    tf.summary.histogram("bias",bias)

    #(3)合并变量
    merged=tf.summary.merge_all()

    #5.初始化变量
    init=tf.global_variables_initializer()

    #6.开启会话
    with tf.Session() as sess:
        #初始化变量
        sess.run(init)

        #(1)创建事件文件
        file_writer=tf.summary.FileWriter("./tmp/linear",graph=sess.graph)

        #查看初始化模型参数后的值
        print("训练前模型的参数为:权重%f,偏置%f,损失为%f"%(weights.eval(),bias.eval(),error.eval()))
        #开始训练
        for i in range(100):
            sess.run(optimizer)
            print("第%d次训练后模型的参数为:权重%f,偏置%f,损失为%f"%(i+1,weights.eval(),bias.eval(),error.eval()))

            #(3)运行合并变量操作
            summary=sess.run(merged)
            #(4)将每次迭代后的变量写入事件文件中
            file_writer.add_summary(summary,i)

    return None;

请添加图片描述
请添加图片描述
请添加图片描述

请添加图片描述
请添加图片描述
(1)创建事件文件
(2)收集变量
(3)合并变量
(4)每次迭代运行一次合并变量
(5)每次迭代将summary对象写入事件文件

增加命名空间

def test_demo03():                                                                                     
    """                                                                                                
    自定义线性回归模型                                                                                          
    :return:                                                                                           
    """                                                                                                
    #1.准备数据                                                                                            
    with tf.variable_scope("prepare-data"):                                                            
        X=tf.random_normal(shape=[100,1])                                                              
        y_true=tf.matmul(X,[[0.8]])+0.7                                                                
                                                                                                       
    #2.构造模型                                                                                            
    # 定义模型参数用变量                                                                                        
    with tf.variable_scope("create_model"):                                                            
        weights=tf.Variable(initial_value=tf.random_normal(shape=[1,1]))                               
        bias=tf.Variable(initial_value=tf.random_normal(shape=[1,1]))                                  
        y_predict=tf.matmul(X,weights)+bias                                                            
                                                                                                       
    #3.构造损失函数                                                                                          
    with tf.variable_scope("loss_function"):                                                           
        error=tf.reduce_mean(tf.square(y_predict-y_true))                                              
                                                                                                       
    #4.优化损失                                                                                            
    with tf.variable_scope("optimizer"):                                                               
        optimizer=tf.train.GradientDescentOptimizer(learning_rate=0.01).minimize(error)                
                                                                                                       
    #(2)收集变量                                                                                           
    tf.summary.scalar("error",error)                                                                   
    tf.summary.histogram("weights",weights)                                                            
    tf.summary.histogram("bias",bias)                                                                  
                                                                                                       
    #(3)合并变量                                                                                           
    merged=tf.summary.merge_all()                                                                      
                                                                                                       
    #5.初始化变量                                                                                           
    init=tf.global_variables_initializer()                                                             
                                                                                                       
    #6.开启会话                                                                                            
    with tf.Session() as sess:                                                                         
        #初始化变量                                                                                         
        sess.run(init)                                                                                 
                                                                                                       
        #(1)创建事件文件                                                                                     
        file_writer=tf.summary.FileWriter("./tmp/linear",graph=sess.graph)                             
                                                                                                       
        #查看初始化模型参数后的值                                                                                  
        print("训练前模型的参数为:权重%f,偏置%f,损失为%f"%(weights.eval(),bias.eval(),error.eval()))                   
        #开始训练                                                                                          
        for i in range(100):                                                                           
            sess.run(optimizer)                                                                        
            print("第%d次训练后模型的参数为:权重%f,偏置%f,损失为%f"%(i+1,weights.eval(),bias.eval(),error.eval()))       
                                                                                                       
            #(3)运行合并变量操作                                                                               
            summary=sess.run(merged)                                                                   
            #(4)将每次迭代后的变量写入事件文件中                                                                       
            file_writer.add_summary(summary,i)                                                         
                                                                                                       
    return None;                                                                                       

请添加图片描述
请添加图片描述

def test_demo04():
    """
    自定义线性回归模型
    :return:
    """
    #1.准备数据
    with tf.variable_scope("prepare-data"):
        X=tf.random_normal(shape=[100,1],name="Features")
        y_true=tf.matmul(X,[[0.8]])+0.7

    #2.构造模型
    # 定义模型参数用变量
    with tf.variable_scope("create_model"):
        weights=tf.Variable(initial_value=tf.random_normal(shape=[1,1]),name="Weights")
        bias=tf.Variable(initial_value=tf.random_normal(shape=[1,1]),name="Bias")
        y_predict=tf.matmul(X,weights)+bias

    #3.构造损失函数
    with tf.variable_scope("loss_function"):
        error=tf.reduce_mean(tf.square(y_predict-y_true))

    #4.优化损失
    with tf.variable_scope("optimizer"):
        optimizer=tf.train.GradientDescentOptimizer(learning_rate=0.01).minimize(error)

    #(2)收集变量
    tf.summary.scalar("error",error)
    tf.summary.histogram("weights",weights)
    tf.summary.histogram("bias",bias)

    #(3)合并变量
    merged=tf.summary.merge_all()

    #5.初始化变量
    init=tf.global_variables_initializer()

    #6.开启会话
    with tf.Session() as sess:
        #初始化变量
        sess.run(init)

        #(1)创建事件文件
        file_writer=tf.summary.FileWriter("./tmp/linear",graph=sess.graph)

        #查看初始化模型参数后的值
        print("训练前模型的参数为:权重%f,偏置%f,损失为%f"%(weights.eval(),bias.eval(),error.eval()))
        #开始训练
        for i in range(100):
            sess.run(optimizer)
            print("第%d次训练后模型的参数为:权重%f,偏置%f,损失为%f"%(i+1,weights.eval(),bias.eval(),error.eval()))

            #(3)运行合并变量操作
            summary=sess.run(merged)
            #(4)将每次迭代后的变量写入事件文件中
            file_writer.add_summary(summary,i)

    return None;

请添加图片描述
请添加图片描述

模型的保存与加载

  • tf.train.Saver(var_list=None,max_to_keep=5)
    保存和加载模型(保存文件格式:checkpoint文件)
    var_list:指定将要保存和还原的变量。它可以作为一个dict或一个列表传递
    max_to_keep:指示要保留的最近检查点文件的最大数量,创建新文件时,会删除较旧的文件。如果无或0,则保留所有检查点文件。默认为5(即保留最新的5个检查点文件)
def test_demo05():
    """
    自定义线性回归模型
    :return:
    """
    #1.准备数据
    with tf.variable_scope("prepare-data"):
        X=tf.random_normal(shape=[100,1],name="Features")
        y_true=tf.matmul(X,[[0.8]])+0.7

    #2.构造模型
    # 定义模型参数用变量
    with tf.variable_scope("create_model"):
        weights=tf.Variable(initial_value=tf.random_normal(shape=[1,1]),name="Weights")
        bias=tf.Variable(initial_value=tf.random_normal(shape=[1,1]),name="Bias")
        y_predict=tf.matmul(X,weights)+bias

    #3.构造损失函数
    with tf.variable_scope("loss_function"):
        error=tf.reduce_mean(tf.square(y_predict-y_true))

    #4.优化损失
    with tf.variable_scope("optimizer"):
        optimizer=tf.train.GradientDescentOptimizer(learning_rate=0.01).minimize(error)

    #(2)收集变量
    tf.summary.scalar("error",error)
    tf.summary.histogram("weights",weights)
    tf.summary.histogram("bias",bias)

    #(3)合并变量
    merged=tf.summary.merge_all()

    #创建saver对象
    saver=tf.train.Saver()

    #5.初始化变量
    init=tf.global_variables_initializer()

    #6.开启会话
    with tf.Session() as sess:
        #初始化变量
        sess.run(init)

        #(1)创建事件文件
        file_writer=tf.summary.FileWriter("./tmp/linear",graph=sess.graph)

        #查看初始化模型参数后的值
        print("训练前模型的参数为:权重%f,偏置%f,损失为%f"%(weights.eval(),bias.eval(),error.eval()))
        #开始训练
        for i in range(100):
            sess.run(optimizer)
            print("第%d次训练后模型的参数为:权重%f,偏置%f,损失为%f"%(i+1,weights.eval(),bias.eval(),error.eval()))

            #(3)运行合并变量操作
            summary=sess.run(merged)
            #(4)将每次迭代后的变量写入事件文件中
            file_writer.add_summary(summary,i)

            #保存模型
            if(i%10==0):
                saver.save(sess,"./tmp/model/my_linear.ckpt")

    return None;

请添加图片描述
加载模型

def test_demo06():
    """
    自定义线性回归模型
    :return:
    """
    #1.准备数据
    with tf.variable_scope("prepare-data"):
        X=tf.random_normal(shape=[100,1],name="Features")
        y_true=tf.matmul(X,[[0.8]])+0.7

    #2.构造模型
    # 定义模型参数用变量
    with tf.variable_scope("create_model"):
        weights=tf.Variable(initial_value=tf.random_normal(shape=[1,1]),name="Weights")
        bias=tf.Variable(initial_value=tf.random_normal(shape=[1,1]),name="Bias")
        y_predict=tf.matmul(X,weights)+bias

    #3.构造损失函数
    with tf.variable_scope("loss_function"):
        error=tf.reduce_mean(tf.square(y_predict-y_true))

    #4.优化损失
    with tf.variable_scope("optimizer"):
        optimizer=tf.train.GradientDescentOptimizer(learning_rate=0.01).minimize(error)

    #(2)收集变量
    tf.summary.scalar("error",error)
    tf.summary.histogram("weights",weights)
    tf.summary.histogram("bias",bias)

    #(3)合并变量
    merged=tf.summary.merge_all()

    #创建saver对象
    saver=tf.train.Saver()

    #5.初始化变量
    init=tf.global_variables_initializer()

    #6.开启会话
    with tf.Session() as sess:
        #初始化变量
        sess.run(init)

        #(1)创建事件文件
        file_writer=tf.summary.FileWriter("./tmp/linear",graph=sess.graph)

        #查看初始化模型参数后的值
        print("训练前模型的参数为:权重%f,偏置%f,损失为%f"%(weights.eval(),bias.eval(),error.eval()))

        #加载模型
        if(os.path.exists("./tmp/model/checkpoint")):
            saver.restore(sess,"./tmp/model/my_linear.ckpt")
        print("训练后模型的参数为:权重%f,偏置%f,损失为%f"%(weights.eval(),bias.eval(),error.eval()))

请添加图片描述

命令行参数使用

  1. tf.app.flags,支持应用从命令行接收参数,可以用来指定集群配置等
    tf.app.flags.DEFINE_integer(“max_step”,0,“训练模型的步数”)
    tf.app.flags.DEFINE_string(“model_dir”,"",“模型保存的路径+模型名字”)
  2. FLAGS=tf.app.flags.FLAGS
    通过FLAGS.max_step调用命令行中传过来的参数
  3. 通过tf.app.run()启动main(argv)函数
#定义命令行参数
tf.app.flags.DEFINE_integer("max_step",100,"训练模型的步数")
tf.app.flags.DEFINE_string("model_dir","Unknown","模型保存的路径+模型名字")
FLAGS=tf.app.flags.FLAGS
def command_demo():
    print("max_step:\n",FLAGS.max_step)
    print("model_dir:\n",FLAGS.model_dir)

请添加图片描述
请添加图片描述

def main(argv):
    print("hello")
    print(argv)
if __name__ == '__main__':
    tf.app.run()

请添加图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值