• <sub id="pqc61"><p id="pqc61"></p></sub><sub id="pqc61"></sub>
    在线精品视频一区二区,亚洲中文字幕无码一久久区,正在播放肥臀熟妇在线视频,国内精品视频一区二区三区八戒 ,国产毛片三区二区一区,国产精品一区中文字幕,丰满少妇被猛烈进出69影院,国产成人无码
    您正在使用IE低版瀏覽器,為了您的雷峰網(wǎng)賬號(hào)安全和更好的產(chǎn)品體驗(yàn),強(qiáng)烈建議使用更快更安全的瀏覽器
    此為臨時(shí)鏈接,僅用于文章預(yù)覽,將在時(shí)失效
    人工智能開(kāi)發(fā)者 正文
    發(fā)私信給崔靜闖
    發(fā)送

    0

    用深度學(xué)習(xí)每次得到的結(jié)果都不一樣,怎么辦?

    本文作者: 崔靜闖 2017-06-20 20:33
    導(dǎo)語(yǔ):如何用Keras從神經(jīng)網(wǎng)絡(luò)得到可重復(fù)的結(jié)果。

    用深度學(xué)習(xí)每次得到的結(jié)果都不一樣,怎么辦?

    雷鋒網(wǎng)按:本文作者 Jason Brownlee 為澳大利亞知名機(jī)器學(xué)習(xí)專(zhuān)家、教育者,對(duì)時(shí)間序列預(yù)測(cè)尤有心得。原文發(fā)布于其博客。雷鋒網(wǎng)崔靜闖、朱婷編譯。

    神經(jīng)網(wǎng)絡(luò)算法利用了隨機(jī)性,比如初始化隨機(jī)權(quán)重,因此用同樣的數(shù)據(jù)訓(xùn)練同一個(gè)網(wǎng)絡(luò)會(huì)得到不同的結(jié)果。

    初學(xué)者可能會(huì)有些懵圈,因?yàn)樗惴ū憩F(xiàn)得不太穩(wěn)定。但實(shí)際上它們就是這么設(shè)計(jì)的。隨機(jī)初始化可以讓網(wǎng)絡(luò)通過(guò)學(xué)習(xí),得到一個(gè)所學(xué)函數(shù)的很好的近似。

    然而, 有時(shí)候用同樣的數(shù)據(jù)訓(xùn)練同一個(gè)網(wǎng)絡(luò),你需要每次都得到完全相同的結(jié)果。例如在教學(xué)和產(chǎn)品上。

    在這個(gè)教程中,你會(huì)學(xué)到怎樣設(shè)置隨機(jī)數(shù)生成器,才能每次用同樣的數(shù)據(jù)訓(xùn)練同一網(wǎng)絡(luò)時(shí),都能得到同樣的結(jié)果。

    我們開(kāi)始。

    教程概覽

    這個(gè)教程分為六部分:

    1. 為啥我每次得到的結(jié)果都不一樣?

    2. 不同結(jié)果的演示

    3. 解決方法

    4. 用Theano 后端設(shè)置隨機(jī)數(shù)種子

    5. 用TensorFlow 后端設(shè)置隨機(jī)數(shù)種子

    6. 得到的結(jié)果還是不同,咋辦?

    運(yùn)行環(huán)境

    • 該教程需要你安裝了Python SciPy。你能用Python2或3來(lái)演示這個(gè)例子

    • 需要你安裝Keras (v2.0.3+),后臺(tái)為T(mén)ensorFlow (v1.1.0+)或Theano (v0.9+)

    • 還需要你安裝了scikit-learn,Pandas,NumPy以及Matplotlib

    如果在Python環(huán)境的設(shè)置方面需要幫助,請(qǐng)看下面這個(gè)帖子:

    How to Setup a Python Environment for Machine Learning and Deep Learning with Anaconda

    為啥我每次得到的結(jié)果都不一樣?

    我發(fā)現(xiàn)這對(duì)神經(jīng)網(wǎng)絡(luò)和深度學(xué)習(xí)的初學(xué)者而言是個(gè)常見(jiàn)問(wèn)題。

    這種誤解可能出于以下問(wèn)題:

    • 我如何得到穩(wěn)定的結(jié)果?

    • 我如何得到可重復(fù)的結(jié)果

    • 我應(yīng)該如何設(shè)置種子點(diǎn)

    神經(jīng)網(wǎng)絡(luò)特意用隨機(jī)性來(lái)保證,能通過(guò)有效學(xué)習(xí)得到問(wèn)題的近似函數(shù)。采用隨機(jī)性的原因是:用它的機(jī)器學(xué)習(xí)算法,要比不用它的效果更好。

    在神經(jīng)網(wǎng)絡(luò)中,最常見(jiàn)的利用隨機(jī)性的方式是網(wǎng)絡(luò)權(quán)值的隨機(jī)初始化,盡管在其他地方也能利用隨機(jī)性,這有一個(gè)簡(jiǎn)短的清單:

    • 初始化的隨機(jī)性,比如權(quán)值

    • 正則化的隨機(jī)性,比如dropout

    • 層的隨機(jī)性,比如詞嵌入

    • 最優(yōu)化的隨機(jī)性,比如隨機(jī)優(yōu)化

    這些甚至更多的隨機(jī)性來(lái)源意味著,當(dāng)你對(duì)同一數(shù)據(jù)運(yùn)行同一個(gè)神經(jīng)網(wǎng)絡(luò)算法時(shí),注定得到不同的結(jié)果。

    想了解更多關(guān)于隨機(jī)算法的原委,參考下面的帖子

    Embrace Randomness in Machine Learning

    不同結(jié)果的演示

    我們可以用一個(gè)小例子來(lái)演示神經(jīng)網(wǎng)絡(luò)的隨機(jī)性.

    在這一節(jié)中,我們會(huì)建立一個(gè)多層感知器模型來(lái)學(xué)習(xí)一個(gè)以0.1為間隔的從0.0到0.9的短序列。給出0.0,模型必須預(yù)測(cè)出0.1;給出0.1,模型必須預(yù)測(cè)出0.2;以此類(lèi)推。

    下面是準(zhǔn)備數(shù)據(jù)的代碼

     # create sequence
    length = 10
    sequence = [i/float(length) for i in range(length)]
    # create X/y pairs
    df = DataFrame(sequence)
    df = concat([df.shift(1), df], axis=1)
    df.dropna(inplace=True)
    # convert to MLPfriendly format
    values = df.values
    X, y = values[:,0], values[:,1]    

    我們要用的網(wǎng)絡(luò),有1個(gè)輸入,10個(gè)隱層節(jié)點(diǎn)和1個(gè)輸出。這個(gè)網(wǎng)絡(luò)將采用均方差作為損失函數(shù),用高效的ADAM算法來(lái)訓(xùn)練數(shù)據(jù)

    這個(gè)網(wǎng)絡(luò)需要約1000輪才能有效的解決這個(gè)問(wèn)題,但我們只對(duì)它訓(xùn)練100輪。這樣是為了確保我們?cè)陬A(yù)測(cè)時(shí)能得到一個(gè)有誤差的模型。

    網(wǎng)絡(luò)訓(xùn)練完之后,我們要對(duì)數(shù)據(jù)集進(jìn)行預(yù)測(cè)并且輸出均方差

    建立網(wǎng)絡(luò)的代碼如下

     # design network
    model = Sequential()
    model.add(Dense(10, input_dim=1))
    model.add(Dense(1))
    model.compile(loss='mean_squared_error', optimizer='adam')
    # fit network
    model.fit(X, y, epochs=100, batch_size=len(X), verbose=0)
    # forecast
    yhat = model.predict(X, verbose=0)
    print(mean_squared_error(y, yhat[:,0]))    

    在這個(gè)例子中,我們要建立10次網(wǎng)絡(luò)并且輸出10個(gè)不同的網(wǎng)絡(luò)得分

    完整的代碼如下

    from pandas import DataFrame
    from pandas import concat
    from keras.models import Sequential
    from keras.layers import Dense
    from sklearn.metrics import mean_squared_error

    # fit MLP to dataset and print error
    def fit_model(X, y):
    # design network
    model = Sequential()
    model.add(Dense(10, input_dim=1))
    model.add(Dense(1))
    model.compile(loss='mean_squared_error', optimizer='adam')
    # fit network
    model.fit(X, y, epochs=100, batch_size=len(X), verbose=0)
    # forecast
    yhat = model.predict(X, verbose=0)
    print(mean_squared_error(y, yhat[:,0]))

    # create sequence
    length = 10
    sequence = [i/float(length) for i in range(length)]
    # create X/y pairs
    df = DataFrame(sequence)
    df = concat([df.shift(1), df], axis=1)
    df.dropna(inplace=True)
    # convert to MLP friendly format
    values = df.values
    X, y = values[:,0], values[:,1]
    # repeat experiment
    repeats = 10
    for _ in range(repeats):
    fit_model(X, y)    

    運(yùn)行這個(gè)例子會(huì)在每一行輸出一個(gè)不同的精確值,具體結(jié)果也都不同。

    下面是一個(gè)輸出的示例

    0.0282584265697
    0.0457025913022
    0.145698137198
    0.0873461454407
    0.0309397604521
    0.046649185173
    0.0958450337178
    0.0130660263779
    0.00625176026631
    0.00296055161492    

    解決方案

    下面是兩個(gè)主要的解決方案。

    解決方案#1:重復(fù)實(shí)驗(yàn)

    解決這個(gè)問(wèn)題傳統(tǒng)且切實(shí)可行的方法是多次運(yùn)行網(wǎng)絡(luò)(30+),然后運(yùn)用統(tǒng)計(jì)學(xué)方法概括模型的性能,并與其他模型作比較。

    我強(qiáng)烈推薦這種方法,但是由于有些模型的訓(xùn)練時(shí)間太長(zhǎng),這種方法并不總是可行的。

    解決方案#2:設(shè)置隨機(jī)數(shù)字生成器的種子

    另一種解決方案是為隨機(jī)數(shù)字生成器使用固定的種子。

    隨機(jī)數(shù)由偽隨機(jī)數(shù)生成器生成。一個(gè)隨機(jī)生成器就是一個(gè)數(shù)學(xué)函數(shù),該函數(shù)將生成一長(zhǎng)串?dāng)?shù)字,這些數(shù)字對(duì)于一般目的的應(yīng)用足夠隨機(jī)。

    隨機(jī)生成器需要一個(gè)種子點(diǎn)開(kāi)啟該進(jìn)程,在大多數(shù)實(shí)現(xiàn)中,通常默認(rèn)使用以毫秒為單位的當(dāng)前時(shí)間。這是為了確保,默認(rèn)情況下每次運(yùn)行代碼都會(huì)生成不同的隨機(jī)數(shù)字序列。該種子點(diǎn)可以是指定數(shù)字,比如“1”,來(lái)保證每次代碼運(yùn)行時(shí)生成相同的隨機(jī)數(shù)序列。只要運(yùn)行代碼時(shí)指定的種子的值不變,它是什么并不重要。

    設(shè)置隨機(jī)數(shù)生成器的具體方法取決于后端,我們將探究下在Theano和TensorFlow后端下怎樣做到這點(diǎn)。

    用Theano后端設(shè)置隨機(jī)數(shù)種子

    通常,Keras從NumPy隨機(jī)數(shù)生成器中獲得隨機(jī)源。

    大部分情況下,Theano后端也是這樣。

    我們可以通過(guò)從random模塊中調(diào)用seed()函數(shù)的方式,設(shè)置NumPy隨機(jī)數(shù)生成器的種子,如下面所示:

     from numpy.random import seed
    seed(1)    

    最好在代碼文件的頂部導(dǎo)入和調(diào)用seed函數(shù)。

    這是最佳的實(shí)現(xiàn)方式(best practice),這是因?yàn)楫?dāng)各種各樣的Keras或者Theano(或者其他的)庫(kù)作為初始化的一部分被導(dǎo)入時(shí),甚至在直接使用他們之前,可能會(huì)用到一些隨機(jī)性。

    我們可以在上面示例的頂端再加兩行,并運(yùn)行兩次。

    每次運(yùn)行代碼時(shí),可以看到相同的均方差值的列表(在不同的機(jī)器上可能會(huì)有一些微小變化,這取決于機(jī)器的精度),如下面的示例所示:

    0.169326527063
    2.75750621228e-05
    0.0183287291562
    1.93553737255e-07
    0.0549871087449
    0.0906326807824
    0.00337575114075
    0.00414857518259
    8.14587362008e-08
    0.0522927019639    

    你的結(jié)果應(yīng)該跟我的差不多(忽略微小的精度差異)。

    用TensorFlow后端設(shè)置隨機(jī)數(shù)種子

    Keras從NumPy隨機(jī)生成器中獲得隨機(jī)源,所以不管使用Theano或者TensorFlow后端的哪一個(gè),都必須設(shè)置種子點(diǎn)。

    必須在其他模塊的導(dǎo)入或者其他代碼之前,文件的頂端部分通過(guò)調(diào)用seed()函數(shù)設(shè)置種子點(diǎn)。

    from numpy.random import seed
    seed(1)    

    另外,TensorFlow有自己的隨機(jī)數(shù)生成器,該生成器也必須在NumPy隨機(jī)數(shù)生成器之后通過(guò)立馬調(diào)用 set_random_seed() 函數(shù)設(shè)置種子點(diǎn)。

    from tensorflow import set_random_seed
    set_random_seed(2)    

    要明確的是,在代碼文件的頂端,在其他之前,一定要有以下4行:

    from numpy.random import seed
    seed(1)
    from tensorflow import set_random_seed
    set_random_seed(2)    

    你可以使用兩個(gè)相同或者不同的種子。我認(rèn)為這不會(huì)造成多大差別,因?yàn)殡S機(jī)源進(jìn)入了不同的進(jìn)程。

    在以上示例中增加這4行,可以使代碼每次運(yùn)行時(shí)都產(chǎn)生相同的結(jié)果。你應(yīng)該看到與下面列出的相同的均方差值(也許有一些微小差別,這取決于不同機(jī)器的精度):

    0.224045112999
    0.00154879478823
    0.00387589994044
    0.0292376881968
    0.00945528404353
    0.013305765525
    0.0206255228201
    0.0359538356108
    0.00441943512128
    0.298706569397    

    你的結(jié)果應(yīng)該與我的差不多(忽略精度的微小差異)。

    如果我仍然得到不同的結(jié)果,怎么辦?

    為了重復(fù)迭代,報(bào)告結(jié)果和比較模型魯棒性最好的做法是多次(30+)重復(fù)實(shí)驗(yàn),并使用匯總統(tǒng)計(jì)。如果這是不可行的,你可以通過(guò)為代碼使用的隨機(jī)數(shù)發(fā)生器設(shè)置種子來(lái)獲得100%可重復(fù)的結(jié)果。

    如果你已經(jīng)按照上面的說(shuō)明去做,仍然用相同的數(shù)據(jù)從相同的算法中獲得了不同的結(jié)果,怎么辦?

    這可能是有其他的隨機(jī)源你還沒(méi)有考慮到。

    來(lái)自第三方庫(kù)的隨機(jī)性

    也許你的代碼使用了另外的庫(kù),該庫(kù)使用不同的也必須設(shè)置種子的隨機(jī)數(shù)生成器。

    試著將你的代碼簡(jiǎn)化到最低要求(例如,一個(gè)數(shù)據(jù)樣本,一輪訓(xùn)練等等),并仔細(xì)閱讀API文檔,盡力減少可能引入隨機(jī)性的第三方庫(kù)。

    使用GPU產(chǎn)生的隨機(jī)性

    以上所有示例都假設(shè)代碼是在一個(gè)CPU上運(yùn)行的。

    這種情況也是有可能的,就是當(dāng)使用GPU訓(xùn)練模型時(shí),可能后端設(shè)置的是使用一套復(fù)雜的GPU庫(kù),這些庫(kù)中有些可能會(huì)引入他們自己的隨機(jī)源,你可能會(huì)或者不會(huì)考慮到這個(gè)。

    例如,有證據(jù)顯示如果你在堆棧中使用了 Nvidia cuDNN,這可能引入額外的隨機(jī)源( introduce additional sources of randomness),并且使結(jié)果不能準(zhǔn)確再現(xiàn)。

    來(lái)自復(fù)雜模型的隨機(jī)性

    由于模型的復(fù)雜性和訓(xùn)練的并行性,你可能會(huì)得到不可復(fù)現(xiàn)的結(jié)果。

    這很可能是由后端庫(kù)的效率造成的,或者是不能在內(nèi)核中使用隨機(jī)數(shù)序列。我自己沒(méi)有遇到過(guò)這個(gè),但是在一些GitHub問(wèn)題和StackOverflowde問(wèn)題中看到了一些案例。

    如果只是縮小成因的范圍的話(huà),你可以嘗試降低模型的復(fù)雜度,看這樣是否影響結(jié)果的再現(xiàn)。

    我建議您閱讀一下你的后端是怎么使用隨機(jī)性的,并看一下是否有任何選項(xiàng)向你開(kāi)放。在Theano中,參考:

    在TensorFlow中,參考:

    Constants, Sequences, and Random Values

    tf.set_random_seed

    另外,為了更深入地了解,考慮一下尋找擁有同樣問(wèn)題的其他人。一些很好的搜尋平臺(tái)包括GitHub、StackOverflow 和 CrossValidated。

    總 結(jié)

    在本教程中,你了解了如何在Keras上得到神經(jīng)網(wǎng)絡(luò)模型的可重復(fù)結(jié)果。特別是,你學(xué)習(xí)到了:

    • 神經(jīng)網(wǎng)絡(luò)是有意設(shè)計(jì)成隨機(jī)的,固定隨機(jī)源可以使結(jié)果可復(fù)現(xiàn)。

    • 你可以為NumPy和TensorFlow的隨機(jī)數(shù)生成器設(shè)置種子點(diǎn),這將使大多數(shù)的Keras代碼100%的可重復(fù)使用。

    • 在有些情況下存在另外的隨機(jī)源,并且你知道如何找出他們,或許也是固定它們。

    via machine learning mastery,雷鋒網(wǎng)崔靜闖、朱婷編譯

    相關(guān)文章:

    不到 200 行代碼,教你如何用 Keras 搭建生成對(duì)抗網(wǎng)絡(luò)(GAN)

    Keras 之父講解 Keras:幾行代碼就能在分布式環(huán)境訓(xùn)練模型 | Google I/O 2017

    用深度學(xué)習(xí)每次得到的結(jié)果都不一樣,怎么辦?

    分享:
    相關(guān)文章
    當(dāng)月熱門(mén)文章
    最新文章
    請(qǐng)?zhí)顚?xiě)申請(qǐng)人資料
    姓名
    電話(huà)
    郵箱
    微信號(hào)
    作品鏈接
    個(gè)人簡(jiǎn)介
    為了您的賬戶(hù)安全,請(qǐng)驗(yàn)證郵箱
    您的郵箱還未驗(yàn)證,完成可獲20積分喲!
    請(qǐng)驗(yàn)證您的郵箱
    立即驗(yàn)證
    完善賬號(hào)信息
    您的賬號(hào)已經(jīng)綁定,現(xiàn)在您可以設(shè)置密碼以方便用郵箱登錄
    立即設(shè)置 以后再說(shuō)
    主站蜘蛛池模板: 亚洲日本韩国欧美云霸高清| 国产主播福利精品一区二区| 狠狠色噜噜狠狠狠狠7777米奇| 亚洲色一色噜一噜噜噜| 91视频操| 亚洲一区在线成人av| 91视频在| 中文字幕欧美人妻精品| 国产成人亚洲精品另类动态| 好吊妞视频这里有精品| 国产黄a三级三级| 国产人妻精品一二区| 亚洲天堂视频在线播放| 激情综合色区网激情五月| 精品人妻免费看一区二区三区| 国产精品三级在线观看不卡 | 亚洲色成人网站www永久下载| 吃奶呻吟打开双腿做受动态图| 91免费| 人妻在线免费观看视频| 久久69国产精品久久69软件| 久久se精品一区二区三区| 深夜国产成人福利在线观看| 一区二区日韩无码| 亚洲国产精品yw在线观看| 精品无码成人片一区二区98| 日本一区二区久久人妻高清| 久久av高潮av无码av喷吹| 亚洲无码一二| 久久久久国产精品免费免费搜索| 日韩色无码一级毛片一区二区-百 男女真实无遮挡xx00动态图软件 亚洲欧美久久夜夜综合伊人 | 亚洲中文字幕一二三四五六| 久久精品第九区免费观看| 一个人看的www日本高清视频| 国产gay高中生小鲜肉屁股| 污污网站18禁在线永久免费观看| 九九全国免费视频| 国产伊人久久 | 蜜桃无码一区二区三区| 少妇性bbb搡bbb爽爽爽欧美| 亚洲精品网站在线观看不卡无广告|