本系列文章md筆記(已分享)主要討論深度學(xué)習(xí)相關(guān)知識(shí)??梢宰尨蠹沂炀氄莆諜C(jī)器學(xué)習(xí)基礎(chǔ),如分類、回歸(含代碼),熟練掌握numpy,pandas,sklearn等框架使用。在算法上,掌握神經(jīng)網(wǎng)絡(luò)的數(shù)學(xué)原理,手動(dòng)實(shí)現(xiàn)簡(jiǎn)單的神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu),在應(yīng)用上熟練掌握TensorFlow框架使用,掌握神經(jīng)網(wǎng)絡(luò)圖像相關(guān)案例。具體包括:TensorFlow的數(shù)據(jù)流圖結(jié)構(gòu),神經(jīng)網(wǎng)絡(luò)與tf.keras,卷積神經(jīng)網(wǎng)絡(luò)(CNN),商品物體檢測(cè)項(xiàng)目介紹,YOLO與SSD,商品檢測(cè)數(shù)據(jù)集訓(xùn)練和模型導(dǎo)出與部署。
全套筆記和代碼自取移步gitee倉(cāng)庫(kù): gitee倉(cāng)庫(kù)獲取完整文檔和代碼
感興趣的小伙伴可以自取哦,歡迎大家點(diǎn)贊轉(zhuǎn)發(fā)~
共 9 章,60 子模塊
TensorFlow介紹
說(shuō)明TensorFlow的數(shù)據(jù)流圖結(jié)構(gòu)
應(yīng)用TensorFlow操作圖
說(shuō)明會(huì)話在TensorFlow程序中的作用
應(yīng)用TensorFlow實(shí)現(xiàn)張量的創(chuàng)建、形狀類型修改操作
應(yīng)用Variable實(shí)現(xiàn)變量op的創(chuàng)建
應(yīng)用Tensorboard實(shí)現(xiàn)圖結(jié)構(gòu)以及張量值的顯示
應(yīng)用tf.train.saver實(shí)現(xiàn)TensorFlow的模型保存以及加載
應(yīng)用tf.app.flags實(shí)現(xiàn)命令行參數(shù)添加和使用
應(yīng)用TensorFlow實(shí)現(xiàn)線性回歸
2.7 案例:實(shí)現(xiàn)線性回歸
學(xué)習(xí)目標(biāo)
-
目標(biāo)
- 應(yīng)用op的name參數(shù)實(shí)現(xiàn)op的名字修改
- 應(yīng)用variable_scope實(shí)現(xiàn)圖程序作用域的添加
- 應(yīng)用scalar或histogram實(shí)現(xiàn)張量值的跟蹤顯示
- 應(yīng)用merge_all實(shí)現(xiàn)張量值的合并
- 應(yīng)用add_summary實(shí)現(xiàn)張量值寫(xiě)入文件
- 應(yīng)用tf.train.saver實(shí)現(xiàn)TensorFlow的模型保存以及加載
- 應(yīng)用tf.app.flags實(shí)現(xiàn)命令行參數(shù)添加和使用
- 應(yīng)用reduce_mean、square實(shí)現(xiàn)均方誤差計(jì)算
- 應(yīng)用tf.train.GradientDescentOptimizer實(shí)現(xiàn)有梯度下降優(yōu)化器創(chuàng)建
- 應(yīng)用minimize函數(shù)優(yōu)化損失
- 知道梯度爆炸以及常見(jiàn)解決技巧
-
應(yīng)用
- 實(shí)現(xiàn)線性回歸模型
-
內(nèi)容預(yù)覽
-
2.7.1 線性回歸原理復(fù)習(xí)
-
2.7.2 案例:實(shí)現(xiàn)線性回歸的訓(xùn)練
-
2.7.3 增加其他功能
- 1 增加變量顯示
- 2 增加命名空間
- 3 模型的保存與加載
- 4 命令行參數(shù)使用
-
2.7.1 線性回歸原理復(fù)習(xí)
根據(jù)數(shù)據(jù)建立回歸模型,w1x1+w2x2+…..+b = y,通過(guò)真實(shí)值與預(yù)測(cè)值之間建立誤差,使用梯度下降優(yōu)化得到損失最小對(duì)應(yīng)的權(quán)重和偏置。最終確定模型的權(quán)重和偏置參數(shù)。最后可以用這些參數(shù)進(jìn)行預(yù)測(cè)。
2.7.2 案例:實(shí)現(xiàn)線性回歸的訓(xùn)練
1 案例確定
- 假設(shè)隨機(jī)指定100個(gè)點(diǎn),只有一個(gè)特征
- 數(shù)據(jù)本身的分布為 y = 0.8 * x + 0.7
這里將數(shù)據(jù)分布的規(guī)律確定,是為了使我們訓(xùn)練出的參數(shù)跟真實(shí)的參數(shù)(即0.8和0.7)比較是否訓(xùn)練準(zhǔn)確
2 API
運(yùn)算
-
矩陣運(yùn)算
- tf.matmul(x, w)
-
平方
- tf.square(error)
-
均值
- tf.reduce_mean(error)
梯度下降優(yōu)化
-
tf.train.GradientDescentOptimizer(learning_rate)
-
梯度下降優(yōu)化
-
learning_rate:學(xué)習(xí)率,一般為0~1之間比較小的值
-
method:
- minimize(loss)
-
return:梯度下降op
-
3 步驟分析
-
1 準(zhǔn)備好數(shù)據(jù)集:y = 0.8x + 0.7 100個(gè)樣本
-
2 建立線性模型
- 隨機(jī)初始化W1和b1
- y = W·X + b,目標(biāo):求出權(quán)重W和偏置b
-
3 確定損失函數(shù)(預(yù)測(cè)值與真實(shí)值之間的誤差)-均方誤差
-
4 梯度下降優(yōu)化損失:需要指定學(xué)習(xí)率(超參數(shù))
4 實(shí)現(xiàn)完整功能
import tensorflow as tf
import os
def linear_regression():
"""
自實(shí)現(xiàn)線性回歸
:return: None
"""
# 1)準(zhǔn)備好數(shù)據(jù)集:y = 0.8x + 0.7 100個(gè)樣本
# 特征值X, 目標(biāo)值y_true
X = tf.random_normal(shape=(100, 1), mean=2, stddev=2)
# y_true [100, 1]
# 矩陣運(yùn)算 X(100, 1)* (1, 1)= y_true(100, 1)
y_true = tf.matmul(X, [[0.8]]) + 0.7
# 2)建立線性模型:
# y = W·X + b,目標(biāo):求出權(quán)重W和偏置b
# 3)隨機(jī)初始化W1和b1
weights = tf.Variable(initial_value=tf.random_normal(shape=(1, 1)))
bias = tf.Variable(initial_value=tf.random_normal(shape=(1, 1)))
y_predict = tf.matmul(X, weights) + bias
# 4)確定損失函數(shù)(預(yù)測(cè)值與真實(shí)值之間的誤差)-均方誤差
error = tf.reduce_mean(tf.square(y_predict - y_true))
# 5)梯度下降優(yōu)化損失:需要指定學(xué)習(xí)率(超參數(shù))
# W2 = W1 - 學(xué)習(xí)率*(方向)
# b2 = b1 - 學(xué)習(xí)率*(方向)
optimizer = tf.train.GradientDescentOptimizer(learning_rate=0.01).minimize(error)
# 初始化變量
init = tf.global_variables_initializer()
# 開(kāi)啟會(huì)話進(jìn)行訓(xùn)練
with tf.Session() as sess:
# 運(yùn)行初始化變量Op
sess.run(init)
print("隨機(jī)初始化的權(quán)重為%f, 偏置為%f" % (weights.eval(), bias.eval()))
# 訓(xùn)練模型
for i in range(100):
sess.run(optimizer)
print("第%d步的誤差為%f,權(quán)重為%f, 偏置為%f" % (i, error.eval(), weights.eval(), bias.eval()))
return None
6 變量的trainable設(shè)置觀察
trainable的參數(shù)作用,指定是否訓(xùn)練
weight = tf.Variable(tf.random_normal([1, 1], mean=0.0, stddev=1.0), name="weights", trainable=False)
2.7.3 增加其他功能
- 增加命名空間
- 命令行參數(shù)設(shè)置
2 增加命名空間
是代碼結(jié)構(gòu)更加清晰,Tensorboard圖結(jié)構(gòu)清楚
with tf.variable_scope("lr_model"):
def linear_regression():
# 1)準(zhǔn)備好數(shù)據(jù)集:y = 0.8x + 0.7 100個(gè)樣本
# 特征值X, 目標(biāo)值y_true
with tf.variable_scope("original_data"):
X = tf.random_normal(shape=(100, 1), mean=2, stddev=2, name="original_data_x")
# y_true [100, 1]
# 矩陣運(yùn)算 X(100, 1)* (1, 1)= y_true(100, 1)
y_true = tf.matmul(X, [[0.8]], name="original_matmul") + 0.7
# 2)建立線性模型:
# y = W·X + b,目標(biāo):求出權(quán)重W和偏置b
# 3)隨機(jī)初始化W1和b1
with tf.variable_scope("linear_model"):
weights = tf.Variable(initial_value=tf.random_normal(shape=(1, 1)), name="weights")
bias = tf.Variable(initial_value=tf.random_normal(shape=(1, 1)), name="bias")
y_predict = tf.matmul(X, weights, name="model_matmul") + bias
# 4)確定損失函數(shù)(預(yù)測(cè)值與真實(shí)值之間的誤差)-均方誤差
with tf.variable_scope("loss"):
error = tf.reduce_mean(tf.square(y_predict - y_true), name="error_op")
# 5)梯度下降優(yōu)化損失:需要指定學(xué)習(xí)率(超參數(shù))
# W2 = W1 - 學(xué)習(xí)率*(方向)
# b2 = b1 - 學(xué)習(xí)率*(方向)
with tf.variable_scope("gd_optimizer"):
optimizer = tf.train.GradientDescentOptimizer(learning_rate=0.01, name="optimizer").minimize(error)
# 2)收集變量
tf.summary.scalar("error", error)
tf.summary.histogram("weights", weights)
tf.summary.histogram("bias", bias)
# 3)合并變量
merge = tf.summary.merge_all()
# 初始化變量
init = tf.global_variables_initializer()
# 開(kāi)啟會(huì)話進(jìn)行訓(xùn)練
with tf.Session() as sess:
# 運(yùn)行初始化變量Op
sess.run(init)
print("隨機(jī)初始化的權(quán)重為%f, 偏置為%f" % (weights.eval(), bias.eval()))
# 1)創(chuàng)建事件文件
file_writer = tf.summary.FileWriter(logdir="./summary", graph=sess.graph)
# 訓(xùn)練模型
for i in range(100):
sess.run(optimizer)
print("第%d步的誤差為%f,權(quán)重為%f, 偏置為%f" % (i, error.eval(), weights.eval(), bias.eval()))
# 4)運(yùn)行合并變量op
summary = sess.run(merge)
file_writer.add_summary(summary, i)
return None
3 模型的保存與加載
-
tf.train.Saver(var_list=None,max_to_keep=5)
- 保存和加載模型(保存文件格式:checkpoint文件)
- var_list:指定將要保存和還原的變量。它可以作為一個(gè)dict或一個(gè)列表傳遞.
- max_to_keep:指示要保留的最近檢查點(diǎn)文件的最大數(shù)量。創(chuàng)建新文件時(shí),會(huì)刪除較舊的文件。如果無(wú)或0,則保留所有檢查點(diǎn)文件。默認(rèn)為5(即保留最新的5個(gè)檢查點(diǎn)文件。)
使用
例如:
指定目錄+模型名字
saver.save(sess, '/tmp/ckpt/test/myregression.ckpt')
saver.restore(sess, '/tmp/ckpt/test/myregression.ckpt')
如要判斷模型是否存在,直接指定目錄
checkpoint = tf.train.latest_checkpoint("./tmp/model/")
saver.restore(sess, checkpoint)
4 命令行參數(shù)使用
-
1、
-
2、 tf.app.flags.,在flags有一個(gè)FLAGS標(biāo)志,它在程序中可以調(diào)用到我們
前面具體定義的flag_name文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-832976.html
- 3、通過(guò)tf.app.run()啟動(dòng)main(argv)函數(shù)
# 定義一些常用的命令行參數(shù)
# 訓(xùn)練步數(shù)
tf.app.flags.DEFINE_integer("max_step", 0, "訓(xùn)練模型的步數(shù)")
# 定義模型的路徑
tf.app.flags.DEFINE_string("model_dir", " ", "模型保存的路徑+模型名字")
# 定義獲取命令行參數(shù)
FLAGS = tf.app.flags.FLAGS
# 開(kāi)啟訓(xùn)練
# 訓(xùn)練的步數(shù)(依據(jù)模型大小而定)
for i in range(FLAGS.max_step):
sess.run(train_op)
完整代碼
import tensorflow as tf
import os
tf.app.flags.DEFINE_string("model_path", "./linear_regression/", "模型保存的路徑和文件名")
FLAGS = tf.app.flags.FLAGS
def linear_regression():
# 1)準(zhǔn)備好數(shù)據(jù)集:y = 0.8x + 0.7 100個(gè)樣本
# 特征值X, 目標(biāo)值y_true
with tf.variable_scope("original_data"):
X = tf.random_normal(shape=(100, 1), mean=2, stddev=2, name="original_data_x")
# y_true [100, 1]
# 矩陣運(yùn)算 X(100, 1)* (1, 1)= y_true(100, 1)
y_true = tf.matmul(X, [[0.8]], name="original_matmul") + 0.7
# 2)建立線性模型:
# y = W·X + b,目標(biāo):求出權(quán)重W和偏置b
# 3)隨機(jī)初始化W1和b1
with tf.variable_scope("linear_model"):
weights = tf.Variable(initial_value=tf.random_normal(shape=(1, 1)), name="weights")
bias = tf.Variable(initial_value=tf.random_normal(shape=(1, 1)), name="bias")
y_predict = tf.matmul(X, weights, name="model_matmul") + bias
# 4)確定損失函數(shù)(預(yù)測(cè)值與真實(shí)值之間的誤差)-均方誤差
with tf.variable_scope("loss"):
error = tf.reduce_mean(tf.square(y_predict - y_true), name="error_op")
# 5)梯度下降優(yōu)化損失:需要指定學(xué)習(xí)率(超參數(shù))
# W2 = W1 - 學(xué)習(xí)率*(方向)
# b2 = b1 - 學(xué)習(xí)率*(方向)
with tf.variable_scope("gd_optimizer"):
optimizer = tf.train.GradientDescentOptimizer(learning_rate=0.01, name="optimizer").minimize(error)
# 2)收集變量
tf.summary.scalar("error", error)
tf.summary.histogram("weights", weights)
tf.summary.histogram("bias", bias)
# 3)合并變量
merge = tf.summary.merge_all()
# 初始化變量
init = tf.global_variables_initializer()
# 開(kāi)啟會(huì)話進(jìn)行訓(xùn)練
with tf.Session() as sess:
# 運(yùn)行初始化變量Op
sess.run(init)
# 未經(jīng)訓(xùn)練的權(quán)重和偏置
print("隨機(jī)初始化的權(quán)重為%f, 偏置為%f" % (weights.eval(), bias.eval()))
# 當(dāng)存在checkpoint文件,就加載模型
# 1)創(chuàng)建事件文件
file_writer = tf.summary.FileWriter(logdir="./summary", graph=sess.graph)
# 訓(xùn)練模型
for i in range(100):
sess.run(optimizer)
print("第%d步的誤差為%f,權(quán)重為%f, 偏置為%f" % (i, error.eval(), weights.eval(), bias.eval()))
# 4)運(yùn)行合并變量op
summary = sess.run(merge)
file_writer.add_summary(summary, i)
return None
def main(argv):
print("這是main函數(shù)")
print(argv)
print(FLAGS.model_path)
linear_regression()
if __name__ == "__main__":
tf.app.run()
作業(yè):將面向過(guò)程改為面向?qū)ο?/h3>
參考代碼文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-832976.html
# 用tensorflow自實(shí)現(xiàn)一個(gè)線性回歸案例
# 定義一些常用的命令行參數(shù)
# 訓(xùn)練步數(shù)
tf.app.flags.DEFINE_integer("max_step", 0, "訓(xùn)練模型的步數(shù)")
# 定義模型的路徑
tf.app.flags.DEFINE_string("model_dir", " ", "模型保存的路徑+模型名字")
FLAGS = tf.app.flags.FLAGS
class MyLinearRegression(object):
"""
自實(shí)現(xiàn)線性回歸
"""
def __init__(self):
pass
def inputs(self):
"""
獲取特征值目標(biāo)值數(shù)據(jù)數(shù)據(jù)
:return:
"""
x_data = tf.random_normal([100, 1], mean=1.0, stddev=1.0, name="x_data")
y_true = tf.matmul(x_data, [[0.7]]) + 0.8
return x_data, y_true
def inference(self, feature):
"""
根據(jù)輸入數(shù)據(jù)建立模型
:param feature:
:param label:
:return:
"""
with tf.variable_scope("linea_model"):
# 2、建立回歸模型,分析別人的數(shù)據(jù)的特征數(shù)量--->權(quán)重?cái)?shù)量, 偏置b
# 由于有梯度下降算法優(yōu)化,所以一開(kāi)始給隨機(jī)的參數(shù),權(quán)重和偏置
# 被優(yōu)化的參數(shù),必須得使用變量op去定義
# 變量初始化權(quán)重和偏置
# weight 2維[1, 1] bias [1]
# 變量op當(dāng)中會(huì)有trainable參數(shù)決定是否訓(xùn)練
self.weight = tf.Variable(tf.random_normal([1, 1], mean=0.0, stddev=1.0),
name="weights")
self.bias = tf.Variable(0.0, name='biases')
# 建立回歸公式去得出預(yù)測(cè)結(jié)果
y_predict = tf.matmul(feature, self.weight) + self.bias
return y_predict
def loss(self, y_true, y_predict):
"""
目標(biāo)值和真實(shí)值計(jì)算損失
:return: loss
"""
# 3、求出我們模型跟真實(shí)數(shù)據(jù)之間的損失
# 均方誤差公式
loss = tf.reduce_mean(tf.square(y_true - y_predict))
return loss
def merge_summary(self, loss):
# 1、收集張量的值
tf.summary.scalar("losses", loss)
tf.summary.histogram("w", self.weight)
tf.summary.histogram('b', self.bias)
# 2、合并變量
merged = tf.summary.merge_all()
return merged
def sgd_op(self, loss):
"""
獲取訓(xùn)練OP
:return:
"""
# 4、使用梯度下降優(yōu)化器優(yōu)化
# 填充學(xué)習(xí)率:0 ~ 1 學(xué)習(xí)率是非常小,
# 學(xué)習(xí)率大小決定你到達(dá)損失一個(gè)步數(shù)多少
# 最小化損失
train_op = tf.train.GradientDescentOptimizer(0.1).minimize(loss)
return train_op
def train(self):
"""
訓(xùn)練模型
:param loss:
:return:
"""
g = tf.get_default_graph()
with g.as_default():
x_data, y_true = self.inputs()
y_predict = self.inference(x_data)
loss = self.loss(y_true, y_predict)
train_op = self.sgd_op(loss)
# 收集觀察的結(jié)果值
merged = self.merge_summary(loss)
saver = tf.train.Saver()
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
# 在沒(méi)訓(xùn)練,模型的參數(shù)值
print("初始化的權(quán)重:%f, 偏置:%f" % (self.weight.eval(), self.bias.eval()))
# 開(kāi)啟訓(xùn)練
# 訓(xùn)練的步數(shù)(依據(jù)模型大小而定)
for i in range(FLAGS.max_step):
sess.run(train_op)
# 生成事件文件,觀察圖結(jié)構(gòu)
file_writer = tf.summary.FileWriter("./tmp/summary/", graph=sess.graph)
print("訓(xùn)練第%d步之后的損失:%f, 權(quán)重:%f, 偏置:%f" % (
i,
loss.eval(),
self.weight.eval(),
self.bias.eval()))
# 運(yùn)行收集變量的結(jié)果
summary = sess.run(merged)
# 添加到文件
file_writer.add_summary(summary, i)
if __name__ == '__main__':
lr = MyLinearRegression()
lr.train()
未完待續(xù), 同學(xué)們請(qǐng)等待下一期
全套筆記和代碼自取移步gitee倉(cāng)庫(kù): gitee倉(cāng)庫(kù)獲取完整文檔和代碼
感興趣的小伙伴可以自取哦,歡迎大家點(diǎn)贊轉(zhuǎn)發(fā)~
到了這里,關(guān)于【深度學(xué)習(xí)】TensorFlow實(shí)現(xiàn)線性回歸,代碼演示。全md文檔筆記(代碼文檔已分享)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!