美文网首页Tensorflow实践
每次一篇10分钟,小步快跑攻陷Tensorflow(非线性多项式

每次一篇10分钟,小步快跑攻陷Tensorflow(非线性多项式

作者: 一块自由的砖 | 来源:发表于2019-11-27 11:07 被阅读0次

    目的

    根据数据集拟合出一个最优的模型,通过这个模型可以计算任何点的值,可以查看历史和推算未来数据的。

    数据集

    构建正弦曲线带有随机点的数据集

    生成100个点的线性随机点

    import numpy as np
    import tensorflow as tf
    import matplotlib.pyplot as plt
    
    #训练数据和测试数据
    number = 100
    list_x = np.linspace(-4, 4, number)
    list_y = np.sin(list_x)+np.random.uniform(-0.5, 0.5, number)
    
    print(list_x)
    print(list_y)
    
    plt.scatter(list_x, list_y)
    plt.show()
    

    数据集散点图

    数据集散点图

    确定拟合模型

    根据散点图的分布,和明显看出来不是线性的,这里先采用多项式模型:


    多项式

    但是,这里面的参数w1,w2,w3和b咱们是不知道的,通过现有数据的训练,最后计算出w1,w2,w3和b达到最优解。

    模型实现和训练

    #初始化x和y的占位符
    X = tf.placeholder(tf.float32, name='X')
    Y = tf.placeholder(tf.float32, name='Y')
    # 初始化 w 和 b
    W = tf.Variable(tf.random_normal([1]), name='weight')
    b = tf.Variable(tf.random_normal([1]), name='bias')
    #多项式建模,建立op
    Y_pred = tf.add(tf.multiply(X,W),b)
    W2 = tf.Variable(tf.random_normal([1]), name='weight2')
    Y_pred = tf.add(tf.multiply(tf.pow(X,2),W2),Y_pred)
    W3 = tf.Variable(tf.random_normal([1]), name='weight3') 
    Y_pred = tf.add(tf.multiply(tf.pow(X,3),W3),Y_pred)
    #初始化数据样本个数
    n_samples = len(list_x)
    #计算损失函数值
    loss = tf.reduce_sum(tf.pow(Y_pred-Y, 2))/n_samples
    #初始化optimizer (优化器)
    #学习率
    learning_rate = 0.01
    #选择优化器,这里使用梯度下降算法
    optimizer = tf.train.GradientDescentOptimizer(learning_rate).minimize(loss)
    #指定迭代次属,并在session中执行graph
    train_number = 1000
    #定义初始化全部变量op
    init = tf.global_variables_initializer()
    with tf.Session() as sess:
        #初始化全部变量
        sess.run(init)
        writer = tf.summary.FileWriter('./graphs', sess.graph)
        #训练模型
        for i in range(train_number):
            total_loss = 0
            for x, y in zip(list_x, list_y):
                #通过feed_dict把数据喂进去 x,y in [(x1,y1),(x2,y2),...]
                #这里说明下先执行了 optimier op 然后再执行 loss op 使用的数据都是feed_dict的
                sess.run([optimizer, loss],feed_dict={X:x,Y:y})
            #每100次输出一个训练情况
            if i %100==0:
                print("step %d eval loss is %f" % (i, total_loss/n_samples))
        #关闭writer
        writer.close()
        #输出下最红的w和b 
        W = sess.run(W)
        W2 = sess.run(W2)
        W3 = sess.run(W3)
        b = sess.run(b)
        print(W)
        print(W2)
        print(W3)
        print(b)
    

    取得的W1,W2,W3和b
    W1 = [0.69384557]
    W2 = [0.02129303]
    W3 = [-0.06366162]
    b = [-0.06555262]

    查看拟合情况

    plt.plot(list_x, list_y, 'bo', label='real data')
    plt.plot(list_x, W*list_x+W2*np.power(list_x,2)+W3*np.power(list_x,3)+b, 'r', label='predicted data')
    plt.legend()
    plt.show()
    
    拟合结果图

    看图片比较吻合

    全代码

    到github查看https://github.com/horacepei/tensorflow_study

    tensorboard看图

    image.png

    相关文章

      网友评论

        本文标题:每次一篇10分钟,小步快跑攻陷Tensorflow(非线性多项式

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