概念
反向傳播
訓(xùn)練模型參數(shù),在所有參數(shù)上使用梯度下降,使NN模型在訓(xùn)練數(shù)據(jù)上的損失函數(shù)最小遂填。
損失函數(shù)
預(yù)測值與已知答案的差距。
均方誤差
loss = tf.reduce_mean(tf.square(y_-y))
反向傳播的訓(xùn)練方法
三種方式澈蝙,見代碼吓坚。
學(xué)習(xí)率
參數(shù)更新幅度。
實戰(zhàn)loss
#coding:utf-8
#0導(dǎo)入模塊灯荧,生成模擬數(shù)據(jù)集礁击。
import tensorflow as tf
import numpy as np
BATCH_SIZE = 8
seed = 23455
#基于seed產(chǎn)生隨機數(shù)
rng = np.random.RandomState(seed)
#隨機數(shù)返回32行2列的矩陣 表示32組 體積和重量 作為輸入數(shù)據(jù)集
X = rng.rand(32,2)
#從X這個32行2列的矩陣中 取出一行 判斷如果和小于1 給Y賦值1 如果和不小于1 給Y賦值0
#作為輸入數(shù)據(jù)集的標簽(正確答案)
Y = [[int(x0 + x1 < 1)] for (x0, x1) in X]
print("X:\n",X)
print("Y:\n",Y)
#1定義神經(jīng)網(wǎng)絡(luò)的輸入、參數(shù)和輸出逗载,定義前向傳播過程哆窿。
x = tf.placeholder(tf.float32, shape=(None, 2))
y_= tf.placeholder(tf.float32, shape=(None, 1))
w1 = tf.Variable(tf.random_normal([2,3], stddev=1, seed=1))
w2 = tf.Variable(tf.random_normal([3,1], stddev=1, seed=1))
a = tf.matmul(x, w1)
y = tf.matmul(a, w2)
#2定義損失函數(shù)及反向傳播方法。
loss = tf.reduce_mean(tf.square(y-y_))
train_step = tf.train.GradientDescentOptimizer(0.001).minimize(loss)
#train_step = tf.train.MomentumOptimizer(0.001,0.9).minimize(loss)
#train_step = tf.train.AdamOptimizer(0.001).minimize(loss)
#3生成會話厉斟,訓(xùn)練STEPS輪
with tf.Session() as sess:
init_op = tf.global_variables_initializer()
sess.run(init_op)
# 輸出目前(未經(jīng)訓(xùn)練)的參數(shù)取值挚躯。
print("w1:\n", sess.run(w1))
print("w2:\n", sess.run(w2))
print("\n")
# 訓(xùn)練模型。
STEPS = 3000
for i in range(STEPS):
start = (i*BATCH_SIZE) % 32
end = start + BATCH_SIZE
sess.run(train_step, feed_dict={x: X[start:end], y_: Y[start:end]})
if i % 500 == 0:
total_loss = sess.run(loss, feed_dict={x: X, y_: Y})
print("After %d training step(s), loss on all data is %g" % (i, total_loss))
# 輸出訓(xùn)練后的參數(shù)取值擦秽。
print("\n")
print("w1:\n", sess.run(w1))
print("w2:\n", sess.run(w2))
2500輪:
GradientDescentOptimizer:0.390597
MomentumOptimizer:0.383561
AdamOptimizer:0.383676
20000輪:
GradientDescentOptimizer:0.383561
MomentumOptimizer:0.383561
AdamOptimizer:0.383561
在當(dāng)前數(shù)據(jù)下码荔,極限為0.383561,調(diào)小學(xué)習(xí)率無效感挥,MomentumOptimizer運行較快缩搅,調(diào)到10組數(shù)據(jù)后,原學(xué)習(xí)率/2的學(xué)習(xí)率會震蕩触幼,表明學(xué)習(xí)率過大硼瓣,學(xué)習(xí)率再次減小10倍后,21000次左右為最小值置谦,仍震蕩巨双,再次減小10倍后噪猾,2e5次迭代未出最小值,懶得試了筑累,為0.38377。