附上github的源代碼地址:https://github.com/w1449550206/Linear-regression-with-tensorflow.git
文章目錄
1.線性迴歸的介紹
根據訓練數據,訓練一個w1x1+w2x2+…+b = y,有多少個特徵,就有多少個權重
2.訓練數據的獲取
假設隨機的一百個點,且只有一個特徵,y = wx+b
特徵值:訓練數據100個樣本,100行1列[100, 1]
目標值:y = 0.8*x+0.7 (造數據用的,一開始是不知道的)
3.步驟分析
- 1.準備好數據集,我們製造y=0.8x+0.7的100個樣本
- 2.建立線性模型,隨機初始化w1和b1,y=wx+b,目標求出權重w和偏置b (比如我們隨機一個w爲0.2,b爲0.7,和我們假設已經知道的0.8和0.7差很遠,所以接下來要確定損失函數,然後梯度下降優化來找到損失最小的w和b)
- 3.確定損失函數(預測值與真實值之間的誤差),即均方誤差
- 4.梯度下降優化損失:需要制定學習率(超參數)
4.相關的API
運算
矩陣運算
tf.matmul(x,w)
平方
tf.square(error)
均值
tf.reduce_mean(error)
誤差
error = tf.reduce_mean(tf.square(y_predict - y_true))
梯度下降優化
tf.train.GradientDescentOptimizer(learning_rate)
- learing_rate是學習率,一般爲0-1之間比較小的值
- method: minimize(loss)損失優化
- return: 梯度下降op
返回一個節點操作:
optimizer = tf.train.GradientDescentOptimizer(learning_rate = 0.01).minimize(error)
5.完整代碼
1.準備好數據集,我們製造y=0.8x+0.7的100個樣本
# 特徵值x,目標值y_true
x = tf.random_normal(shape=(100, 1), mean=2, stddev=2)
y_true = tf.matmul(x,[[0.8]])+0.7
2.建立線性模型,目標:求出權重W和偏置b
y = W·X + b
3.隨機初始化w1和b1
w_ran =tf.Variable(initial_value=tf.random_normal(shape = (1,1)))
b_ran = tf.Variable(initial_value=tf.random_normal(shape=(1,1)))
y_predict = tf.matmul(x,w_ran)+b_ran
4.確定損失函數(預測值與真實值之間的誤差)即均方誤差
error = tf.reduce_mean(tf.square(y_predict - y_true))
5.梯度下降優化損失:需要制定學習率(超參數)
optimizer = tf.train.GradientDescentOptimizer(learning_rate = 0.01).minimize(error)
6.初始化變量
init = tf.global_variables_initializer()
7.開啓會話進行訓練
with tf.Session() as sess:
#運行初始化變量op
sess.run(init)
print("隨機初始化的權重爲%f, 偏置爲%f" % (w_ran.eval(), b_ran.eval()))
# 訓練模型
for i in range(100):
sess.run(optimizer)
print("第%d步的誤差爲%f,權重爲%f, 偏置爲%f" % (i, error.eval(), w_ran.eval(), b_ran.eval()))
8.完整代碼
import tensorflow as tf
def linear_regression():
'''
# - 1.準備好數據集,我們製造y=0.8x+0.7的100個樣本
# - 2.建立線性模型,隨機初始化w1和b1,y=wx+b,目標求出權重w和偏置b ==(比如我們隨機一個w爲0.2,b爲0.7,和我們假設已經知道的0.8和0.7差很遠,所以接下來要確定損失函數,然後梯度下降優化來找到損失最小的w和b)==
# - 3.確定損失函數(預測值與真實值之間的誤差),即均方誤差
# - 4.梯度下降優化損失:需要制定學習率(超參數)
:return:
'''
# - 1.準備好數據集,我們製造y=0.8x+0.7的100個樣本
# 特徵值x,目標值y_true
x = tf.random_normal(shape=(100, 1), mean=2, stddev=2)
y_true = tf.matmul(x, [[0.8]]) + 0.7
## 2.建立線性模型,目標:求出權重W和偏置b
# y = W·X + b
## 3.隨機初始化w1和b1
w_ran = tf.Variable(initial_value=tf.random_normal(shape=(1, 1)))
b_ran = tf.Variable(initial_value=tf.random_normal(shape=(1, 1)))
y_predict = tf.matmul(x, w_ran) + b_ran
## 4.確定損失函數(預測值與真實值之間的誤差)即均方誤差
error = tf.reduce_mean(tf.square(y_predict - y_true))
## 5.梯度下降優化損失:需要制定學習率(超參數)
optimizer = tf.train.GradientDescentOptimizer(learning_rate=0.01).minimize(error)
# 初始化變量
init = tf.global_variables_initializer()
# 至此整張圖就好了
# 開啓會話進行訓練
with tf.Session() as sess:
# 運行初始化變量op
sess.run(init)
print("隨機初始化的權重爲%f, 偏置爲%f" % (w_ran.eval(), b_ran.eval()))
# 訓練模型
for i in range(2000):
sess.run(optimizer)
print("第%d步的誤差爲%f,權重爲%f, 偏置爲%f" % (i, error.eval(), w_ran.eval(), b_ran.eval()))
if __name__ == '__main__':
linear_regression()
6變量的trainable設置觀察
trainable的參數作用,指定是否訓練
weight = tf.Variable(tf.random_normal([1, 1], mean=0.0, stddev=1.0), name="weights", trainable=False)
還有一些更加複雜的功能進行優化可以進入另一篇博文中查看:https://blog.csdn.net/qq_35456045/article/details/104687223