tensorflow之线性回归

线性回归

(1)简单线性回归(一元)

  • 定义输入变量x,输出变量y;
  • 初始化线性回归中的参数:w,b;
  • 根据公式给出预测结果,计算误差,使用梯度下降优化;
  • 不断的训练,直到达到最大的训练次数(或考虑达到最小的误差要求),结束训练,输出最终的结果;
# coding=utf-8
'''
tensorflow 完成简单的线性回归(隐藏层单神经元)
'''
import tensorflow as tf
import numpy as np

#1.创建数据(输入x_data,输出y_data)
x_data = np.random.rand(100).astype(np.float32)
y_data = x_data*0.1+0.3
#2.创建tensorflow结构
#定义权重参数,一维,范围为-1.0到1.0
Weights = tf.Variable(tf.random_uniform([1],-1.0,1.0))
#偏置初始化为0
biases = tf.Variable(tf.zeros([1]))

#预测值计算公式
y = Weights*x_data+biases
#二次代价函数
loss = tf.reduce_mean(tf.square(y-y_data))
#建立梯度下降优化器,学习率为0.5
optimizer = tf.train.GradientDescentOptimizer(0.5)
#最小化代价函数
train = optimizer.minimize(loss)

#3.进行优化计算
#初始化所有变量
init = tf.initialize_all_variables()

with tf.Session() as sess:
    sess.run(init)
    #200次迭代,并输出每次的w,b值
    for step in range(201):
        sess.run(train)
        if step%20==0:
            print(step,sess.run(Weights),sess.run(biases))
'''
w = 0.1,b = 0.3
预测结果:w =  0.09999931,b = 0.30000037
'''

(2)通用线性回归(多元)

  • 初始化输入变量x,噪声数据noise,输出变量y;
  • 初始化两个占位符对于输入x和输出y;
  • 定义添加网络的函数;
  • 调用函数构建:1( 输入)-10(隐层)-1(输出)网络结构;
  • 预测输出,计算误差,梯度下降进行优化;
  • 开始训练,训练过程中图示显示拟合过程;
# coding=utf-8
'''
#利用神经网络实现线性回归(隐藏层多神经元,权重与偏差为矩阵)
'''
import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt

# 1.编写添加网络函数
'''
inputs:输入值
in_size:输入层的神经元个数
out_size:与输入层相邻的层的神经元个数
activation_function:激活函数
'''
def add_layer(inputs,in_size,out_size,activation_function=None):
    # 连接权重,定义为矩阵
    Weights = tf.Variable(tf.random_normal([in_size,out_size]))
    # 偏置项
    biases = tf.Variable(tf.zeros([1,out_size])+0.1)
    # 计算输出
    Wx_plus_b = tf.matmul(inputs,Weights)+biases
    if activation_function is None:
        outputs = Wx_plus_b
    else:
        # 使用激活函数激活
        outputs = activation_function(Wx_plus_b)
    return outputs

# 2.生成数据
# 矩阵为300行1列(等差数列)
x_data = np.linspace(-1,1,300)[:,np.newaxis]
# 噪声数据:均值为0,方差为0.05
noise = np.random.normal(0,0.05,x_data.shape)
# y = x*x-0.5
y_data = np.square(x_data)-0.5+noise

# 3.定义中间变量(方便进行小批量的训练)
# 输入维度为1,不限定样本大小
xs = tf.placeholder(tf.float32,[None,1])
ys = tf.placeholder(tf.float32,[None,1])

# 4.网络层的训练
# 构造1-10-1的网络结构
# 输入层到隐藏层
l1 = add_layer(xs,1,10,activation_function=tf.nn.relu)
# 隐藏层到输出层
prediction = add_layer(l1,10,1,activation_function=None)
# 代价函数
loss = tf.reduce_mean(tf.reduce_sum(tf.square(ys-prediction),reduction_indices=[1]))  # 根据行(样本编号)统计样本误差
# 梯度下降最小化代价
train_step = tf.train.GradientDescentOptimizer(0.1).minimize(loss)

# 5.开始训练,并图示化结果
init = tf.global_variables_initializer()
# 绘图
fig = plt.figure()
ax = fig.add_subplot(1,1,1)
ax.scatter(x_data,y_data)  # 散点图
plt.ion()  # 打开交互模式(加入后不会在show之后阻止程序运行)
plt.show()
with tf.Session() as sess:
    sess.run(init)
    for i in range(1000):
        sess.run(train_step, feed_dict={xs: x_data, ys: y_data})
        if i%50==0:
            try:
                ax.lines.remove(lines[0])  # 先擦除原本的折线图
            except Exception:
                pass
            predict_value = sess.run(prediction,feed_dict={xs: x_data})
            # 画曲线,红色,线宽为5
            lines = ax.plot(x_data,predict_value,'r-',lw=5)
            plt.pause(0.1)  # 停0.1
            '''静态图
            plt.figure()
            plt.scatter(x_data,y_data)
            plt.plot(x_data,predict_value,'r-',lw=5)
            plt.show()
            '''

训练结束时的拟合效果图:

tensorflow之线性回归_第1张图片

你可能感兴趣的:(深度学习与tensorflow,线性回归,tensorflow,梯度下降)