利用python和TensorFlow解决线性回归问题

本文示例的模块版本:
python 3.6
tensorflow 1.15(会有很多警告,但不妨碍运行。另2.0很坑,API都变了T-T)

本文主要借鉴并综合了以下两个博客的内容(样本生成和流图构建训练),并在其基础上绘制了拟合后的直线和“训练次数-代价函数值”曲线,可更直观的观察训练效果:

https://www.cnblogs.com/xianhan/p/9090426.html

https://www.cnblogs.com/selenaf/p/9102398.html

具体步骤如下:

步骤1.在很多情况下,初学者都没有样本库,一般可自建样本库。使用random函数随机初始化样本库:

num_points=1000  # 生成的样本数

vectors_set=[] # 初始化样本集,为空

for i in range(num_points):

    x1=np.random.normal(0.0,0.55)   #横坐标,进行随机高斯处理化,以0为均值,以0.55为标准差

    y1=x1*0.1+0.3+np.random.normal(-0.03,0.03)   #纵坐标,数据点在y1=x1*0.1+0.3上小范围浮动

vectors_set.append([x1,y1])

 

# 将样本集分为输入集x_data和输出集y_data

x_data=[v[0] for v in vectors_set]

y_data=[v[1] for v in vectors_set]

 

# 绘制散点图,查看生成样本的分布情况

plt.scatter(x_data,y_data,c='r')

plt.show()

 

步骤2.建立计算流图,包含“假设函数”“代价函数”和“训练函数”。如下,训练函数为梯度下降:

x = tf.placeholder(tf.float32)

W = tf.Variable(tf.zeros([1]))

b = tf.Variable(tf.zeros([1]))

y_ = tf.placeholder(tf.float32)

 

y = W * x + b

 

lost = tf.reduce_mean(tf.square(y_-y)) # 设置代价函数

optimizer = tf.train.GradientDescentOptimizer(0.01)  # 设置梯度下降及其步长0.01

train_step = optimizer.minimize(lost)

 

步骤3.初始化流图,主要是初始化运行环境。如:

sess = tf.Session()

init = tf.global_variables_initializer()

sess.run(init)

 

步骤4.开始训练:向占位符中输入数据,使用sess.run()方法进行训练。如下:

x_plot=[]

y_plot=[]

steps = 2000  # 训练的步数

for i in range(steps):

    xs = x_data

    ys = y_data

    feed = { x: xs, y_: ys }  # 向占位符中输入数据

    sess.run(train_step, feed_dict=feed)

    if i % 50 == 0 :

        print("After %d iteration:" % i)

        # print(xs,ys)

        print("W: %f" % sess.run(W))  # 查看当前训练的W值

        print("b: %f" % sess.run(b))

        print("lost: %f" % sess.run(lost, feed_dict=feed))

        if i>200:

            x_plot.append(i)

            y_plot.append(sess.run(lost, feed_dict=feed))

 

步骤5.绘制“训练次数-代价函数值”曲线,观察训练的收敛趋势。如下:

x_result=[-2,2]

W_result=sess.run(W)

b_result=sess.run(b)

y_result=[]

for x_temp in x_result:  # 如果直接赋值y_result=x_result*W+b,则y_result类型为Tensor,不能直接打印

    y_result.append(x_temp*W_result+b_result)

plt.subplot(1,2,1)

plt.scatter(x_data,y_data,c='r')

plt.plot(x_result,y_result,'-y')

plt.subplot(1,2,2)

plt.plot(x_plot,y_plot,'-')

plt.show()

 

输出结果大致如下:

打印结果(最后一次):

After 1950 iteration:

W: 0.102901

b: 0.270892

lost: 0.000836

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值