TF 訓練簡單梯度下降模型

tf.GrandientTape 訓練簡單的線性梯度下降模型

添加引用

首先需要添加TensorFlow引用和Eager Execution,如下:

from __future__ import absolute_import, division, print_function
import tensorflow as tf

tf.enable_eager_execution()
tfe = tf.contrib.eager

構造模型和樣本數(shù)據(jù)

構造一個樣本數(shù)=1000眼坏,權重=3扣溺,偏差=2的模型砂心,并且加入噪點天揖,如下:

NUM_EXAMPLES = 1000   # 樣本數(shù)1000
training_inputs = tf.random_normal([NUM_EXAMPLES])   # 輸出正態(tài)分布的隨機值
noise = tf.random_normal([NUM_EXAMPLES])
training_outputs = training_inputs * 3 + 2 + noise   # 構造標簽樣本(權重=3,偏差=2瘸爽,并且加入噪點)

定義函數(shù)

定義預測函數(shù)展运、損失函數(shù)和梯度下降函數(shù)活逆,如下:

# 預測函數(shù)
def prediction(input, weight, bias):
    return input * weight + bias

# 使用“均方差”的損失函數(shù)
def loss(weights, biases):
    error = prediction(training_inputs, weights, biases) - training_outputs
    return tf.reduce_mean(tf.square(error))

# 執(zhí)行梯度下降精刷,返回下降之后的權重和偏差
def grad(weights, biases):
    with tf.GradientTape() as tape:
        loss_value = loss(weights,biases)
    return tape.gradient(loss_value,[weights,biases])

訓練模型

初始化

初始化訓練次數(shù)、學習率蔗候、權重和偏差怒允,如下:

train_steps = 200
learning_rate = 0.01
# 權重和偏差設置任意值
W = tfe.Variable(5.)
B = tfe.Variable(10.)

訓練

for i in range(train_steps):
    dW, dB = grad(W, B)
    W.assign_sub(dW * learning_rate)
    B.assign_sub(dB * learning_rate)
    print("Loss at step {:03d}: {:.3f}".format(i, loss(W, B)))

得到訓練后的權重和方差,即我們的模型锈遥。

print("Final loss: {:.3f}".format(loss(W, B)))
print("W = {}, B = {}".format(W.numpy(), B.numpy()))
image

權重=3.018173... 偏差=2.17251... 與我們設定的3和2基本相符纫事。

完整實例代碼如下:

方式一:

from __future__ import absolute_import, division, print_function
import tensorflow as tf

tf.enable_eager_execution()
tfe = tf.contrib.eager

NUM_EXAMPLES = 1000   # 樣本數(shù)1000
training_inputs = tf.random_normal([NUM_EXAMPLES])    # 輸出正態(tài)分布的隨機值
noise = tf.random_normal([NUM_EXAMPLES])
training_outputs = training_inputs * 3 + 2 + noise    # 構造標簽樣本(權重=3,偏差=2所灸,并且加入噪點)

# 預測函數(shù)
def prediction(input, weight, bias):
    return input * weight + bias

# 使用“均方差”的損失函數(shù)
def loss(weights, biases):
    error = prediction(training_inputs, weights, biases) - training_outputs
    return tf.reduce_mean(tf.square(error))

# 執(zhí)行梯度下降丽惶,返回下降之后的權重和偏差
def grad(weights, biases):
    with tf.GradientTape() as tape:
        loss_value = loss(weights,biases)
    return tape.gradient(loss_value,[weights,biases])

train_steps = 200
learning_rate = 0.01
# 權重和偏差設置任意值
W = tfe.Variable(5.)
B = tfe.Variable(10.)

print("Initial loss: {:.3f}".format(loss(W, B)))

for i in range(train_steps):
    dW, dB = grad(W, B)
    W.assign_sub(dW * learning_rate)
    B.assign_sub(dB * learning_rate)
    print("Loss at step {:03d}: {:.3f}".format(i, loss(W, B)))


print("Final loss: {:.3f}".format(loss(W, B)))
print("W = {}, B = {}".format(W.numpy(), B.numpy()))

方式二(通過將 tfe.Variable 與 tf.GradientTape 結合使用可以更好地封裝模型參數(shù)):

from __future__ import absolute_import, division, print_function
import tensorflow as tf
tf.enable_eager_execution()
tfe = tf.contrib.eager

class Model(tf.keras.Model):
    '''自定義模型'''
    def __init__(self):
        super(Model, self).__init__()
        self.W = tfe.Variable(5., name = 'weight')
        self.B = tfe.Variable(10., name = 'bias')

    def call(self, inputs):
        return inputs * self.W + self.B

