TensorFlow实现神经网络算法(一) 线性回归

训练集是生成的随机数,x和y的对应关系是y=2x。先生成100个随机数x,然后再计算出y=2x,并在结果上加上一些噪声,测试线性回归模型能否拟合好出y=2x。

1、代码如下:

import tensorflow as tf #导入TensorFlow模块
import numpy as np
import matplotlib.pyplot as plt

train_X=np.linspace(-1,1,100) #产生训练样本X.函数np.linspace用于产生随机数,5个参数,常用前三个,前两个代表产生随机数的范围,第三个代表数目,默认50.
train_Y=2*train_X+np.random.randn(*train_X.shape)*0.3 #y=2x,第二部分用于产生维度一样的随机数作为噪声

#显示模拟数据产生情况
plt.plot(train_X,train_Y,'ro',label='Organinal data')
plt.legend()
plt.show()

#创建模型
#占位符
X=tf.placeholder("float")
Y=tf.placeholder("float")
#模型参数
W=tf.Variable(tf.random_normal([1]),name='weight') #tf.random_normal()函数的参数,形状必选。这里指的是一个数,函数的作用是产生一个随机数
b=tf.Variable(tf.zeros([1]),name='bias') #tf.Variable函数要初始化
#前向结构
Z=np.multiply(X,W)+b #z是预测值

#反向优化
cost=tf.reduce_mean(tf.square(Y-Z)) #tf.reduce_mean计算平矩阵
learn_rate=0.01
optimizer=tf.train.GradientDescentOptimizer(learn_rate).minimize(cost)


#初始化所有变量
init=tf.global_variables_initializer()#先写上初始化,然后再在sess.run()里面调用

#定义迭代次数
training_epochs=20

#启动session
with tf.Session() as sess:#用with tf.Session() as sess的好处是不需要手动关闭上下文
    sess.run(init) #先初始化
    plotdata={"epoch_num":[],"loss":[]} #存放迭代次数值和损失值
    #向模型注入数据
    for epoch in range(training_epochs):
        for(x,y) in zip(train_X,train_Y): #利用zip函数实现特征和标签的关联,zip函数返回一个元组列表,也就是返回的是个列表,列表元素是一个个元组
            sess.run(optimizer,feed_dict={X:x,Y:y})

        #显示训练中的详细信息
        loss=sess.run(cost,feed_dict={X:train_X,Y:train_Y})
        print("Epoch:",epoch+1,"cost=",loss,"W=",sess.run(W),"b=",sess.run(b))
        if not (loss=="NA"):
            plotdata["epoch_num"].append(epoch)
            plotdata["loss"].append(loss)
    print("Finished!")
    print("cost=",sess.run(cost,feed_dict={X:train_X,Y:train_Y}),"W=",sess.run(W),"b=",sess.run(b))

    #模型可视化
    #这里要注意,设计sess的都要在with session as sess里面
    plt.plot(train_X,train_Y,'ro',label='Origal data')
    plt.plot(train_X,sess.run(W)*train_X+sess.run(b),label='Fittedline') #这样写可以显示到一个图里面
    plt.legend()
    plt.show()

    #显示梯度损失函数
    plt.plot(plotdata["epoch_num"],plotdata["loss"],'ro')
    plt.legend()
    plt.show()

    #测试
    print("x=0.2,z=",sess.run(Z,feed_dict={X:0.2}))

2、实验结果:

生成的原始数据图:

TensorFlow实现神经网络算法(一) 线性回归

 

拟合的函数图像:

TensorFlow实现神经网络算法(一) 线性回归

 

损失函数图像:

TensorFlow实现神经网络算法(一) 线性回归

 

上一篇:module 'tensorflow' has no attribute 'ConfigProto'/'Session'解决方法


下一篇:tf.Session() vs tf.InteractiveSession()