TensorFlow(3)- 防止過擬合之dropout

1、理解dropout

在機(jī)器學(xué)習(xí)的模型中,如果模型的參數(shù)太多窜骄,而訓(xùn)練樣本又太少(或者相對少),訓(xùn)練出來的模型很容易產(chǎn)生過擬合的現(xiàn)象摆屯。在訓(xùn)練神經(jīng)網(wǎng)絡(luò)的時(shí)候經(jīng)常會(huì)遇到過擬合的問題邻遏,過擬合具體表現(xiàn)在:模型在訓(xùn)練數(shù)據(jù)上損失函數(shù)較小,預(yù)測準(zhǔn)確率較高虐骑;但是在測試數(shù)據(jù)上損失函數(shù)比較大准验,預(yù)測準(zhǔn)確率較低。

過擬合是很多機(jī)器學(xué)習(xí)模型的通病廷没。如果模型過擬合糊饱,那么得到的模型幾乎不能用。為了解決過擬合問題颠黎,一般會(huì)采用模型集成的方法另锋,即訓(xùn)練多個(gè)模型進(jìn)行組合。此時(shí)狭归,訓(xùn)練模型費(fèi)時(shí)就成為一個(gè)很大的問題夭坪,不僅訓(xùn)練多個(gè)模型費(fèi)時(shí),測試多個(gè)模型也是很費(fèi)時(shí)过椎。而dropout可以比較有效的緩解過擬合的發(fā)生室梅,在一定程度上達(dá)到正則化的效果。

定義:dropout是指在深度學(xué)習(xí)網(wǎng)絡(luò)的訓(xùn)練過程中,對于神經(jīng)網(wǎng)絡(luò)單元亡鼠,按照一定的概率將其暫時(shí)從網(wǎng)絡(luò)中丟棄赏殃。注意是暫時(shí),對于隨機(jī)梯度下降來說拆宛,由于是隨機(jī)丟棄嗓奢,故而每一個(gè)mini-batch都在訓(xùn)練不同的網(wǎng)絡(luò)讼撒。

原因:dropout為何有效這一點(diǎn)眾說紛紜浑厚。具體的細(xì)節(jié)可以參考博客:http://blog.csdn.net/stdcoutzyx/article/details/49022443,這篇寫的挺好的根盒,大家可以深入研究一下钳幅。

2、實(shí)現(xiàn)dropout(使用tensorflow)

tensorflow中的drop-out非常容易實(shí)現(xiàn)炎滞,使用下面的語法:

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

此時(shí)我們需要定義一個(gè)keep_prob的placeholder

keep_prob = tf.placeholder(tf.float32)

當(dāng)然不要忘記在feed_dict里面加入keep_prob

sess.run(train_step,feed_dict={xs:trainx,ys:trainy,keep_prob:0.5})

3敢艰、完整代碼

import tensorflow as tf
from sklearn.preprocessing import LabelBinarizer
from sklearn.model_selection import train_test_split
from sklearn.datasets import load_digits

digits = load_digits()
X = digits.data
Y = digits.target
Y = LabelBinarizer().fit_transform(Y)
print(Y.shape)
trainx,testx,trainy,testy = train_test_split(X,Y,test_size=0.3)

def add_layer(input,input_size,output_size,layer_name,activation_function=None):
    Weights = tf.Variable(tf.random_normal([input_size,output_size]))
    biases = tf.Variable(tf.zeros([1,output_size])+0,1)
    Wx_plus_bias = tf.add(tf.matmul(input,Weights),biases)
    Wx_plus_bias = tf.nn.dropout(Wx_plus_bias,keep_prob)
    if activation_function == None:
        outputs = Wx_plus_bias
    else:
        outputs = activation_function(Wx_plus_bias)
    #這里的output是一個(gè)二維的,所以每一步對應(yīng)一個(gè)線(或者說小的矩形册赛,顏色越深的地方表示這個(gè)地方的數(shù)越多钠导,可以認(rèn)為縱向上表示train到這一步的時(shí)候的一個(gè)數(shù)據(jù)分布
    tf.summary.histogram(layer_name+'/outputs',outputs)
    return outputs

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

