在本节,我们用tensorflow实现一个简单的线性回归
我们首先把这个过程分为三步:算法,线性回归 ;
策略 , 均方误差;
优化 , 梯度下降
1.准备好特征值和目标值(这里取一个特征值x,有100个样本)
2.建立模型(准备一个w和b) , y_predict = w x +b ,这里的w,b必须随机初始化
3.求损失函数,((y1-y1’)^2+…+ ( y100-y100’) ^2)/100
4.梯度下降,这是优化的方法(tennsorflowz中有,只需要自己指定学习率)
下面我们介绍下需要用到的api:
矩阵计算:tf.matmul(x,w)
平方:tf.square(error)
均值:tf.reduce_mean(error)
梯度下降:tf.train.GradientDecentOptimizer(learning_rate) 最小化损失,返回一个梯度下降的op
在上述第二步中,模型的参数,w,b必须用变量定义,不能用张量,因为变量是默认在训练过程中不断变化的
在编程的时候,尽量用矩阵相乘,别用遍历,这样速度太慢。
def my_regression():
#1.准备数据,特征值x, [100,1],目标值y,[100]
#这里x用张量定义,
x=tf.random_normal([100,1] , mean=1.75, stddev=0.5,name=“x_data”)
y_true=tf.matmul(x , [[0.7]])+0.8 #这里是矩阵相乘,必须是2维德,不能直接写0.7
#2.建立线性回归模型,1个w,1个bias,随机初始化,开始计算
weight=tf.Variable(tf.random_normal([1,1] , mean=0.0 , stddev=1.0) , name=“w”) #这个权重值是要在训练过程中不断变化的,所以要用变量定义
bias=tf.Variable(0.0 , name=“b”)
y_predict=tf.matmul(x,weigh)+bias
#3.建立损失函数,均方误差
loss=tf.reduce_mean(tf.square(y_true-y_predict))
#4.优化,梯度下降
train_op=tf.train.GradientDescentOptimizer(0.12).minimize(loss)
#通过会话运行程序
with tf.Session() as sess:
#初始化运行
sess.run(init_op)
#打印最初随机初始化的权重和偏置
print(“随机初始化参数权重为: %f,偏置为: %f” %(weeigh.eval() , bias.eval()))
#运行优化
sess.run(train_op)
for i in range(500):
sess.run(train_op)
print("第"+i+"次参数权重为: %f , 偏置为:%f" %(weigh.eval() , bias.eval()))
#想要看这个程序的图,
filewrite = tf.summary.FileWriter("./tmp....",graph=sess.graph)
return None
if name == “main”:
my_regression()
tf.Variable()中有个trainable参数,为True,保证变量在训练时是可变的
在tensorflow中还有作用域的概念: tf.variable_scope(" 在tensorboard显示的name ")
我们把上文中步骤1的代码放入,这样graph会用作用域封装,使得图的结构更加清晰,当我们要在tensorboard中添加权重和损失值以便观察其情况
我们要在会话启动前收集变量,合并变量写入事件文件中(这样才能在浏览器中看到)
eg: tf.summary.scalar(“loss”, loss) #前者是显示名字,后者是收集来的变量
merged = tf.summary.merge_all() #合并变量
在会话后的循环训练中加入
summary = sess.run(merged) #每次训练都运行变量的收集
filewriter.add_summary(summary, i )
当我们为了1防止模型文件在训练过程中被意外损坏,我们需要在训练的同时间隔性保存模型文件,模型文件叫checkpoint文件
文件的保存:
#在会话前先定义op,
saver=tf. train.Saver()
#在会话的循环训练中(或后,看你想保存几次),写入
saver.save(sess."./tmp…")
文件的加载:
在循环训练前写入加载模型,覆盖随机参数,这样就可以从上次结束的地方开始训练
if os.path.exis("./tmp…"): #先判断这个文件是否存在
saver.restore(sess,"./tmp…") #加载
最后是自定义命令行参数:1.首先定义有哪些参数需要在运行时后指定。2.在程序当中获取定义命令行参数
定义:tf.app.flags.DEFINE_integer(“max_step” , 100 , “模型训练的步数”) #参数依次是 名字,默认值,说明
tf.app.flags.DEFINE_string(“model_dir” , " " , “模型加载路径”) # " "表示暂时是空的,等待添加
FLAGS=tf.app.FLAGS #获取上面两个命令行参数的名字
这样在循环训练处写入:
for i in range(FLAGS , max_step):
在上文的加载路径处写入:
saver.restore(sess.FLAGS.model_dir)
通过tf.app.run() 启动main(argv) 函数