一、我们要做什么?
简单问题:如何让机器学会不通过明确的数学公式,输入任意值,输出他的3倍?
我们需要做什么:我们需要让计算机从一组看似混乱的数据中总结出 输出 约等于 3 倍 输入 的规律。
二、我们要怎么做?
一般机器学习分为四个步骤:
- 准备数据
- 搭建模型
- 迭代训练
- 使用模型
准备数据阶段我们会收集和任务有关的数据,然后我们会搭建神经网络模型,通过一定的迭代训练让神经网络学习到数据的特征,从而得到相关规律,形成可用的模型,最后我们使用模型来解决问题。
三、逐步尝试:
1、准备数据:
我们这里 y = 3x 来做为数据模拟的主体,加入噪声来让‘等号‘变成‘约等于‘,来组成 y = 3x + b
import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt
train_X = np.linspace(-1,1,100) #从 [-1.1] 取 100个值 给 train_X
train_Y = 3 * train_X + np.random.randn(100) * 0.3 # 模拟 y = 3 * x + b 利用 np 模拟噪声b
#显示模拟数据点
plt.plot(train_X,train_Y,'ro',label="Original data") #设置图像参数 样式:“ro”就是红色的圆圈
plt.legend() #绘制图例
plt.show() #显示
2、搭建模型:
搭建神经网络能可视化的画出来是能最清晰的,不管是以后的实际项目还是现在的学习都是。
tensorflow其实就是在构建一幅计算图。
计算图:
基本公式:
y = w*x + b (其中w,x均为向量)
w:权重
b:偏置
神经网络在训练的过程中的数据流有2个方向,即先通过正向神经网络生成一个结果,然后与真实值进行比较,再通反向神经网络将神经网络的参数进行调整,再通过正向生成结果,然后反向进行调整,一直循环往复,直到将神经网络的参数调整到合适的值为止。
- 创建正向模型
正向模型简单来说就是 输入 通过 神经网络 得到 输出
# 占位符 , 用于构建计算图
X = tf.placeholder("float")
Y = tf.placeholder("float")
#设置模型变量
w = tf.Variable(tf.random_normal([1]),name="weight")
b = tf.Variable(tf.random_normal([1]),name="bias")
#定义前向结构
z = tf.multiply(X,w) + b
- 创建反向模型
先通过正向神经网络生成一个结果,然后与真实值进行比较,再通反向神经网络将神经网络的参数进行调整。
cost = tf.reduce_mean(tf.square(Y-z)) #计算真实值与实际值的平方查
learning_rate = 0.01 #设置学习率
optimizer = tf.train.GradientDescentOptimizer(learning_rate).minimize(cost) #设置梯度下降优化
学习率:代表调整参数的速度,一般小于 1
3、迭代训练模型
建立好模型后,我们就要通过迭代来训练模型。在Tensorflow中,是通过 会话 session 来进行的。
一般先进行全局初始化,然后设置训练次数迭代,启动session开始执行训练任务。
#设置初始化所有变量
init = tf.global_variables_initializer()
#定义参数
training_epochs = 200
display_step = 2
with tf.Session() as sess:
sess.run(init) #进行初始化
plodata = {"batchsize":[],"loss":[]} #定义字典 存放 批次值 和 损失值
for epoth in range(training_epochs) :
for (x,y) in zip(train_X,train_Y):
sess.run(optimizer,feed_dict={X:x,Y:y})
#显示训练中的详细信息
if epoth % display_step == 0 : #每运行2次
loss = sess.run(cost,feed_dict={X:x,Y:y}) #使用feed 放入数据形成数据流
print("Epoch:",epoth+1,"cost:",loss,"w=",sess.run(w),"b=",sess.run(b)) #打印 相关信息
if not (loss == "NA"): # 将有效信息放入 plodata
plodata["batchsize"].append(epoth)
plodata["loss"].append(loss)
print("Finished !")
print("coss=",sess.run(cost,feed_dict={X:train_X,Y:train_Y}),"w=",sess.run(w),"b=",sess.run(b)) #训练完成显示最近一次计算结果
4、模型使用:
模型训练好后,我们就需要进行测试使用
x= 0.5 #测试输入值
print("x=",x,"y_=",sess.run(z,feed_dict={X:x}))
5、模型训练可视化:
后面章节直接讲 TensorBoard
四、完整代码展示:
import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt
train_X = np.linspace(-1,1,100) #从 [-1.1] 取 100个值 给 train_X
train_Y = 3 * train_X + np.random.randn(100) * 0.3 # 模拟 y = 3 * x + b 利用 np 模拟噪声b
# #显示模拟数据点
# plt.plot(train_X,train_Y,'ro',label="Original data") #设置图像参数 样式:“ro”就是红色的圆圈
# plt.legend() #绘制图例
# plt.show() #显示
# 占位符 , 用于构建计算图
X = tf.placeholder("float")
Y = tf.placeholder("float")
#设置模型变量
w = tf.Variable(tf.random_normal([1]),name="weight")
b = tf.Variable(tf.random_normal([1]),name="bias")
#定义前向结构
z = tf.multiply(X,w) + b
cost = tf.reduce_mean(tf.square(Y-z)) #计算真实值与实际值的平方差 作为 损失值 loss
learning_rate = 0.01 #设置学习率
optimizer = tf.train.GradientDescentOptimizer(learning_rate).minimize(cost) #设置梯度下降优化
#设置初始化所有变量
init = tf.global_variables_initializer()
#定义参数
training_epochs = 20
display_step = 2
with tf.Session() as sess:
sess.run(init) #进行初始化
plodata = {"batchsize":[],"loss":[]} #定义字典 存放 批次值 和 损失值
for epoth in range(training_epochs) :
for (x,y) in zip(train_X,train_Y):
sess.run(optimizer,feed_dict={X:x,Y:y})#显示训练中的详细信息
if epoth % display_step == 0 : #每运行2次
loss = sess.run(cost,feed_dict={X:x,Y:y}) #使用feed 放入数据形成数据流
print("Epoch:",epoth+1,"cost:",loss,"w=",sess.run(w),"b=",sess.run(b)) #打印 相关信息
if not (loss == "NA"): # 将有效信息放入 plodata
plodata["batchsize"].append(epoth)
plodata["loss"].append(loss)
print("Finished !")
print("coss=",sess.run(cost,feed_dict={X:x,Y:y}),"w=",sess.run(w),"b=",sess.run(b)) #训练完成显示最近一次计算结果
练习题4:
利用神经网络的方法,向神经网络程序输入 3 程序大约返回 15 ,要求训练的时候加入噪声等,并且具有神经网络的基本步骤。
评论出你的答案。