深度学习实践5通过生成人工数据集合,实现线性回归

1作业描述

在这里插入图片描述

2 问题

问题1 loss不断增加

%matplotlib inline
import tensorflow as tf
import matplotlib.pyplot as plt
import numpy as np
# 设置随机数种子,确保固定方式的随机数,其实可以自己选不带也可以
np.random.seed(5)
#直接采用np生成等差数列,生成100个点,每个点在0到100之间
x_data=np.linspace(0,100,500)
# 生成y=3.1234x+2.98+噪声,噪声维度和x_data一致,这里噪声容限也取40%
y_data=3.1234*x_data+2.98+np.random.randn(*x_data.shape)*0.4
# 画出随机散点图
plt.scatter(x_data,y_data)
# 画出我们想要学习的线性函数y=2x+1
plt.plot(x_data,3.1234*x_data+2.98,color='red',linewidth=3)
#mean_value=np.mean(x_data,axis=0)
#sigma=np.std(x_data,axis=0)
#x_data=(x_data-mean_value)/sigma
#定义占位符,x是特征值,y是标签
x=tf.placeholder("float",name = "x")
y=tf.placeholder("float",name= "y")
def model(x,w,b):
    return tf.multiply(x,w)+b
w=tf.Variable(2.0,name="w0")
b=tf.Variable(0.0,name="b0")
pred=model(x,w,b)
train_epcohs=20
learning_rate=0.1
#显示loss的粒度
display_step=20
loss_function=tf.reduce_mean(tf.square(y-pred))
optimizer=tf.train.GradientDescentOptimizer(learning_rate).minimize(loss_function)
sess=tf.Session()
init=tf.global_variables_initializer()
sess.run(init)
step=0#记录训练步数
loss_list=[]#保存loss值得列表
for epoch in range(train_epcohs):
    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)
  #  w_origin0=w0temp/sigma
  # b_origin0=b0temp-w0temp*mean_value/sigma
    print(w0temp,b0temp)
  #print(w_origin0,b_origin0)
  #plt.plot((x_data+mean_value)*sigma,w0temp*x_data+b0temp)
  plt.plot(x_data,w0temp*x_data+b0temp)

在这里插入图片描述
在这里会出现损失突然增大,主要是输入值这次取了0-100之间,将其中值如50带入计算梯度后对变量影响较大较容易进如不可控制区域。
解决办法1:将取值改为-1-1即可解决
方法2:这也不是根本解决办法,输入量不由我们控制,我们这里取得方法是将输入标准化也可解决问题,下面是具体解决步骤。

3内容

3.1产生数据集

%matplotlib inline
import tensorflow as tf
import matplotlib.pyplot as plt
import numpy as np
# 设置随机数种子,确保固定方式的随机数,其实可以自己选不带也可以
np.random.seed(5)
#直接采用np生成等差数列,生成100个点,每个点在0到100之间
x_data=np.linspace(0,100,500)
# 生成y=3.1234x+2.98+噪声,噪声维度和x_data一致,这里噪声容限也取40%
y_data=3.1234*x_data+2.98+np.random.randn(*x_data.shape)*0.4

利用matplotlib画出结果

# 画出随机散点图
plt.scatter(x_data,y_data)
# 画出我们想要学习的线性函数y=2x+1
plt.plot(x_data,3.1234*x_data+2.98,color='red',linewidth=3)

在这里插入图片描述
清空图并未tensorboard指定生成图的位置

tf.reset_default_graph()
logdir="D:\\111"

3.2标准化

mean_value=np.mean(x_data,axis=0)
sigma=np.std(x_data,axis=0)
x_data=(x_data-mean_value)/sigma

3.3构造模型

#定义占位符,x是特征值,y是标签
x=tf.placeholder("float",name = "x")
y=tf.placeholder("float",name= "y")
#构造回归模型
def model(x,w,b):
    return tf.multiply(x,w)+b
w=tf.Variable(4.0,name="w0")
b=tf.Variable(0.0,name="b0")
pred=model(x,w,b)
train_epcohs=20
learning_rate=0.05
#显示loss的粒度
display_step=20
loss_function=tf.reduce_mean(tf.square(y-pred))
optimizer=tf.train.GradientDescentOptimizer(learning_rate).minimize(loss_function)
sess=tf.Session()

3.4开始计算

init=tf.global_variables_initializer()
sess.run(init)
step=0#记录训练步数
loss_list=[]#保存loss值得列表
for epoch in range(train_epcohs):
    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)
    w_origin0=w0temp/sigma
    b_origin0=b0temp-w0temp*mean_value/sigma
    print(w0temp,b0temp)
    print(w_origin0,b_origin0)
    plt.plot(x_data*sigma+mean_value,w0temp*x_data+b0temp)

在这里插入图片描述

3.5预测

x_test=5.79
predict=sess.run(pred,feed_dict={x:(x_test-mean_value)/sigma})
print("预测值是:%f"%predict)
target=3.1234*x_test+2.98
print("目标值是:%f"%target)

在这里插入图片描述
保存图

writer=tf.summary.FileWriter(logdir,tf.get_default_graph())
writer.close()

3.6tensorboard

使用方法如下
在这里插入图片描述
可以放大看求梯度过程符合链式法则
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值