爆炸安利一个免费的在网易云课堂上的课程--深度学习应用开发TensorFlow实践https://mooc.study.163.com/course/2001396000
现在是2019年4月份可免费加入课程,进行学习。若时限太久过期勿怪
上一篇:Tensorflow入门一https://mooc.study.163.com/course/2001396000
下一篇:Tensorflow入门三-多变量线性回归(矩阵点乘叉乘转置Numpy,附练习数据集百度云资源)https://blog.csdn.net/qq_36187544/article/details/89477715
原理:机器学习(1)--单变量线性回归算法https://blog.csdn.net/qq_36187544/article/details/87866232
这里用tensorflow实现单变量线性回归。首先利用Numpy生成生成随机数
# 在Jupyter中,要加上这一句才能正确显示
%matplotlib inline
import matplotlib.pyplot as plt
import numpy as np
#设置随机数种子,设置一样的话生成的随机数基本相同
np.random.seed(5)
#采用np生成等差数列,生成100点,取值[-1,1]
x_data = np.linspace(-1,1,100)
#y=2x+1+噪声,噪声维度要保持一致
#注:np.random.randn是生成正态分布的数据,x_data.shape是一个表示元组,而加*和**表示可拆包,这里拆成实参,这里等同于np.random.randn(100)
y_data = 2 * x_data+1.0+np.random.randn(*x_data.shape)*0.4
#画散点图
plt.scatter(x_data,y_data)
#画直线
plt.plot(x_data,2*x_data+1.0,color='red')
利用数据流的Tensorflow构建线性模型,导入tensorflow速度会偏慢,要等一下:
'''
单变量线性回归
'''
%matplotlib inline
import matplotlib.pyplot as plt
import numpy as np
import tensorflow as tf
#生成随机数据
np.random.seed(5)
x_data = np.linspace(-1,1,100)
y_data = 2 * x_data+1.0+np.random.randn(*x_data.shape)*0.4
plt.scatter(x_data,y_data)
train_epochs = 100
learning_rate = 0.01
w = tf.Variable(1.0,name='w0')
b = tf.Variable(0.0,name='b0')
#定义训练数据占位符
x = tf.placeholder("float",name='x')
y = tf.placeholder("float",name='y')
#定义模型函数
def model(x,w,b):
return tf.multiply(w,x)+b
#pred为预测值,向前计算
pred = model(x,w,b)
#初始化
sess = tf.Session()
init = tf.global_variables_initializer()
sess.run(init)
#采用均方差损失函数,square为平方,reduce_mean为求均值,y为实际数值,pred为预测即使用f(x)=wx+b计算的值
loss_function = tf.reduce_mean(tf.square(y-pred))
#梯度下降优化器,以前自己写写的又多还垃圾,GradientDescentOptimizer为梯度下降优化器,minimize为求最小值
optimizer = tf.train.GradientDescentOptimizer(learning_rate).minimize(loss_function)
#训练,迭代次数为epoch,采用SGD随机梯度下降
for epoch in range(train_epochs):
for xs,ys in zip(x_data,y_data):#zip表示每次取一组对应x,y数据来使用,因为x_data形同[1,2,4,5,6,...]很多数据
_,loss = sess.run([optimizer,loss_function],feed_dict={x:xs,y:ys})
b0temp = b.eval(session = sess)
w0temp = w.eval(session = sess)
#plt.plot(x_data,w0temp*x_data+b0temp)#这句话可生成多个过程中所有回归直线
plt.plot(x_data,sess.run(w)*x_data+sess.run(b))
#预测
x_test = 3.21
predict = sess.run(w) * x_test + sess.run(b) #等价于 predict = sess.run(pred,feed_dict={x:x_test})
print("预测值为:%f"% predict+"\n目标值是:%f"%(2*x_test+1))
tensorflow搭建模型的一般步骤:
需要额外说明下损失函数,记录训练步数,损失函数值和显示间隔,输出显示下损失函数,大部分代码与上面相同,多的地方加了注释说明:
'''
单变量线性回归损失函数
'''
%matplotlib inline
import matplotlib.pyplot as plt
import numpy as np
import tensorflow as tf
x_data = np.linspace(-1,1,100)
y_data = 2 * x_data+1.0+np.random.randn(*x_data.shape)*0.4
plt.scatter(x_data,y_data)
train_epochs = 100
learning_rate = 0.01
w = tf.Variable(1.0,name='w0')
b = tf.Variable(0.0,name='b0')
x = tf.placeholder("float",name='x')
y = tf.placeholder("float",name='y')
def model(x,w,b):
return tf.multiply(w,x)+b
pred = model(x,w,b)
sess = tf.Session()
init = tf.global_variables_initializer()
sess.run(init)
loss_function = tf.reduce_mean(tf.square(y-pred))
optimizer = tf.train.GradientDescentOptimizer(learning_rate).minimize(loss_function)
#更新的地方:
step = 0 # 记录训练步数
loss_list = [] #记录损失函数值
display_step = 200
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,display_step控制报告粒度,如果display_step=2即为每两个样本输出一次损失值
loss_list.append(loss)
step += 1
if step % display_step == 0:
print("迭代次数:%02d"%(epoch+1),"step:%03d"%(step),"loss={:.9f}".format(loss))
b0temp = b.eval(session = sess)
w0temp = w.eval(session = sess)
plt.plot(x_data,sess.run(w)*x_data+sess.run(b))
x_test = 3.21
predict = sess.run(w) * x_test + sess.run(b)
print("预测值为:%f"% predict+"\n目标值是:%f"%(2*x_test+1))