您好,登錄后才能下訂單哦!
I 前向傳播網絡搭建
在mnist_forward.py中搭建兩層全連接網絡,這里面就是定義層數,節點數,激活函數這些。
輸入節點數目就是mnist數據集的圖片28*28大小,用784行的向量作為輸入。
第一層y1=relu(x*w1+b1 )其中y1為500行的向量。那么w1里面就有784*500個變量啦~~b1是500個變量。然后經過一個relu激活函數。
第二層就是從500節點變換到10個節點的輸出,輸出為標簽,表示0-9手寫數字出現的概率。y=y1*w2+b2。w2就是500*10的矩陣。b2是10行的向量。沒有激活函數。
這里面w1 b1 w2 b2就是要訓練的參數
采用了正則化
正則化就是在損失函數中給每個參數w加上權重,引入模型復雜度指標,從而抑制模型噪聲,減少過擬合。這里使用的是L2正則化,即w的L2范數也是loss的一部分,也就是說在求解最優w的過程中,要使得w的值盡量在0附近。
import tensorflow as tf
INPUT_NODE = 784
OUTPUT_NODE = 10
LAYER1_NODE = 500
def get_weight(shape,regularizer):
w = tf.Variable(tf.truncated_normal(shape,stddev=0.1))
# 截斷正態分布
if regularizer != None: tf.add_to_collection('losses',tf.contrib.layers.l2_regularizer(regularizer)(w))
# 使用正則化 L2范數 將每個參數的正則化損失加到總損失中
return w
def get_bias(shape):
b = tf.Variable(tf.zeros(shape))
return b
def forward(x,regularizer):
w1 = get_weight([INPUT_NODE,LAYER1_NODE],regularizer)
b1 = get_bias([LAYER1_NODE])
y1 = tf.nn.relu(tf.matmul(x,w1) + b1)
w2 = get_weight([LAYER1_NODE,OUTPUT_NODE],regularizer)
b2 = get_bias([OUTPUT_NODE])
y = tf.matmul(y1,w2) + b2
return y
II誤差反向傳播
在mnist_backward.py中讀入mnist數據集,計算誤差,進行誤差反向傳播,實現模型的訓練,得到網絡參數并保存在模型中
2.1 loss
loss的計算先用softmax把輸出的10行向量變成概率分布,再與真實的輸出標簽進行對比,求交叉熵。cross entropy 可以看作是兩個概率分布函數之間的距離。距離越小,說明預測越準確,loss越小。
2.2 學習率
學習率是每次沿著梯度下降方向進行參數更新的步長,步長過大會導致在最優點震蕩,步長過小會導致學習速度太慢。這里采用了指數衰減的步長。在訓練初始階段,步長較大,較快收斂,在最優點附近,步長較小,能夠得到較精確的最優解。
2.3 滑動平均
記錄一段時間內模型中所有參數w和b的各自的平均值。用于增強模型的泛化能力。
import tensorflow as tf
import mnist_forward
import os無錫婦科醫院 http://www.bhnnk120.com/
os.environ["KMP_DUPLICATE_LIB_OK"]="TRUE"
from tensorflow.examples.tutorials.mnist import input_data
BATCH_SIZE = 200 #每次輸入的圖片數
LEARNING_RATE_BASE = 0.1 #初始學習率
LEARNING_RATE_DECAY = 0.99 #學習率衰減率
REGULARIZER = 0.0001 #正則化系數
STEPS = 10000 #訓練輪數
MOVING_AVERAGE_DECAY = 0.99
MODEL_SAVE_PATH="./model/"
MODEL_NAME = "mnist_model"
def backward(mnist):
x = tf.placeholder(tf.float32,[None,mnist_forward.INPUT_NODE])
y_ = tf.placeholder(tf.float32,[None,mnist_forward.OUTPUT_NODE])
y = mnist_forward.forward(x,REGULARIZER)
global_step = tf.Variable(0,trainable = False)
# step計數 不可訓練的參數
ce = tf.nn.sparse_softmax_cross_entropy_with_logits(logits = y, labels = tf.argmax(y_,1))
cem = tf.reduce_mean(ce)
loss = cem + tf.add_n(tf.get_collection('losses'))
learning_rate = tf.train.exponential_decay(LEARNING_RATE_BASE,global_step,mnist.train.num_examples/BATCH_SIZE,LEARNING_RATE_DECAY,staircase=True)
train_step = tf.train.GradientDescentOptimizer(learning_rate).minimize(loss,global_step = global_step)
ema = tf.train.ExponentialMovingAverage(MOVING_AVERAGE_DECAY,global_step)
ema_op = ema.apply(tf.trainable_variables())
# ema.apply()對括號內參數求滑動平均
# tf.trainable_variables() 將所有可以被訓練的參數匯總為list 也就是[w1 b1 w2 b2]
with tf.control_dependencies([train_step, ema_op]):
train_op = tf.no_op(name='train')
# 該函數實現將滑動平均和訓練過程同步運行。
saver = tf.train.Saver()
with tf.Session() as sess:
init_op = tf.global_variables_initializer()
sess.run(init_op)
for i in range(STEPS):
xs,ys = mnist.train.next_batch(BATCH_SIZE)
_, loss_value, step = sess.run([train_op,loss,global_step],feed_dict={x:xs,y_:ys})
if i%1000 == 0:
print("After %d training steps, loss on training batch is %g." %(step,loss_value))
saver.save(sess,os.path.join(MODEL_SAVE_PATH,MODEL_NAME),global_step=global_step)
if __name__ == '__main__':
mnist = input_data.read_data_sets('./data/',one_hot=True)
backward(mnist)
III 運行代碼
在Terminal里面激活tensorflow,運行python mnist_backward.py
就可以輸出訓練過程的loss,每1000步打印一次loss。從下圖可以看出,loss逐漸減小。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。