<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??碼云GVP開源項目 12k star Uniapp+ElementUI 功能強大 支持多語言、二開方便! 廣告
                # 如何使用 Keras 獲得可重現的結果 > 原文: [https://machinelearningmastery.com/reproducible-results-neural-networks-keras/](https://machinelearningmastery.com/reproducible-results-neural-networks-keras/) 神經網絡算法是隨機的。 這意味著它們利用隨機性,例如初始化為隨機權重,反過來,在相同數據上訓練的相同網絡可以產生不同的結果。 這可能會讓初學者感到困惑,因為算法似乎不穩定,實際上它們是設計的。隨機初始化允許網絡學習正在學習的函數的良好近似。 然而,有時候每次在相同的數據上訓練相同的網絡時,您需要完全相同的結果。比如教程,或者可能是操作上的。 在本教程中,您將了解如何為隨機數生成器設定種子,以便每次都可以從同一網絡中獲取相同數據的相同結果。 讓我們開始吧。 ![How to Get Reproducible Results from Neural Networks with Keras](https://img.kancloud.cn/c3/1a/c31a0d101e4a269bf9c241024419938a_640x400.png) 如何從 Keras 的神經網絡獲得可重現的結果 照片由 [Samuel John](https://www.flickr.com/photos/samueljohn/6129216625/) ,保留一些權利。 ## 教程概述 本教程分為 6 個部分。他們是: 1. 為什么每次都會得到不同的結果? 2. 證明不同的結果 3. 解決方案 4. 種子隨機數與 Theano 后端 5. 種子隨機數與 TensorFlow 后端 6. 如果我仍然得到不同的結果怎么辦? ### 環境 本教程假定您已安裝 Python SciPy 環境。您可以在此示例中使用 Python 2 或 3。 本教程假設您使用 TensorFlow(v1.1.0 +)或 Theano(v0.9 +)后端安裝了 Keras(v2.0.3 +)。 本教程還假設您安裝了 scikit-learn,Pandas,NumPy 和 Matplotlib。 如果您在設置 Python 環境時需要幫助,請參閱以下帖子: * [如何使用 Anaconda 設置用于機器學習和深度學習的 Python 環境](http://machinelearningmastery.com/setup-python-environment-machine-learning-deep-learning-anaconda/) ## 為什么每次都會得到不同的結果? 這是我從初學者到神經網絡和深度學習領域的常見問題。 這種誤解也可能以下列問題的形式出現: * _ 如何獲得穩定的結果?_ * _ 如何獲得可重復的結果?_ * _ 我應該使用什么種子?_ 神經網絡通過設計使用隨機性,以確保它們有效地學習與問題近似的函數。使用隨機性是因為這類機器學習算法比沒有它更好。 神經網絡中最常用的隨機形式是網絡權重的隨機初始化。雖然隨機性可用于其他領域,但這里只是一個簡短的列表: * 初始化中的隨機性,例如權重。 * 正則化中的隨機性,例如dropout。 * 層中的隨機性,例如單詞嵌入。 * 優化中的隨機性,例如隨機優化。 這些隨機性來源等等意味著當您在完全相同的數據上運行完全相同的神經網絡算法時,您可以保證得到不同的結果。 有關隨機算法背后原因的更多信息,請參閱帖子: * [在機器學習中擁抱隨機性](http://machinelearningmastery.com/randomness-in-machine-learning/) ## 證明不同的結果 我們可以用一個小例子來證明神經網絡的隨機性。 在本節中,我們將開發一個多層感知器模型,以學習從 0.0 到 0.9 增加 0.1 的短序列。給定 0.0,模型必須預測 0.1;給定 0.1,模型必須輸出 0.2;等等。 下面列出了準備數據的代碼。 ```py # 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] ``` 我們將使用一個輸入的網絡,隱藏層中的 10 個神經元和 1 個輸出。網絡將使用均方誤差丟失函數,并將使用有效的 ADAM 算法進行訓練。 網絡需要大約 1000 個時代來有效地解決這個問題,但我們只會訓練它 100 個時代。這是為了確保我們得到一個在進行預測時出錯的模型。 在訓練網絡之后,我們將對數據集進行預測并打印均方誤差。 網絡代碼如下所示。 ```py # 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])) ``` 在該示例中,我們將創建網絡 10 次并打印 10 個不同的網絡分數。 完整的代碼清單如下。 ```py 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) ``` 運行該示例將在每行中打印不同的精度。 您的具體結果會有所不同。下面提供了一個示例輸出。 ```py 0.0282584265697 0.0457025913022 0.145698137198 0.0873461454407 0.0309397604521 0.046649185173 0.0958450337178 0.0130660263779 0.00625176026631 0.00296055161492 ``` ## 解決方案 這是兩個主要的解決方案。 ### 解決方案#1:重復您的實驗 解決此問題的傳統和實用方法是多次運行您的網絡(30+)并使用統計數據來總結模型的表現,并將您的模型與其他模型進行比較。 我強烈推薦這種方法,但由于某些型號的訓練時間很長,因此并不總是可行。 有關此方法的更多信息,請參閱: * [如何評估深度學習模型的技巧](http://machinelearningmastery.com/evaluate-skill-deep-learning-models/) ### 解決方案#2:為隨機數生成器播種 或者,另一種解決方案是使用固定種子作為隨機數發生器。 使用偽隨機數生成器生成隨機數。隨機數生成器是一種數學函數,它將生成一個長序列的數字,這些數字足夠隨機用于通用目的,例如機器學習算法。 隨機數生成器需要種子來啟動進程,并且通常在大多數實現中使用當前時間(以毫秒為單位)作為默認值。這是為了確保每次運行代碼時都會生成不同的隨機數序列,默認情況下。 也可以使用特定數字(例如“1”)指定此種子,以確保每次運行代碼時都生成相同的隨機數序列。 只要每次運行代碼時,特定的種子值都無關緊要。 設置隨機數生成器的具體方法因后端而異,我們將在 Theano 和 TensorFlow 中查看如何執行此操作。 ## 種子隨機數與 Theano 后端 通常,Keras 從 NumPy 隨機數生成器獲得隨機源。 在大多數情況下,Theano 后端也是如此。 我們可以通過從隨機模塊調用 [seed()函數](https://docs.scipy.org/doc/numpy/reference/generated/numpy.random.seed.html)來播種 NumPy 隨機數生成器,如下所示: ```py from numpy.random import seed seed(1) ``` 導入和調用種子函數最好在代碼文件的頂部完成。 這是[最佳實踐](https://github.com/fchollet/keras/issues/439),因為即使在直接使用它們之前,當各種 Keras 或 Theano(或其他)庫作為初始化的一部分導入時,可能會使用某些隨機性。 我們可以將兩行添加到上面示例的頂部并運行兩次。 每次運行代碼時都應該看到相同的均方誤差值列表(可能由于不同機器上的精度而有一些微小的變化),如下所示: ```py 0.169326527063 2.75750621228e-05 0.0183287291562 1.93553737255e-07 0.0549871087449 0.0906326807824 0.00337575114075 0.00414857518259 8.14587362008e-08 0.0522927019639 ``` 您的結果應與我的匹配(忽略精確度的微小差異)。 ## 種子隨機數與 TensorFlow 后端 Keras 確實從 NumPy 隨機數生成器獲得隨機源,因此無論您使用的是 Theano 還是 TensorFlow 后端,都必須播種。 必須通過在任何其他導入或其他代碼之前調用文件頂部的 [seed()函數](https://docs.scipy.org/doc/numpy/reference/generated/numpy.random.seed.html)來播種。 ```py from numpy.random import seed seed(1) ``` 此外,TensorFlow 還有自己的隨機數生成器,必須通過在 NumPy 隨機數生成器之后立即調用 [set_random_seed()函數](https://www.tensorflow.org/api_docs/python/tf/set_random_seed)來播種,如下所示: ```py from tensorflow import set_random_seed set_random_seed(2) ``` 為了清楚起見,代碼文件的頂部必須在任何其他文件之前有以下 4 行; ```py from numpy.random import seed seed(1) from tensorflow import set_random_seed set_random_seed(2) ``` 您可以為兩種或不同的種子使用相同的種子。我不認為隨機性來源進入不同的過程會產生很大的不同。 將這 4 行添加到上面的示例將允許代碼在每次運行時生成相同的結果。您應該看到與下面列出的相同的均方誤差值(由于不同機器上的精度,可能會有一些微小的變化): ```py 0.224045112999 0.00154879478823 0.00387589994044 0.0292376881968 0.00945528404353 0.013305765525 0.0206255228201 0.0359538356108 0.00441943512128 0.298706569397 ``` 您的結果應與我的匹配(忽略精確度的微小差異)。 ## 如果我仍然得到不同的結果怎么辦? 要重新迭代,最有效的報告結果和比較模型的方法是多次重復實驗(30+)并使用匯總統計。 如果無法做到這一點,您可以通過為代碼使用的隨機數生成器播種獲得 100%可重復的結果。上述解決方案應涵蓋大多數情況,但不是全部。 如果您遵循上述說明并仍然在相同數據上獲得相同算法的不同結果,該怎么辦? 您可能還有其他未考慮的隨機性來源。 ### 來自第三方庫的隨機性 也許你的代碼使用了一個額外的庫,它使用了一個也必須種子的不同隨機數生成器。 嘗試將代碼切換回所需的最低要求(例如,一個數據樣本,一個訓練時期等)并仔細閱讀 API 文檔,以便縮小引入隨機性的其他第三方庫。 ### 使用 GPU 的隨機性 以上所有示例均假設代碼在 CPU 上運行。 當使用 GPU 訓練模型時,后端可能被配置為使用復雜的 GPU 庫堆棧,其中一些可能會引入他們自己或可能無法解釋的隨機源。 例如,有一些證據表明,如果您在堆棧中使用 [Nvidia cuDNN](https://developer.nvidia.com/cudnn) ,則[可能會引入其他隨機源](https://github.com/fchollet/keras/issues/2479#issuecomment-213987747)并阻止您的結果的完全重現性。 ### 來自復雜模型的隨機性 由于您的模型的復雜性和訓練的平行性,您可能會得到不可重復的結果。 這很可能是由后端庫產生的效率引起的,也許是因為無法跨核心使用隨機數序列。 我自己沒有看到這個,但看到一些 GitHub 問題和 StackOverflow 問題的跡象。 您可以嘗試降低模型的復雜性,看看這是否會影響結果的可重復性,只是為了縮小原因。 我建議您閱讀后端如何使用隨機性,看看是否有任何選項可供您使用。 在 Theano,請參閱: * [隨機數](http://deeplearning.net/software/theano/sandbox/randomnumbers.html) * [友好的隨機數](http://deeplearning.net/software/theano/library/tensor/shared_randomstreams.html) * [使用隨機數](http://deeplearning.net/software/theano/tutorial/examples.html#using-random-numbers) 在 TensorFlow 中,請參閱: * [常數,序列和隨機值](https://www.tensorflow.org/api_guides/python/constant_op) * [tf.set_random_seed](https://www.tensorflow.org/api_docs/python/tf/set_random_seed) 此外,請考慮搜索具有相同問題的其他人以獲得進一步的洞察力。一些很棒的搜索地點包括: * [GrasHub 上的 Keras 問題](https://github.com/fchollet/keras/issues) * [The On 對 Github 的問題](https://github.com/Theano/Theano/issues) * [GitHub 上的 TensorFlow 問題](https://github.com/tensorflow/tensorflow/issues) * [StackOverflow 通用編程 Q&amp; A](http://stackoverflow.com/) * [CrossValidated 機器學習 Q&amp; A](https://stats.stackexchange.com/) ## 摘要 在本教程中,您了解了如何在 Keras 中獲得可重現的神經網絡模型結果。 具體來說,你學到了: * 神經網絡在設計上是隨機的,并且可以固定隨機源以使結果可重復。 * 您可以在 NumPy 和 TensorFlow 中播種隨機數生成器,這將使大多數 Keras 代碼 100%可重現。 * 在某些情況下,存在其他隨機源,并且您有關于如何尋找它們的想法,也許也可以修復它們。 本教程有幫助嗎? 在評論中分享您的經驗。 您是否仍然可以通過 Keras 獲得無法重現的結果? 分享您的經驗;也許這里的其他人可以幫忙。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看