美文网首页我爱编程
读书笔记:TensorFlow机器学习实战指南

读书笔记:TensorFlow机器学习实战指南

作者: 惊起却回首 | 来源:发表于2018-03-11 22:43 被阅读0次

    Frank He 3/10/2018

    约定数据源用椭圆形,数据池用方形,函数用同心圆,变量用圆形,loss用菱形,计算流用实线,控制流用虚线

    一、一个简单的例子:线性回归

    1.模型

    Model

    图中浅绿色的部分就是要训练的模型,这个例子中为y=Ax+b的线性模型

    2.TensorFlow的Code模板

    • 加载库和数据集
      import matplotlib.pyplot as plt
      import numpy as np
      import tensorflow as tf
      from tensorflow.python.framework import ops
      ops.reset_default_graph()
      sess=tf.Session()
      …………
    
    • 定义节点(数据源,数据池,变量)
      注意变量需要初始化,比如:
      width=np.array([x[3] for x in iris.data])
      length=np.array([x[0] for x in iris.data])
      x0=tf.placeholder(shape=[None,1],dtype=tf.float32)#x0和y0都是一维列向量,此处不能定义为1*1矩阵
      y0=tf.placeholder(shape=[None,1],dtype=tf.float32)
      A=tf.Variable(tf.random_normal(shape=[1,1]))#正态随机数初始化A和b
      b=tf.Variable(tf.random_normal(shape=[1,1]))
    
    • 构建模型(线性、非线性)
    • 选取损失函数(L1,L2,Psuedo-Huber,Hinge,Cross-Entroy)
    • 初始化任务
        init=tf.global_variables_initializer()
        sess.run(init)
    
    • 定义训练步骤
        rate=0.05 #rate可以选
        GDO=tf.train.GradientDescentOptimizer(rate) #也可以用其他优化器
        TrainStep=GDO.minimize(loss)
    
    • 开始训练
        for i in range(100):
        num=np.random.choice(len(width),size=BatchSize)
        x0_rand=np.transpose([width[num]])
        y0_rand=np.transpose([length[num]])
        sess.run(TrainStep,feed_dict={x0:x0_rand,y0:y0_rand})
    

    注意一下sess.run(),只有TrainStep和Loss的sess.run()需要feed

    • 取回训练结果并评估
      完整代码如下:
        import matplotlib.pyplot as plt
        import numpy as np
        import tensorflow as tf
        from sklearn import datasets
        from tensorflow.python.framework import ops
        ops.reset_default_graph()
        sess=tf.Session()
        iris=datasets.load_iris()
    
        width=np.array([x[3] for x in iris.data])
        length=np.array([x[0] for x in iris.data])
        x0=tf.placeholder(shape=[None,1],dtype=tf.float32)#x0和y0都是一维列向量,此处不能定义为1*1矩阵
        y0=tf.placeholder(shape=[None,1],dtype=tf.float32)
        A=tf.Variable(tf.random_normal(shape=[1,1]))#正态随机数初始化A和b
        b=tf.Variable(tf.random_normal(shape=[1,1]))
    
        y=tf.add(tf.matmul(x0,A),b)#模型是y=Ax+b
        loss=tf.reduce_mean(tf.square(y-y0))#误差用残差平方和计量
    
        init=tf.global_variables_initializer()
        sess.run(init)
    
    
        rate=0.05
        GDO=tf.train.GradientDescentOptimizer(rate)
        TrainStep=GDO.minimize(loss)
    
        losslist=[]
        BatchSize=25
        for i in range(100):
        num=np.random.choice(len(width),size=BatchSize)#在0~len(width)之间随机采样BatchSize个数据
        x0_rand=np.transpose([width[num]])#标量经过转置变为一维列向量
        y0_rand=np.transpose([length[num]])
        sess.run(TrainStep,feed_dict={x0:x0_rand,y0:y0_rand})#投喂训练
        TempLoss=sess.run(loss,feed_dict={x0:x0_rand,y0:y0_rand})
        losslist.append(TempLoss)
        if((i+1)%25==0):
            print('Step #'+str(i+1)+'   '+str(TempLoss))
    
    
        [slope]=sess.run(A)
        [intercept]=sess.run(b)
        bestfit=[]
        for i in width:
        bestfit.append(slope*i+intercept)
        plt.plot(width,length,'o',label="OriginalData")
        plt.plot(width,bestfit,'r-',label="BestLine")
        plt.show()
        plt.plot(losslist,'k-')
        plt.show()
    

    拟合效果如图:


    BestLine

    偏差随训练次数增加而下降:


    Loss

    3.讨论一下损失函数的选择

    • 学习速率为0.05时,各损失函数下降曲线比较


      学习速率为0.05时,各损失函数下降曲线

      其中蓝色为残差平方和,绿色为绝对差和,橙色为垂直距离和,红色为交叉熵

    • 学习速率为0.4时,各损失函数下降曲线比较


      学习速率为0.4时,各损失函数下降曲线

    二、非线性回归

    相关文章

      网友评论

        本文标题:读书笔记:TensorFlow机器学习实战指南

        本文链接:https://www.haomeiwen.com/subject/wplgfftx.html