tf.nn.dropout的使用-創(chuàng)新互聯(lián)

神經(jīng)網(wǎng)絡(luò)在設(shè)置的神經(jīng)網(wǎng)絡(luò)足夠復(fù)雜的情況下,可以無(wú)限逼近一段非線性連續(xù)函數(shù),但是如果神經(jīng)網(wǎng)絡(luò)設(shè)置的足夠復(fù)雜,將會(huì)導(dǎo)致過(guò)擬合(overfitting)的出現(xiàn),就好像下圖這樣。

創(chuàng)新互聯(lián)公司長(zhǎng)期為1000多家客戶提供的網(wǎng)站建設(shè)服務(wù),團(tuán)隊(duì)從業(yè)經(jīng)驗(yàn)10年,關(guān)注不同地域、不同群體,并針對(duì)不同對(duì)象提供差異化的產(chǎn)品和服務(wù);打造開(kāi)放共贏平臺(tái),與合作伙伴共同營(yíng)造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為德江企業(yè)提供專業(yè)的網(wǎng)站制作、網(wǎng)站建設(shè),德江網(wǎng)站改版等技術(shù)服務(wù)。擁有十多年豐富建站經(jīng)驗(yàn)和眾多成功案例,為您定制開(kāi)發(fā)。

看到這個(gè)藍(lán)色曲線,我就知道:

很明顯藍(lán)色曲線是overfitting的結(jié)果,盡管它很好的擬合了每一個(gè)點(diǎn)的位置,但是曲線是歪歪曲曲扭扭捏捏的,這個(gè)的曲線不具有良好的魯棒性,在實(shí)際工程實(shí)驗(yàn)中,我們更希望得到如黑色線一樣的曲線。

tf.nn.dropout函數(shù)介紹

tf.nn.dropout是tensorflow的好朋友,它的作用是為了減輕過(guò)擬合帶來(lái)的問(wèn)題而使用的函數(shù),它一般用在每個(gè)連接層的輸出。

Dropout就是在不同的訓(xùn)練過(guò)程中,按照一定概率使得某些神經(jīng)元停止工作。也就是讓每個(gè)神經(jīng)元按照一定的概率停止工作,這次訓(xùn)練過(guò)程中不更新權(quán)值,也不參加神經(jīng)網(wǎng)絡(luò)的計(jì)算。但是它的權(quán)重依然存在,下次更新時(shí)可能會(huì)使用到它。

def dropout(x, keep_prob, noise_shape=None, seed=None, name=None)

x 一般是每一層的輸出

keep_prob,保留keep_prob的神經(jīng)元繼續(xù)工作,其余的停止工作與更新

在實(shí)際定義每一層神經(jīng)元的時(shí)候,可以加入dropout。

def add_layer(inputs,in_size,out_size,n_layer,activation_function = None,keep_prob = 1):

layer_name = 'layer%s'%n_layer

with tf.name_scope(layer_name):

with tf.name_scope("Weights"):

Weights = tf.Variable(tf.random_normal([in_size,out_size]),name = "Weights")

tf.summary.histogram(layer_name+"/weights",Weights)

with tf.name_scope("biases"):

biases = tf.Variable(tf.zeros([1,out_size]) + 0.1,name = "biases")

tf.summary.histogram(layer_name+"/biases",biases)

with tf.name_scope("Wx_plus_b"):

Wx_plus_b = tf.matmul(inputs,Weights) + biases

#dropout一般加載每個(gè)神經(jīng)層的輸出

Wx_plus_b = tf.nn.dropout(Wx_plus_b,keep_prob)

#看這里看這里,dropout在這里。

tf.summary.histogram(layer_name+"/Wx_plus_b",Wx_plus_b)

if activation_function == None :

outputs = Wx_plus_b

else:

outputs = activation_function(Wx_plus_b)

tf.summary.histogram(layer_name+"/outputs",outputs)

return outputs

但需要注意的是,神經(jīng)元的輸出層不可以定義dropout參數(shù)。因?yàn)檩敵鰧泳褪禽敵龅氖墙Y(jié)果,在輸出層定義參數(shù)的話,就會(huì)導(dǎo)致輸出結(jié)果被dropout掉。

例子

本次例子使用sklearn.datasets,在進(jìn)行測(cè)試的時(shí)候,我們只需要改變最下方keep_prob:0.5的值即可,1代表不進(jìn)行dropout。

代碼

import tensorflow as tf

from sklearn.datasets import load_digits

from sklearn.model_selection import train_test_split

from sklearn.preprocessing import LabelBinarizer

digits = load_digits()

X = digits.data

y = digits.target

y = LabelBinarizer().fit_transform(y)

X_train,X_test,Y_train,Y_test = train_test_split(X,y,test_size = 500)

def add_layer(inputs,in_size,out_size,n_layer,activation_function = None,keep_prob = 1):

layer_name = 'layer%s'%n_layer

with tf.name_scope(layer_name):

with tf.name_scope("Weights"):

Weights = tf.Variable(tf.random_normal([in_size,out_size]),name = "Weights")

tf.summary.histogram(layer_name+"/weights",Weights)

with tf.name_scope("biases"):