l1 = add_layer(xs,64,50,"l1",activation_function=tf.nn.tanh)
prediction = add_layer(l1,50,10,"l2",activation_function=tf.nn.softmax)

cross_entropy = tf.reduce_mean(-tf.reduce_sum(ys * tf.log(prediction),reduction_indices=[1]))
#因?yàn)閏ross_entropy是一個(gè)標(biāo)量,所以定義tf.summary.scalar
tf.summary.scalar("loss",cross_entropy)

train_step = tf.train.GradientDescentOptimizer(0.5).minimize(cross_entropy)

init = tf.global_variables_initializer()

with tf.Session() as sess:
    #合并所有的summary
    merged = tf.summary.merge_all()
    #得到summary的FileWriter
    train_writer = tf.summary.FileWriter('logs/train/',sess.graph)
    test_writer = tf.summary.FileWriter('logs/test/',sess.graph)
    sess.run(init)
    for i in range(1000):
        sess.run(train_step,feed_dict={xs:trainx,ys:trainy,keep_prob:0.5})
        if i % 50 == 0:
            #print(sess.run(cross_entropy,feed_dict={xs:trainx,ys:trainy}))
            #這里要運(yùn)行merged
            train_loss = sess.run(merged,feed_dict = {xs:trainx,ys:trainy,keep_prob:0.5})
            test_loss = sess.run(merged,feed_dict={xs:testx,ys:testy,keep_prob:0.5})
            #將loss寫入FileWriter中
            train_writer.add_summary(train_loss,i)
            test_writer.add_summary(test_loss,i)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末森瘪,一起剝皮案震驚了整個(gè)濱河市牡属,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌扼睬,老刑警劉巖逮栅,帶你破解...
    沈念sama閱讀 217,277評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異窗宇,居然都是意外死亡措伐,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評論 3 393
  • 文/潘曉璐 我一進(jìn)店門军俊,熙熙樓的掌柜王于貴愁眉苦臉地迎上來侥加,“玉大人,你說我怎么就攤上這事粪躬」傧酰” “怎么了?”我有些...
    開封第一講書人閱讀 163,624評論 0 353
  • 文/不壞的土叔 我叫張陵短蜕,是天一觀的道長氢架。 經(jīng)常有香客問我,道長朋魔,這世上最難降的妖魔是什么岖研? 我笑而不...
    開封第一講書人閱讀 58,356評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上孙援,老公的妹妹穿的比我還像新娘害淤。我一直安慰自己,他們只是感情好拓售,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,402評論 6 392
  • 文/花漫 我一把揭開白布窥摄。 她就那樣靜靜地躺著,像睡著了一般础淤。 火紅的嫁衣襯著肌膚如雪崭放。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,292評論 1 301
  • 那天鸽凶,我揣著相機(jī)與錄音币砂,去河邊找鬼。 笑死玻侥,一個(gè)胖子當(dāng)著我的面吹牛决摧,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播凑兰,決...
    沈念sama閱讀 40,135評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼掌桩,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了姑食?” 一聲冷哼從身側(cè)響起波岛,我...
    開封第一講書人閱讀 38,992評論 0 275
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎矢门,沒想到半個(gè)月后盆色,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,429評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡祟剔,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,636評論 3 334
  • 正文 我和宋清朗相戀三年隔躲,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片物延。...
    茶點(diǎn)故事閱讀 39,785評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡宣旱,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出叛薯,到底是詐尸還是另有隱情浑吟,我是刑警寧澤,帶...
    沈念sama閱讀 35,492評論 5 345
  • 正文 年R本政府宣布耗溜,位于F島的核電站组力,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏抖拴。R本人自食惡果不足惜燎字,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,092評論 3 328
  • 文/蒙蒙 一腥椒、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧候衍,春花似錦笼蛛、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至妖异,卻和暖如春惋戏,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背随闺。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評論 1 269
  • 我被黑心中介騙來泰國打工日川, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留蔓腐,地道東北人矩乐。 一個(gè)月前我還...
    沈念sama閱讀 47,891評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像回论,于是被迫代替她去往敵國和親散罕。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,713評論 2 354

推薦閱讀更多精彩內(nèi)容