TensorFlow线性回归模型构建:从基础套路到梯度下降实战优化
本文深入解析TensorFlow构建线性回归模型的完整流程,涵盖图结构定义、误差函数设置及优化器选择。重点探讨批量梯度下降中平方误差导致参数发散的问题,对比随机梯度下降的震荡与收敛速度,并引入Mini-batch折中方案。结合代码示例,详细阐述Session机制、占位符传递及Epoch概念,帮助开发者优化模型训练效果。
利用TensorFlow构建线性回归模型是入门该框架的经典案例,尽管官方示例存在一定局限性,但在实际调试过程中,通过进行针对性改进并总结相关经验,可以更有效地掌握模型构建技巧。
首先,梳理使用TensorFlow构建机器学习模型的整体逻辑框架。
第一步,定义模型的整体计算图结构。对于未知的输入数据,通常使用占位符(placeholder)进行替代,以预留输入接口。
第二步,定义预测结果与真实目标之间的误差函数,用于量化模型预测的偏差。
第三步,选择合适的优化算法,通过最小化误差函数来更新模型参数。
此外,在构建过程中还有几个关键点需要特别注意:
1. 使用TensorFlow构建模型时,首要步骤是通过代码搭建计算图。此时计算图处于静态定义阶段,不会执行任何实际运算,必须依赖Session(会话)来驱动执行。
2. 第二步需根据具体问题的需求构建相应的误差函数,该函数即为需要被优化的目标函数。
3. 调用合适的优化器对误差函数进行优化。值得注意的是,反向传播过程中调整参数的具体操作被封装在计算图内部,并未以显式代码形式直接呈现。
4. TensorFlow的名称意为“张量流动”,这包含两层含义:一是参与运算的数据不仅是标量或矩阵,还可以是高维张量;二是这些数据在计算图中流动并不断更新状态。
5. 在Session的run函数中,系统会按照传入的操作向上回溯查找,凡是操作中涉及的变量和常量都会参与运算;而对于占位符,则必须在run执行过程中以字典形式传入具体数据。
基于上述对TensorFlow基本机制的理解,接下来深入探讨关于梯度下降算法的新见解。
1. 梯度下降法主要分为批量梯度下降(Batch Gradient Descent)和随机梯度下降(Stochastic Gradient Descent)。批量梯度下降利用所有数据计算误差函数,并据此更新模型参数。实际调试发现,若定义误差函数为平方误差,该值极易迅速增大(即“飞掉”)。原因在于批量累加的平方误差数值巨大,若此时学习率设置过高,参数调整幅度过大,会导致模型参数向单一方向剧烈变化,最终造成结果发散。因此,这种情况下必须降低学习率,以减缓参数变化的速度。
2. 随机梯度下降法每次仅使用一个数据样本来计算误差函数并更新模型参数。这种方法可能导致结果出现震荡现象。此外,由于需要逐个取出数据参与运算,无法像批量计算那样利用广播或向量化乘法机制,导致收敛速度较慢。然而,其优势在于无需每次计算全部数据的梯度,因此在整体速度上通常优于批量梯度下降。一种较为折中的方案是Mini-batch(小批量)梯度下降,即每次选取一小部分数据进行梯度更新,这也是目前最为常用的方法。
3. 关于Epoch的概念:当所有样本集完整遍历一轮时,称为一个Epoch。显然,在严格的随机梯度下降法中,一个Epoch内参数更新的次数等于样本数量;而在批量梯度下降法中,一个Epoch仅更新一次参数。
以上为个人在实践中的几点体会,若读者发现文中存在不当之处,恳请批评指正,不胜感激。
#encoding=utf-8
__author__ = 'freedom'
import tensorflow as tf
import numpy as np
def createData(dataNum,w,b,sigma):
train_x = np.arange(dataNum)
train_y = w*train_x+b+np.random.randn()*sigma
#print train_x
#print train_y
return train_x,train_y
def linerRegression(train_x,train_y,epoch=100000,rate = 0.000001):
train_x = np.array(train_x)
train_y = np.array(train_y)
n = train_x.shape[0]
x = tf.placeholder("float")
y = tf.placeholder("float")
w = tf.Variable(tf.random_normal([1])) # 生成随机权重
b = tf.Variable(tf.random_normal([1]))
pred = tf.add(tf.mul(x,w),b)
loss = tf.reduce_sum(tf.pow(pred-y,2))
optimizer = tf.train.GradientDescentOptimizer(rate).minimize(loss)
init = tf.initialize_all_variables()
sess = tf.Session()
sess.run(init)
print 'w start is ',sess.run(w)
print 'b start is ',sess.run(b)
for index in range(epoch):
#for tx,ty in zip(train_x,train_y):
#sess.run(optimizer,{x:tx,y:ty})
sess.run(optimizer,{x:train_x,y:train_y})
# print 'w is ',sess.run(w)
# print 'b is ',sess.run(b)
# print 'pred is ',sess.run(pred,{x:train_x})
# print 'loss is ',sess.run(loss,{x:train_x,y:train_y})
#print '------------------'
print 'loss is ',sess.run(loss,{x:train_x,y:train_y})
w = sess.run(w)
b = sess.run(b)
return w,b
def predictionTest(test_x,test_y,w,b):
W = tf.placeholder(tf.float32)
B = tf.placeholder(tf.float32)
X = tf.placeholder(tf.float32)
Y = tf.placeholder(tf.float32)
n = test_x.shape[0]
pred = tf.add(tf.mul(X,W),B)
loss = tf.reduce_mean(tf.pow(pred-Y,2))
sess = tf.Session()
loss = sess.run(loss,{X:test_x,Y:test_y,W:w,B:b})
return loss
if __name__ == "__main__":
train_x,train_y = createData(50,2.0,7.0,1.0)
test_x,test_y = createData(20,2.0,7.0,1.0)
w,b = linerRegression(train_x,train_y)
print 'weights',w
print 'bias',b
loss = predictionTest(test_x,test_y,w,b)
print loss
以上就是本文的全部内容,希望对各位的学习有所帮助,也欢迎大家继续支持本站。
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













