用tensorflow搭建全連接神經(jīng)網(wǎng)絡(luò)實(shí)現(xiàn)mnist數(shù)據(jù)集的識(shí)別-創(chuàng)新互聯(lián)

I 前向傳播網(wǎng)絡(luò)搭建

創(chuàng)新互聯(lián)公司堅(jiān)持“要么做到,要么別承諾”的工作理念,服務(wù)領(lǐng)域包括:成都網(wǎng)站制作、成都做網(wǎng)站、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣等服務(wù),滿足客戶于互聯(lián)網(wǎng)時(shí)代的滄縣網(wǎng)站設(shè)計(jì)、移動(dòng)媒體設(shè)計(jì)的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡(luò)建設(shè)合作伙伴!

在mnist_forward.py中搭建兩層全連接網(wǎng)絡(luò),這里面就是定義層數(shù),節(jié)點(diǎn)數(shù),激活函數(shù)這些。

輸入節(jié)點(diǎn)數(shù)目就是mnist數(shù)據(jù)集的圖片28*28大小,用784行的向量作為輸入。

第一層y1=relu(x*w1+b1 )其中y1為500行的向量。那么w1里面就有784*500個(gè)變量啦~~b1是500個(gè)變量。然后經(jīng)過一個(gè)relu激活函數(shù)。

第二層就是從500節(jié)點(diǎn)變換到10個(gè)節(jié)點(diǎn)的輸出,輸出為標(biāo)簽,表示0-9手寫數(shù)字出現(xiàn)的概率。y=y1*w2+b2。w2就是500*10的矩陣。b2是10行的向量。沒有激活函數(shù)。

這里面w1 b1 w2 b2就是要訓(xùn)練的參數(shù)

采用了正則化

正則化就是在損失函數(shù)中給每個(gè)參數(shù)w加上權(quán)重,引入模型復(fù)雜度指標(biāo),從而抑制模型噪聲,減少過擬合。這里使用的是L2正則化,即w的L2范數(shù)也是loss的一部分,也就是說在求解最優(yōu)w的過程中,要使得w的值盡量在0附近。

用tensorflow搭建全連接神經(jīng)網(wǎng)絡(luò)實(shí)現(xiàn)mnist數(shù)據(jù)集的識(shí)別

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))

# 截?cái)嗾龖B(tài)分布

if regularizer != None: tf.add_to_collection('losses',tf.contrib.layers.l2_regularizer(regularizer)(w))

# 使用正則化 L2范數(shù) 將每個(gè)參數(shù)的正則化損失加到總損失中

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數(shù)據(jù)集,計(jì)算誤差,進(jìn)行誤差反向傳播,實(shí)現(xiàn)模型的訓(xùn)練,得到網(wǎng)絡(luò)參數(shù)并保存在模型中

2.1 loss

loss的計(jì)算先用softmax把輸出的10行向量變成概率分布,再與真實(shí)的輸出標(biāo)簽進(jìn)行對比,求交叉熵。cross entropy 可以看作是兩個(gè)概率分布函數(shù)之間的距離。距離越小,說明預(yù)測越準(zhǔn)確,loss越小。

2.2 學(xué)習(xí)率

學(xué)習(xí)率是每次沿著梯度下降方向進(jìn)行參數(shù)更新的步長,步長過大會(huì)導(dǎo)致在最優(yōu)點(diǎn)震蕩,步長過小會(huì)導(dǎo)致學(xué)習(xí)速度太慢。這里采用了指數(shù)衰減的步長。在訓(xùn)練初始階段,步長較大,較快收斂,在最優(yōu)點(diǎn)附近,步長較小,能夠得到較精確的最優(yōu)解。

2.3 滑動(dòng)平均

記錄一段時(shí)間內(nèi)模型中所有參數(shù)w和b的各自的平均值。用于增強(qiáng)模型的泛化能力。

import tensorflow as tf

import mnist_forward

import os無錫婦科醫(yī)院 http://www.bhnnk120.com/

os.environ["KMP_DUPLICATE_LIB_OK"]="TRUE"

from tensorflow.examples.tutorials.mnist import input_data

BATCH_SIZE = 200 #每次輸入的圖片數(shù)

LEARNING_RATE_BASE = 0.1 #初始學(xué)習(xí)率

LEARNING_RATE_DECAY = 0.99 #學(xué)習(xí)率衰減率

REGULARIZER = 0.0001 #正則化系數(shù)

STEPS = 10000 #訓(xùn)練輪數(shù)

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計(jì)數(shù) 不可訓(xùn)練的參數(shù)

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()對括號(hào)內(nèi)參數(shù)求滑動(dòng)平均

# tf.trainable_variables() 將所有可以被訓(xùn)練的參數(shù)匯總為list 也就是[w1 b1 w2 b2]

with tf.control_dependencies([train_step, ema_op]):

train_op = tf.no_op(name='train')

# 該函數(shù)實(shí)現(xiàn)將滑動(dòng)平均和訓(xùn)練過程同步運(yùn)行。

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 運(yùn)行代碼

在Terminal里面激活tensorflow,運(yùn)行python mnist_backward.py

就可以輸出訓(xùn)練過程的loss,每1000步打印一次loss。從下圖可以看出,loss逐漸減小。

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)cdcxhl.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。

分享名稱:用tensorflow搭建全連接神經(jīng)網(wǎng)絡(luò)實(shí)現(xiàn)mnist數(shù)據(jù)集的識(shí)別-創(chuàng)新互聯(lián)
文章出自:http://muchs.cn/article30/cshcpo.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供動(dòng)態(tài)網(wǎng)站、網(wǎng)站導(dǎo)航、網(wǎng)站營銷、關(guān)鍵詞優(yōu)化、網(wǎng)站設(shè)計(jì)公司全網(wǎng)營銷推廣

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

成都做網(wǎng)站