biases = tf.Variable(tf.zeros([1,out_size]) + 0.1,name = "biases")

tf.summary.histogram(layer_name+"/biases",biases)

with tf.name_scope("Wx_plus_b"):

Wx_plus_b = tf.matmul(inputs,Weights) + biases

Wx_plus_b = tf.nn.dropout(Wx_plus_b,keep_prob)

tf.summary.histogram(layer_name+"/Wx_plus_b",Wx_plus_b)

if activation_function == None :

outputs = Wx_plus_b

else:

outputs = activation_function(Wx_plus_b)

tf.summary.histogram(layer_name+"/outputs",outputs)

return outputs

def compute_accuracy(x_data,y_data,prob = 1):

global prediction

y_pre = sess.run(prediction,feed_dict = {xs:x_data,keep_prob:prob})

correct_prediction = tf.equal(tf.arg_max(y_data,1),tf.arg_max(y_pre,1))

accuracy = tf.reduce_mean(tf.cast(correct_prediction,tf.float32))

result = sess.run(accuracy,feed_dict = {xs:x_data,ys:y_data,keep_prob:prob})

return result

keep_prob = tf.placeholder(tf.float32)

xs = tf.placeholder(tf.float32,[None,64])

ys = tf.placeholder(tf.float32,[None,10])

l1 = add_layer(xs,64,100,'l1',activation_function=tf.nn.tanh, keep_prob = keep_prob)

l2 = add_layer(l1,100,100,'l2',activation_function=tf.nn.tanh, keep_prob = keep_prob)

prediction = add_layer(l1,100,10,'l3',activation_function = tf.nn.softmax, keep_prob = 1)

with tf.name_scope("loss"):

loss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels=ys,logits = prediction),name = 'loss')

tf.summary.scalar("loss",loss)

train = tf.train.AdamOptimizer(0.01).minimize(loss)

init = tf.initialize_all_variables()

merged = tf.summary.merge_all()

with tf.Session() as sess:

sess.run(init)

train_writer = tf.summary.FileWriter("logs/strain",sess.graph)

test_writer = tf.summary.FileWriter("logs/test",sess.graph)

for i in range(5001):

sess.run(train,feed_dict = {xs:X_train,ys:Y_train,keep_prob:0.5})

if i % 500 == 0:無(wú)錫婦科醫(yī)院 http://www.bhnnk120.com/

print("訓(xùn)練%d次的識(shí)別率為:%f。"%((i+1),compute_accuracy(X_test,Y_test,prob=0.5)))

train_result = sess.run(merged,feed_dict={xs:X_train,ys:Y_train,keep_prob:0.5})

test_result = sess.run(merged,feed_dict={xs:X_test,ys:Y_test,keep_prob:0.5})

train_writer.add_summary(train_result,i)

test_writer.add_summary(test_result,i)

keep_prob = 0.5

訓(xùn)練結(jié)果為:

訓(xùn)練1次的識(shí)別率為:0.086000。

訓(xùn)練501次的識(shí)別率為:0.890000。

訓(xùn)練1001次的識(shí)別率為:0.938000。

訓(xùn)練1501次的識(shí)別率為:0.952000。

訓(xùn)練2001次的識(shí)別率為:0.952000。

訓(xùn)練2501次的識(shí)別率為:0.946000。

訓(xùn)練3001次的識(shí)別率為:0.940000。

訓(xùn)練3501次的識(shí)別率為:0.932000。

訓(xùn)練4001次的識(shí)別率為:0.970000。

訓(xùn)練4501次的識(shí)別率為:0.952000。

訓(xùn)練5001次的識(shí)別率為:0.950000。

這是keep_prob = 0.5時(shí)tensorboard中的loss的圖像:

keep_prob = 1

訓(xùn)練結(jié)果為:

訓(xùn)練1次的識(shí)別率為:0.160000。

訓(xùn)練501次的識(shí)別率為:0.754000。

訓(xùn)練1001次的識(shí)別率為:0.846000。

訓(xùn)練1501次的識(shí)別率為:0.854000。

訓(xùn)練2001次的識(shí)別率為:0.852000。

訓(xùn)練2501次的識(shí)別率為:0.852000。

訓(xùn)練3001次的識(shí)別率為:0.860000。

訓(xùn)練3501次的識(shí)別率為:0.854000。

訓(xùn)練4001次的識(shí)別率為:0.856000。

訓(xùn)練4501次的識(shí)別率為:0.852000。

訓(xùn)練5001次的識(shí)別率為:0.852000。

這是keep_prob = 1時(shí)tensorboard中的loss的圖像:

可以明顯看出來(lái)keep_prob = 0.5的訓(xùn)練集和測(cè)試集的曲線更加貼近。

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

新聞名稱:tf.nn.dropout的使用-創(chuàng)新互聯(lián)
網(wǎng)址分享:http://bm7419.com/article22/dcosjc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供品牌網(wǎng)站建設(shè)、手機(jī)網(wǎng)站建設(shè)網(wǎng)站建設(shè)、網(wǎng)站設(shè)計(jì)動(dòng)態(tài)網(wǎng)站、網(wǎng)站制作

廣告

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

成都定制網(wǎng)站建設(shè)