【机器学习】Tensorflow做线性拟合

版权声明:本文为博主原创文章,转载请注明出处!!!(●'◡'●) https://blog.csdn.net/Small_Mouse0/article/details/79757117

Tensorflow做线性拟合,有点大炮打苍蝇的赶脚。不过测试一下,熟悉熟悉Tensorflow也何尝不可

Tensorflow构建模型一般分为一下步骤

1. 设置权重(W)及偏执(b)

#创建变量  
#tf.random_normal([1])返回一个符合正太分布的随机数  
W=tf.Variable(tf.random_normal([1],name='weight'))  # 权重,由于线性拟合是 一维且线性,在此权值设置一个即可
b=tf.Variable(tf.random_normal([1],name='bias'))    # 偏执参数是必须的,作为整体调整的参数

2. 设置占位符(也可以当做是输入输出通道,主要是参数类型以及矩阵维度)

X = tf.placeholder(tf.float32,[None,1])    #指的是输入
Y = tf.placeholder(tf.float32,[None,1])    #指的是输出

[None,1]意思是:n行一列的矩阵,例如:[[1],[2],[3],[4]]


3. 定义损失函数(代价函数)

loss = tf.reduce_sum(tf.pow(tf.multiply(W,X) + b - Y,2.0))    

损失函数主要为优化目标服务,也就是【真实情况-输出情况平方求和】,

4. 定义优化器

optimizer = tf.train.AdamOptimizer(1).minimize(loss)

优化器可以理解为优化到目标的方式,优化器有很多种,目的都是一样的,既【是的损失函数最小、或者可以说,输出结果尽可能等于真实结果】


5. 开始训练

with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    for step in range(200):   #一千次迭代
        sess.run(optimizer,feed_dict={X:x.reshape(-1,1),Y:y.reshape(-1,1)})

创建session,初始化,迭代训练,,其具体含义日后会有详解,此处不做详解

完整代码如下:

import tensorflow as tf
import matplotlib.pyplot as plt
import numpy as np

#生成模拟数据,进行测试
x = np.array(np.arange(100) ,dtype=np.float32)
y = np.array(np.arange(100) ,dtype=np.float32)#此时X和Y其实是相等的,后面加入随机值,尽可能真实模拟实际情况
y +=(np.random.random_sample(100) * 20)# *20指的是,上波动10
y -=20 #下降20,,,y = x+b  -->  y = x - 10
print(y[:20])#查看前20列

#设置权重 创建变量  
#tf.random_normal([1])返回一个符合正太分布的随机数  
W=tf.Variable(tf.random_normal([1],name='weight'))  # 权重,由于线性拟合是 一维且线性,在此权值设置一个即可
b=tf.Variable(tf.random_normal([1],name='bias'))    # 偏执参数是必须的,作为整体调整的参数

#添加占位符
X = tf.placeholder(tf.float32,[None,1])    #指的是输入
Y = tf.placeholder(tf.float32,[None,1])    #指的是输出

#构造损失函数
loss = tf.reduce_sum(tf.pow(tf.multiply(W,X) + b - Y,2.0))  #此处对所有的y-kx-b进行平方求和

#添加优化器
optimizer = tf.train.AdamOptimizer(1).minimize(loss)
#注:递归下降分析法,对于输入参数需要归一化,否则会出现训练异常
# optimizer = tf.train.GradientDescentOptimizer(0.1).minimize(loss)


#开始训练
save_step_loss = {"step":[],"loss":[]}# 保存step和loss用于可视化操作
line_k = 0 #保存k
line_b = 0 #保存b
with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    for step in range(200):   #一千次迭代
        sess.run(optimizer,feed_dict={X:x.reshape(-1,1),Y:y.reshape(-1,1)})
        print("step:",step,
              "loss: ",sess.run(loss,feed_dict={X:x.reshape(-1,1),Y:y.reshape(-1,1)}),
              "W:",sess.run(W),
              "b:",sess.run(b))
        save_step_loss["step"].append(step)
        save_step_loss["loss"].append(sess.run(loss,feed_dict={X:x.reshape(-1,1),Y:y.reshape(-1,1)}))
    line_k = sess.run(W)
    line_b = sess.run(b)
	
	
#画图损失函数变化曲线
plt.plot(save_step_loss["step"],save_step_loss["loss"])
plt.show()

#画预测直线,及其离散点分布情况
#plt.scatter(x,y,5,c="r")
#plt.plot([0,100],[0 * line_k + line_b , 100 * line_k + line_b])
#plt.show()

显示可视化的结果,,

【损失函数变化曲线】


【画预测直线,及其离散点分布情况】



完整代码码云超链接

猜你喜欢

转载自blog.csdn.net/Small_Mouse0/article/details/79757117
今日推荐