tensorflow入门(4):一元线性回归y=wx+b

使用TensorFlow进行算法涉及与训练的核心步骤:

1、准备数据:特征x,标签y,有标签样本{x, y} 用于训练,无标签样本:{x, ?} 用于预测。

2、构建模型:y',

3、训练模型:设置超参数(开始学习过程之前设置好值的参数,包括学习率即步长、迭代次数、神经网络隐含层数量等)、定义损失函数(常见损失函数是均方差mean square error (MSE) 和交叉熵cross-entropy)、梯度下降法(随机梯度下降SGD,小批量随机梯度下降,全梯度BGD等)。通过有标签样本来学习确定所有权重w和偏差b,找到一组平均损失较小的权重w和偏差b。

  • L_1损失:基于模型预测的值与标签的实际值之差的绝对值
  • L_2损失(平方损失)
  • MSE=\frac{1}{N} \sum_{(x,y)\in D} (y-prediction(x))^2

4、进行预测

 

本例通过生成人工数据集,随机生成一个近似采样随机分布,使得w=2.0, b=1,并加入一个噪声,噪声最大振幅为0.4

# -*- coding: utf-8 -*-
"""
Created on Thu Apr 16 13:10:55 2020

@author: DELL
"""

# %matplotlib inline                # 在Jupyter中,使用matplotlib显示图像需要设置为inline模式,否则不显示图像

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

# 1、准备数据
np.random.seed(5)                   # 设置随机数种子

x_data = np.linspace(-1, 1, 100)    # 用np生成100个点

y_data = 2 * x_data + 1.0 + np.random.rand(*x_data.shape) * 0.4 # y=2x+1+噪声,噪声维度与x_data一致
                                    # numpy.random.randn()是标准正态分布N(0.1)
                                    # x_data.shape = (100,)
                                    # 实参前面加上*意味着拆包。即把元组拆成一个个单独的实参

plt.figure(num=1)                   # 作图
plt.scatter(x_data, y_data,label='Oroginal data')
plt.plot(x_data, 2 * x_data + 1.0, color = 'red', linewidth=3,label='Object line')
plt.legend(loc=4)                   # 用loc指定图例位置

# 2、构建模型
x = tf.placeholder('float', name = 'x') # 定义训练数据的占位符:特征x, 标签y
y = tf.placeholder('float', name = 'y')

def model(x, w, b):                     # 定义模型函数
    return tf.multiply(x, w) + b

w = tf.Variable(1.0, name='w0')         # 构建变量:w, b
b = tf.Variable(0.0, name='b0')

pred = model(x, w, b)                   # pred是预测值,前向计算

# 3、训练模型
# 设置训练参数(超参数)
train_epochs = 8                        # 迭代次数(训练轮数)
learning_rate = 0.05                    # 学习率 0.01-0.1
# L2损失函数(均方差损失函数)
loss_function = tf.reduce_mean(tf.square(y-pred))   
# 梯度下降优化器
optimizer = tf.compat.v1.train.GradientDescentOptimizer(learning_rate).minimize(loss_function)

# 创建会话,并初始化变量
sess = tf.Session()
init = tf.global_variables_initializer()
sess.run(init)

# 训练 SGD随机梯度下降法
step = 0                                # 记录训练步数
loss_list = []                          # 保存loss值的列表
display_step = 20                       # 控制训练过程数据显示的频率,不是超参数

for epoch in range(train_epochs):
    for xs,ys in zip(x_data, y_data):
        _, loss = sess.run([optimizer,loss_function], feed_dict={x: xs, y: ys})
        loss_list.append(loss)
        step = step +1
        if step % display_step == 0:
            print('Train Epoch: ', '%02d' % (epoch+1), 'Step: %03d' % (step), 'loss = ',\
                  "{:.9f}".format(loss))        
    b0temp = b.eval(session=sess)
    w0temp = w.eval(session=sess)    
    plt.figure(num=2)
    plt.plot(x_data, w0temp * x_data + b0temp,label='Fitted line')
    
    plt.figure(num=3)
    plt.plot(loss_list,color='blue')     # 图形化显示损失值
    plt.figure(num=4)
    plt.plot(loss_list,'r+')

print('w: ',sess.run(w))
print('b: ',sess.run(b))

# 4、进行预测
x_test = 3.21

# 方法一
predict = sess.run(pred, feed_dict={x: x_test})
print('预测值:%f' %predict)
# 方法二
predict = sess.run(w) * x_test + sess.run(b)
print('预测值:%f' %predict)

target = 2 * x_test + 1.0
print('目标值:%f' %target)

sess.close()

输出结果:

w:  1.9885789
b:  1.1972067
预测值:7.580545
预测值:7.580545
目标值:7.420000

 

以上。参考Mooc课程是吴明晖老师的《深度学习应用开发-TensorFlow实践》。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值