<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 功能強大 支持多語言、二開方便! 廣告
                # 在 Python 和 Keras 中對深度學習模型使用學習率調度 > 原文: [https://machinelearningmastery.com/using-learning-rate-schedules-deep-learning-models-python-keras/](https://machinelearningmastery.com/using-learning-rate-schedules-deep-learning-models-python-keras/) 訓練神經網絡或大型深度學習模型是一項困難的優化任務。 訓練神經網絡的經典算法稱為[隨機梯度下降](http://machinelearningmastery.com/gradient-descent-for-machine-learning/)。已經確定,通過使用在訓練期間發生變化的學習率,您可以在某些問題上實現更高的表現和更快的訓練。 在這篇文章中,您將了解如何使用 Keras 深度學習庫在 Python 中為神經網絡模型使用不同的學習率調度。 閱讀這篇文章后你會知道: * 如何配置和評估基于時間的學習率調度。 * 如何配置和評估基于丟棄的學習率調度。 讓我們開始吧。 * **2017 年 3 月更新**:更新了 Keras 2.0.2,TensorFlow 1.0.1 和 Theano 0.9.0 的示例。 ![Using Learning Rate Schedules for Deep Learning Models in Python with Keras](https://img.kancloud.cn/fa/b7/fab725df41b2d6c9afe45dfed6384a2c_640x427.png) 使用 Keras 在 Python 中使用深度學習模型的學習率調度[哥倫比亞 GSAPP](https://www.flickr.com/photos/gsapponline/17050523800/) ,保留一些權利。 ## 訓練模型的學習率表 調整隨機梯度下降優化程序的學習率可以提高表現并縮短訓練時間。 有時這稱為學習率退火或自適應學習率。在這里,我們將此方法稱為學習率調度,默認計劃是使用恒定學習率來更新每個訓練時期的網絡權重。 在訓練期間最簡單且可能最常用的學習率調整是隨時間降低學習率的技術。當使用較大的學習率值時,這些具有在訓練過程開始時進行大的改變的益處,并且降低學習率,使得在訓練過程中稍后對權重進行較小的速率并因此進行較小的訓練更新。 這具有早期快速學習良好權重并稍后對其進行微調的效果。 兩個流行且易于使用的學習率表如下: * 根據時代逐漸降低學習率。 * 在特定時期使用間斷大滴,降低學習率。 接下來,我們將看看如何使用 Keras 依次使用這些學習率調度。 ## 基于時間的學習費率表 Keras 內置了基于時間的學習率調度。 SGD 類中的隨機梯度下降優化算法實現具有稱為衰減的參數。該參數用于基于時間的學習率衰減調度方程如下: ```py LearningRate = LearningRate * 1/(1 + decay * epoch) ``` 當衰減參數為零(默認值)時,這對學習率沒有影響。 ```py LearningRate = 0.1 * 1/(1 + 0.0 * 1) LearningRate = 0.1 ``` 當指定衰減參數時,它將使學習率從前一個迭代減少給定的固定量。 例如,如果我們使用 0.1 的初始學習率值和 0.001 的衰減,前 5 個時期將調整學習率如下: ```py Epoch Learning Rate 1 0.1 2 0.0999000999 3 0.0997006985 4 0.09940249103 5 0.09900646517 ``` 將其延伸到 100 個時期將產生以下學習率(y 軸)與時期(x 軸)的關系圖: ![Time-Based Learning Rate Schedule](https://img.kancloud.cn/a5/79/a579bc8ee0406bbe01b091a0294bff73_355x282.png) 基于時間的學習費率表 您可以通過設置衰減值來創建一個不錯的默認計劃,如下所示: ```py Decay = LearningRate / Epochs Decay = 0.1 / 100 Decay = 0.001 ``` 以下示例演示了在 Keras 中使用基于時間的學習率適應計劃。 它在[電離層二元分類問題](http://archive.ics.uci.edu/ml/datasets/Ionosphere)上得到證實。這是一個小型數據集,您可以從 UCI 機器學習庫下載[。使用文件名 ionosphere.csv 將數據文件放在工作目錄中。](http://archive.ics.uci.edu/ml/machine-learning-databases/ionosphere/ionosphere.data) 電離層數據集適用于使用神經網絡進行實踐,因為所有輸入值都是相同比例的小數值。 構建一個小型神經網絡模型,其中一個隱藏層具有 34 個神經元并使用整流器激活函數。輸出層具有單個神經元并使用 S 形激活函數以輸出類似概率的值。 隨機梯度下降的學習率已設定為 0.1 的較高值。模型訓練 50 個時期,衰減參數設置為 0.002,計算為 0.1 / 50。此外,在使用自適應學習率時使用動量可能是個好主意。在這種情況下,我們使用動量值 0.8。 下面列出了完整的示例。 ```py # Time Based Learning Rate Decay from pandas import read_csv import numpy from keras.models import Sequential from keras.layers import Dense from keras.optimizers import SGD from sklearn.preprocessing import LabelEncoder # fix random seed for reproducibility seed = 7 numpy.random.seed(seed) # load dataset dataframe = read_csv("ionosphere.csv", header=None) dataset = dataframe.values # split into input (X) and output (Y) variables X = dataset[:,0:34].astype(float) Y = dataset[:,34] # encode class values as integers encoder = LabelEncoder() encoder.fit(Y) Y = encoder.transform(Y) # create model model = Sequential() model.add(Dense(34, input_dim=34, kernel_initializer='normal', activation='relu')) model.add(Dense(1, kernel_initializer='normal', activation='sigmoid')) # Compile model epochs = 50 learning_rate = 0.1 decay_rate = learning_rate / epochs momentum = 0.8 sgd = SGD(lr=learning_rate, momentum=momentum, decay=decay_rate, nesterov=False) model.compile(loss='binary_crossentropy', optimizer=sgd, metrics=['accuracy']) # Fit the model model.fit(X, Y, validation_split=0.33, epochs=epochs, batch_size=28, verbose=2) ``` 該模型在 67%的數據集上進行訓練,并使用 33%的驗證數據集進行評估。 運行該示例顯示分類準確度為 99.14%。如果沒有學習率下降或動量,這高于 95.69%的基線。 ```py ... Epoch 45/50 0s - loss: 0.0622 - acc: 0.9830 - val_loss: 0.0929 - val_acc: 0.9914 Epoch 46/50 0s - loss: 0.0695 - acc: 0.9830 - val_loss: 0.0693 - val_acc: 0.9828 Epoch 47/50 0s - loss: 0.0669 - acc: 0.9872 - val_loss: 0.0616 - val_acc: 0.9828 Epoch 48/50 0s - loss: 0.0632 - acc: 0.9830 - val_loss: 0.0824 - val_acc: 0.9914 Epoch 49/50 0s - loss: 0.0590 - acc: 0.9830 - val_loss: 0.0772 - val_acc: 0.9828 Epoch 50/50 0s - loss: 0.0592 - acc: 0.9872 - val_loss: 0.0639 - val_acc: 0.9828 ``` ## 基于丟棄的學習率調度 與深度學習模型一起使用的另一種流行的學習率調度是在訓練期間的特定時間系統地降低學習率。 通常,通過將學習率降低每個固定數量的迭代的一半來實現該方法。例如,我們可能具有 0.1 的初始學習率并且每 10 個時期將其降低 0.5。前 10 個訓練時期將使用 0.1 的值,在接下來的 10 個時期中將使用 0.05 的學習率,依此類推。 如果我們將此示例的學習率繪制到 100 個時期,您將得到下圖,顯示學習率(y 軸)與時期(x 軸)。 ![Drop Based Learning Rate Schedule](https://img.kancloud.cn/2d/71/2d715808df0284ab124cab7cc9a3186c_355x283.png) 基于丟棄的學習率調度 在擬合模型時,我們可以使用 [LearningRateScheduler](http://keras.io/callbacks/) 回調在 Keras 中實現此功能。 LearningRateScheduler 回調允許我們定義一個調用函數,該函數將迭代號作為參數,并返回用于隨機梯度下降的學習率。使用時,忽略隨機梯度下降指定的學習率。 在下面的代碼中,我們在 Ionosphere 數據集上的單個隱藏層網絡之前使用相同的示例。定義了一個新的 step_decay()函數來實現等式: ```py LearningRate = InitialLearningRate * DropRate^floor(Epoch / EpochDrop) ``` 其中,InitialLearningRate 是初始學習率,例如 0.1,DropRate 是每次更改學習率時修改的量,例如 0.5,Epoch 是當前的迭代號,EpochDrop 是改變學習率的頻率,例如 10 。 請注意,我們將 SGD 類中的學習率設置為 0,以清楚地表明它未被使用。不過,如果您想在此學習率調度中使用動量,則可以設置新元的動量項。 ```py # Drop-Based Learning Rate Decay import pandas from pandas import read_csv import numpy import math from keras.models import Sequential from keras.layers import Dense from keras.optimizers import SGD from sklearn.preprocessing import LabelEncoder from keras.callbacks import LearningRateScheduler # learning rate schedule def step_decay(epoch): initial_lrate = 0.1 drop = 0.5 epochs_drop = 10.0 lrate = initial_lrate * math.pow(drop, math.floor((1+epoch)/epochs_drop)) return lrate # fix random seed for reproducibility seed = 7 numpy.random.seed(seed) # load dataset dataframe = read_csv("ionosphere.csv", header=None) dataset = dataframe.values # split into input (X) and output (Y) variables X = dataset[:,0:34].astype(float) Y = dataset[:,34] # encode class values as integers encoder = LabelEncoder() encoder.fit(Y) Y = encoder.transform(Y) # create model model = Sequential() model.add(Dense(34, input_dim=34, kernel_initializer='normal', activation='relu')) model.add(Dense(1, kernel_initializer='normal', activation='sigmoid')) # Compile model sgd = SGD(lr=0.0, momentum=0.9, decay=0.0, nesterov=False) model.compile(loss='binary_crossentropy', optimizer=sgd, metrics=['accuracy']) # learning schedule callback lrate = LearningRateScheduler(step_decay) callbacks_list = [lrate] # Fit the model model.fit(X, Y, validation_split=0.33, epochs=50, batch_size=28, callbacks=callbacks_list, verbose=2) ``` 運行該示例會導致驗證數據集的分類準確率達到 99.14%,這也是問題模型基線的改進。 ```py ... Epoch 45/50 0s - loss: 0.0546 - acc: 0.9830 - val_loss: 0.0634 - val_acc: 0.9914 Epoch 46/50 0s - loss: 0.0544 - acc: 0.9872 - val_loss: 0.0638 - val_acc: 0.9914 Epoch 47/50 0s - loss: 0.0553 - acc: 0.9872 - val_loss: 0.0696 - val_acc: 0.9914 Epoch 48/50 0s - loss: 0.0537 - acc: 0.9872 - val_loss: 0.0675 - val_acc: 0.9914 Epoch 49/50 0s - loss: 0.0537 - acc: 0.9872 - val_loss: 0.0636 - val_acc: 0.9914 Epoch 50/50 0s - loss: 0.0534 - acc: 0.9872 - val_loss: 0.0679 - val_acc: 0.9914 ``` ## 使用學習率調度的提示 本節列出了在使用神經網絡學習率調度時要考慮的一些提示和技巧。 * **提高初始學習率**。因為學習率很可能會降低,所以從較大的值開始減少。較大的學習率將導致權重的更大變化,至少在開始時,允許您稍后從微調中受益。 * **使用大動量**。當您的學習率縮小到較小值時,使用較大的動量值將有助于優化算法繼續在正確的方向上進行更新。 * **嘗試不同的時間表**。目前還不清楚使用哪種學習率調度,因此請嘗試使用不同的配置選項,看看哪種方法最適合您的問題。還可以嘗試以指數方式更改的計劃,甚至可以計劃響應模型在訓練或測試數據集上的準確性的計劃。 ## 摘要 在這篇文章中,您發現了用于訓練神經網絡模型的學習率調度。 閱讀這篇文章后,您了解到: * 如何在 Keras 中配置和使用基于時間的學習費率表。 * 如何在 Keras 開發自己的基于 drop 的學習率調度。 您對神經網絡或此帖子的學習率表有任何疑問嗎?在評論中提出您的問題,我會盡力回答。
                  <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>

                              哎呀哎呀视频在线观看