# 構造樣本數(shù)據(jù)
NUM_EXAMPLES = 2000
training_inputs = tf.random_normal([NUM_EXAMPLES])  # 隨機正態(tài)分布的值
nosie = tf.random_normal([NUM_EXAMPLES])   # 噪點
training_outputs = training_inputs * 3 + 2 + nosie

# 定義損失和梯度函數(shù)
def loss(model, inputs, targets):
    error = model(inputs) - targets
    return tf.reduce_mean(tf.square(error))

def grad(model, inputs, targets):
    with tf.GradientTape() as tape:
        loss_value = loss(model, inputs, targets)
    return tape.gradient(loss_value, [model.W, model.B])

# 訓練
# 1. 實例化模型
# 2. 模型損失函數(shù)的導數(shù)
# 3. 更新變量的策略
model = Model()
optimizer = tf.train.GradientDescentOptimizer(learning_rate = 0.01)   # 優(yōu)化器

print("Initial loss: {:.3f}".format(loss(model, training_inputs, training_outputs).numpy()))
    
# 訓練循環(huán)
for i in range(300):
    grads = grad(model, training_inputs, training_outputs)
    optimizer.apply_gradients(zip(grads, [model.W, model.B]),global_step=tf.train.get_or_create_global_step())
    if i % 20 == 0:
            print('Loss at step {:03d}: {:.3f}'.format(i,loss(model, training_inputs,training_outputs).numpy()))

print('Final loss: {:.3f}'.format(loss(model, training_inputs, training_outputs).numpy()))
print('W = {}, B = {}'.format(model.W.numpy(), model.B.numpy()))
最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市庆寺,隨后出現(xiàn)的幾起案子蚊夫,更是在濱河造成了極大的恐慌诉字,老刑警劉巖懦尝,帶你破解...
    沈念sama閱讀 217,509評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異壤圃,居然都是意外死亡陵霉,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,806評論 3 394
  • 文/潘曉璐 我一進店門伍绳,熙熙樓的掌柜王于貴愁眉苦臉地迎上來踊挠,“玉大人,你說我怎么就攤上這事冲杀⌒Т玻” “怎么了?”我有些...
    開封第一講書人閱讀 163,875評論 0 354
  • 文/不壞的土叔 我叫張陵权谁,是天一觀的道長剩檀。 經(jīng)常有香客問我,道長旺芽,這世上最難降的妖魔是什么沪猴? 我笑而不...
    開封第一講書人閱讀 58,441評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮采章,結果婚禮上运嗜,老公的妹妹穿的比我還像新娘。我一直安慰自己悯舟,他們只是感情好担租,可當我...
    茶點故事閱讀 67,488評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著抵怎,像睡著了一般奋救。 火紅的嫁衣襯著肌膚如雪阱洪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,365評論 1 302
  • 那天菠镇,我揣著相機與錄音冗荸,去河邊找鬼。 笑死利耍,一個胖子當著我的面吹牛蚌本,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播隘梨,決...
    沈念sama閱讀 40,190評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼程癌,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了轴猎?” 一聲冷哼從身側響起嵌莉,我...
    開封第一講書人閱讀 39,062評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎捻脖,沒想到半個月后锐峭,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,500評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡可婶,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,706評論 3 335
  • 正文 我和宋清朗相戀三年沿癞,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片矛渴。...
    茶點故事閱讀 39,834評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡椎扬,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出具温,到底是詐尸還是另有隱情蚕涤,我是刑警寧澤,帶...
    沈念sama閱讀 35,559評論 5 345
  • 正文 年R本政府宣布铣猩,位于F島的核電站揖铜,受9級特大地震影響,放射性物質發(fā)生泄漏剂习。R本人自食惡果不足惜蛮位,卻給世界環(huán)境...
    茶點故事閱讀 41,167評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望鳞绕。 院中可真熱鬧失仁,春花似錦、人聲如沸们何。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,779評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至拂封,卻和暖如春茬射,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背冒签。 一陣腳步聲響...
    開封第一講書人閱讀 32,912評論 1 269
  • 我被黑心中介騙來泰國打工侥锦, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留岗钩,地道東北人。 一個月前我還...
    沈念sama閱讀 47,958評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像襟衰,于是被迫代替她去往敵國和親宁改。 傳聞我的和親對象是個殘疾皇子逊躁,可洞房花燭夜當晚...
    茶點故事閱讀 44,779評論 2 354