0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

深度學(xué)習(xí)中的學(xué)習(xí)率調(diào)節(jié)實(shí)踐

454398 ? 來源:alpha007 ? 作者:alpha007 ? 2022-11-16 17:53 ? 次閱讀

多層感知器多層感知器(MLP)是由一個(gè)輸入層、一個(gè)或多個(gè)隱藏層和一個(gè)稱為輸出層的最終層組成的人工神經(jīng)網(wǎng)絡(luò)(ANN)。通常,靠近輸入層的層稱為較低層,靠近輸出層的層稱為外層,除輸出層外的每一層都包含一個(gè)偏置神經(jīng)元,并與下一層完全相連。當(dāng)一個(gè) ANN 包含一個(gè)很深的隱藏層時(shí),它被稱為深度神經(jīng)網(wǎng)絡(luò)(DNN)。

在本文中,我們將在 MNIST 數(shù)據(jù)集上訓(xùn)練一個(gè)深度 MLP,并通過指數(shù)增長來尋找最佳學(xué)習(xí)率,繪制損失圖,并找到損失增長的點(diǎn),以達(dá)到 85%以上的準(zhǔn)確率。對(duì)于最佳的實(shí)踐過程,我們將實(shí)現(xiàn)早期停止,保存檢查點(diǎn),并使用 TensorBoard 繪制學(xué)習(xí)曲線。你可以在這里查看 jupyter Notebook:https://github.com/lukenew2/learning_rates_and_best_practices/blob/master/optimal_learning_rates_with_keras_api.ipynb 指數(shù)學(xué)習(xí)率學(xué)習(xí)率可以說是最重要的超參數(shù)。一般情況下,最佳學(xué)習(xí)速率約為最大學(xué)習(xí)速率(即訓(xùn)練算法偏離的學(xué)習(xí)速率)的一半。找到一個(gè)好的學(xué)習(xí)率的一個(gè)方法是訓(xùn)練模型進(jìn)行幾百次迭代,從非常低的學(xué)習(xí)率(例如,1e-5)開始,逐漸增加到非常大的值(例如,10)。這是通過在每次迭代時(shí)將學(xué)習(xí)速率乘以一個(gè)常數(shù)因子來實(shí)現(xiàn)的。如果你將損失描繪為學(xué)習(xí)率的函數(shù),你應(yīng)該首先看到它在下降,但過一段時(shí)間后,學(xué)習(xí)率會(huì)變得很高,這時(shí)損失會(huì)迅速回升:最佳學(xué)習(xí)率將略低于轉(zhuǎn)折點(diǎn),然后你可以重新初始化你的模型,并使用此良好的學(xué)習(xí)率對(duì)其進(jìn)行正常訓(xùn)練。Keras 模型我們先導(dǎo)入相關(guān)庫 import osimport matplotlib.pyplot as pltimport numpy as npimport pandas as pd

PROJECT_ROOT_DIR = "."IMAGES_PATH = os.path.join(PROJECT_ROOT_DIR, "images")os.makedirs(IMAGES_PATH, exist_ok=True)

def save_fig(fig_id, tight_layout=True, fig_extension="png", resolution=300): path = os.path.join(IMAGES_PATH, fig_id + "." + fig_extension) print("Saving figure", fig_id) if tight_layout: plt.tight_layout() plt.savefig(path, format=fig_extension, dpi=resolution)import tensorflow as tffrom tensorflow import keras 接下來加載數(shù)據(jù)集(X_train, y_train), (X_test, y_test) = keras.datasets.fashion_mnist.load_data()

X_train.shape

X_train.dtype 標(biāo)準(zhǔn)化像素 X_valid, X_train = X_train[:5000] / 255.0, X_train[5000:] / 255.0y_valid, y_train = y_train[:5000], y_train[5000:] X_test = X_test / 255.0 讓我們快速看一下數(shù)據(jù)集中的圖像樣本,讓我們感受一下分類任務(wù)的復(fù)雜性:class_names = ["T-shirt/top", "Trouser", "Pullover", "Dress", "Coat", "Sandal", "Shirt", "Sneaker", "Bag", "Ankle boot"]

n_rows = 4n_cols = 10plt.figure(figsize=(n_cols * 1.2, n_rows * 1.2))for row in range(n_rows): for col in range(n_cols): index = n_cols * row + col plt.subplot(n_rows, n_cols, index + 1) plt.imshow(X_train[index], cmap="binary", interpolation="nearest") plt.a(chǎn)xis('off') plt.title(class_names[y_train[index]], fontsize=12)plt.subplots_adjust(wspace=0.2, hspace=0.5)save_fig('fashion_mnist_plot', tight_layout=False)plt.show()

我們已經(jīng)準(zhǔn)備好用 Keras 來建立我們的 MLP。下面是一個(gè)具有兩個(gè)隱藏層的分類 MLP:model = keras.models.Sequential([ keras.layers.Flatten(input_shape=[28,28]), keras.layers.Dense(300, activation="relu"), keras.layers.Dense(100, activation="relu"), keras.layers.Dense(10, activation="softmax")])讓我們一行一行地看這個(gè)代碼:首先,我們創(chuàng)建了一個(gè) Sequential 模型,它是神經(jīng)網(wǎng)絡(luò)中最簡單的 Keras 模型,它只由一堆按順序連接的層組成。接下來,我們構(gòu)建第一層并將其添加到模型中。它是一個(gè) Flatten 層,其目的是將每個(gè)輸入圖像轉(zhuǎn)換成一個(gè) 1D 數(shù)組:如果它接收到輸入數(shù)據(jù) X,則計(jì)算 X.reshape(-1,1)。由于它是模型的第一層,所以應(yīng)該指定其輸入形狀。你也可以添加 keras.layers.InputLayer 作為第一層,設(shè)置其 input_shape=[28,28]下一步,我們添加一個(gè) 300 個(gè)神經(jīng)元的隱藏層,并指定它使用 ReLU 激活函數(shù)。每一個(gè)全連接層管理自己的權(quán)重矩陣,包含神經(jīng)元與其輸入之間的所有連接權(quán)重,同事它還管理一個(gè)偏置向量,每個(gè)神經(jīng)元一個(gè)。然后我們添加了第二個(gè) 100 個(gè)神經(jīng)元的隱藏層,同樣使用 ReLU 激活函數(shù)。最后,我們使用 softmax 激活函數(shù)添加了一個(gè)包含 10 個(gè)神經(jīng)元的輸出層(因?yàn)槲覀兊姆诸惾蝿?wù)是每個(gè)類都是互斥的)。使用回調(diào)在 Keras 中,fit()方法接受一個(gè)回調(diào)參數(shù),該參數(shù)允許你指定 Keras 在訓(xùn)練開始和結(jié)束、每個(gè) epoch 的開始和結(jié)束時(shí),甚至在處理每個(gè) batch 處理之前和之后要調(diào)用對(duì)象的列表。為了實(shí)現(xiàn)指數(shù)級(jí)增長的學(xué)習(xí)率,我們需要?jiǎng)?chuàng)建自己的自定義回調(diào)。我們的回調(diào)接受一個(gè)參數(shù),用于提高學(xué)習(xí)率的因子。為了將損失描繪成學(xué)習(xí)率的函數(shù),我們跟蹤每個(gè) batch 的速率和損失。請(qǐng)注意,我們將函數(shù)定義為 on_batch_end(),這取決于我們的目標(biāo),當(dāng)然也可以是 on_train_begin(), on_train_end(), on_batch_begin()。對(duì)于我們的用例,我們希望在每個(gè)批處理之后提高學(xué)習(xí)率并記錄損失:K = keras.backend

class ExponentialLearningRate(keras.callbacks.Callback): def __init__(self, factor): self.factor = factor self.rates = [] self.losses = [] def on_batch_end(self, batch, logs): self.rates.a(chǎn)ppend(K.get_value(self.model.optimizer.lr)) self.losses.a(chǎn)ppend(logs["loss"]) K.set_value(self.model.optimizer.lr, self.model.optimizer.lr * self.factor)現(xiàn)在我們的模型已經(jīng)創(chuàng)建好了,我們只需調(diào)用它的 compile()方法來指定要使用的 loss 函數(shù)和優(yōu)化器,或者你可以指定要在訓(xùn)練和評(píng)估期間計(jì)算的額外指標(biāo)列表。首先,我們使用“稀疏的分類交叉熵”損失,因?yàn)槲覀冇邢∈璧?a target="_blank">標(biāo)簽(也就是說,對(duì)于每個(gè)實(shí)例,只有一個(gè)目標(biāo)類索引,在我們的例子中,從 0 到 9),并且這些類是互斥的);接下來,我們指定使用隨機(jī)梯度下降,并將學(xué)習(xí)速率初始化為 1e-3,并在每次迭代中增加 0.5%:model.compile(loss="sparse_categorical_crossentropy", optimizer=keras.optimizers.SGD(lr=1e-3), metrics=["accuracy"])expon_lr = ExponentialLearningRate(factor=1.005)現(xiàn)在讓我們訓(xùn)練模型一個(gè) epoch:history = model.fit(X_train, y_train, epochs=1, validation_data=(X_valid, y_valid), callbacks=[expon_lr])我們現(xiàn)在可以將損失繪制為學(xué)習(xí)率的函數(shù):plt.plot(expon_lr.rates, expon_lr.losses)plt.gca().set_xscale('log')plt.hlines(min(expon_lr.losses), min(expon_lr.rates), max(expon_lr.rates))plt.a(chǎn)xis([min(expon_lr.rates), max(expon_lr.rates), 0, expon_lr.losses[0]])plt.xlabel("Learning rate")plt.ylabel("Loss")save_fig("learning_rate_vs_loss")

正如我們所期望的,隨著學(xué)習(xí)率的提高,最初的損失逐漸減少,但過了一段時(shí)間,學(xué)習(xí)率太大,導(dǎo)致?lián)p失反彈:最佳學(xué)習(xí)率將略低于損失開始攀升的點(diǎn)(通常比轉(zhuǎn)折點(diǎn)低 10 倍左右)。我們現(xiàn)在可以重新初始化我們的模型,并使用良好的學(xué)習(xí)率對(duì)其進(jìn)行正常訓(xùn)練。還有更多的學(xué)習(xí)率技巧,包括創(chuàng)建學(xué)習(xí)進(jìn)度表,我希望在以后的調(diào)查中介紹,但對(duì)如何手動(dòng)選擇好的學(xué)習(xí)率有一個(gè)直觀的理解同樣重要。我們的損失在 3e-1 左右開始反彈,所以讓我們嘗試使用 2e-1 作為我們的學(xué)習(xí)率:keras.backend.clear_session()np.random.seed(42)tf.random.set_seed(42)model = keras.models.Sequential([ keras.layers.Flatten(input_shape=[28, 28]), keras.layers.Dense(300, activation="relu"), keras.layers.Dense(100, activation="relu"), keras.layers.Dense(10, activation="softmax")])model.compile(loss="sparse_categorical_crossentropy", optimizer=keras.optimizers.SGD(lr=2e-1), metrics=["accuracy"])使用 TensorBoard 進(jìn)行可視化 TensorBoard 是一個(gè)很好的交互式可視化工具,你可以使用它查看訓(xùn)練期間的學(xué)習(xí)曲線、比較學(xué)習(xí)曲線、可視化計(jì)算圖、分析訓(xùn)練統(tǒng)計(jì)數(shù)據(jù)、查看模型生成的圖像,可視化復(fù)雜的多維數(shù)據(jù)投影到三維和自動(dòng)聚類,等等!這個(gè)工具是在安裝 TensorFlow 時(shí)自動(dòng)安裝的,所以你應(yīng)該已經(jīng)安裝了。讓我們首先定義將用于 TensorBoard 日志的根日志目錄,再加上一個(gè)小函數(shù),該函數(shù)將根據(jù)當(dāng)前時(shí)間生成一個(gè)子目錄路徑,以便每次運(yùn)行時(shí)它都是不同的。你可能需要在日志目錄名稱中包含額外的信息,例如正在測試的超參數(shù)值,以便更容易地了解你在 TensorBoard 中查看的內(nèi)容:root_logdir = os.path.join(os.curdir, "my_logs")

def get_run_logdir(): import time run_id = time.strftime("run_%Y_%m_%d-%H_%M_%S") return os.path.join(root_logdir, run_id)
run_logdir = get_run_logdir() # 例如, './my_logs/run_2020_07_31-15_15_22'Keras api 提供了一個(gè) TensorBoard()回調(diào)函數(shù)。TensorBoard()回調(diào)函數(shù)負(fù)責(zé)創(chuàng)建日志目錄,并在訓(xùn)練時(shí)創(chuàng)建事件文件和編寫摘要(摘要是一種二進(jìn)制數(shù)據(jù)記錄,用于創(chuàng)建可視化 TensorBoard)。每次運(yùn)行有一個(gè)目錄,每個(gè)目錄包含一個(gè)子目錄,分別用于記錄訓(xùn)練日志和驗(yàn)證日志,兩者都包含事件文件,但訓(xùn)練日志也包含分析跟蹤:這使 TensorBoard 能夠準(zhǔn)確地顯示模型在模型的每個(gè)部分(跨越所有設(shè)備)上花費(fèi)了多少時(shí)間,這對(duì)于查找性能瓶頸非常有用。early_stopping_cb = keras.callbacks.EarlyStopping(patience=20)checkpoint_cb = keras.callbacks.ModelCheckpoint("my_fashion_mnist_model.h5", save_best_only=True)tensorboard_cb = keras.callbacks.TensorBoard(run_logdir)
history = model.fit(X_train, y_train, epochs=100, validation_data=(X_valid, y_valid), callbacks=[early_stopping_cb, checkpoint_cb, tensorboard_cb])接下來,我們需要啟動(dòng) TensorBoard 服務(wù)器。我們可以通過運(yùn)行以下命令在 Jupyter 中直接執(zhí)行此操作。第一行加載 TensorBoard 擴(kuò)展,第二行啟動(dòng)端口 6004 上的 TensorBoard 服務(wù)器,并連接到它:%load_ext tensorboard %tensorboard — logdir=./my_logs — port=6004 現(xiàn)在你應(yīng)該可以看到 TensorBoard 的 web 界面。單擊“scaler”選項(xiàng)卡以查看學(xué)習(xí)曲線。在左下角,選擇要可視化的日志(例如,第一次運(yùn)行的訓(xùn)練日志),然后單擊 epoch_loss scaler。請(qǐng)注意,在我們的訓(xùn)練過程中,訓(xùn)練損失下降得很順利。

你還可以可視化整個(gè)圖形、學(xué)習(xí)的權(quán)重(投影到 3D)或分析軌跡。TensorBoard()回調(diào)函數(shù)也有記錄額外數(shù)據(jù)的選項(xiàng),例如 NLP 數(shù)據(jù)集的嵌入。這實(shí)際上是一個(gè)非常有用的可視化工具。結(jié)論在這里我們得到了 88%的準(zhǔn)確率,這是我們可以達(dá)到的最好的深度 MLP。如果我們想進(jìn)一步提高性能,我們可以嘗試卷積神經(jīng)網(wǎng)絡(luò)(CNN),它對(duì)圖像數(shù)據(jù)非常有效。

就我們的目的而言,這就足夠了。我們學(xué)會(huì)了如何:使用 Keras 的 Sequential API 構(gòu)建深度 mlp。通過按指數(shù)增長學(xué)習(xí)率,繪制損失圖,并找到損失重新出現(xiàn)的點(diǎn),來找到最佳學(xué)習(xí)率。構(gòu)建深度學(xué)習(xí)模型時(shí)的最佳實(shí)踐,包括使用回調(diào)和使用 TensorBoard 可視化學(xué)習(xí)曲線。如果你想在這里看到 ppt 或 jupyterNotebook 中完整的代碼和說明,請(qǐng)隨時(shí)查看 Github 存儲(chǔ)庫:https://github.com/lukenew2/learning_rates_and_best_practices。

審核編輯 黃昊宇

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    解析深度學(xué)習(xí):卷積神經(jīng)網(wǎng)絡(luò)原理與視覺實(shí)踐

    解析深度學(xué)習(xí):卷積神經(jīng)網(wǎng)絡(luò)原理與視覺實(shí)踐
    發(fā)表于 06-14 22:21

    什么是深度學(xué)習(xí)?使用FPGA進(jìn)行深度學(xué)習(xí)的好處?

    什么是深度學(xué)習(xí)為了解釋深度學(xué)習(xí),有必要了解神經(jīng)網(wǎng)絡(luò)。神經(jīng)網(wǎng)絡(luò)是一種模擬人腦的神經(jīng)元和神經(jīng)網(wǎng)絡(luò)的計(jì)算模型。作為具體示例,讓我們考慮一個(gè)輸入圖像并識(shí)別圖像
    發(fā)表于 02-17 16:56

    如何估算深度神經(jīng)網(wǎng)絡(luò)的最優(yōu)學(xué)習(xí)(附代碼教程)

    學(xué)習(xí)(learning rate)是調(diào)整深度神經(jīng)網(wǎng)絡(luò)最重要的超參數(shù)之一,本文作者Pavel Surmenok描述了一個(gè)簡單而有效的辦法來幫助你找尋合理的學(xué)習(xí)
    發(fā)表于 12-07 11:05 ?2453次閱讀

    深度學(xué)習(xí)是什么?了解深度學(xué)習(xí)難嗎?讓你快速了解深度學(xué)習(xí)的視頻講解

    深度學(xué)習(xí)是什么?了解深度學(xué)習(xí)難嗎?讓你快速了解深度學(xué)習(xí)的視頻講解本文檔視頻讓你4分鐘快速了解
    發(fā)表于 08-23 14:36 ?16次下載

    機(jī)器學(xué)習(xí)深度學(xué)習(xí)有什么區(qū)別?

    深度學(xué)習(xí)算法現(xiàn)在是圖像處理軟件庫的組成部分。在他們的幫助下,可以學(xué)習(xí)和訓(xùn)練復(fù)雜的功能;但他們的應(yīng)用也不是萬能的。 “機(jī)器學(xué)習(xí)”和“深度
    的頭像 發(fā)表于 03-12 16:11 ?8109次閱讀
    機(jī)器<b class='flag-5'>學(xué)習(xí)</b>和<b class='flag-5'>深度</b><b class='flag-5'>學(xué)習(xí)</b>有什么區(qū)別?

    什么是基于深度學(xué)習(xí)的超分辨

    基于深度學(xué)習(xí)的超分辨是將學(xué)習(xí)的上采樣(up-sampling)函數(shù)應(yīng)用于圖像的過程,目的是增強(qiáng)圖像現(xiàn)有的像素?cái)?shù)據(jù)或生成合理的新像素?cái)?shù)據(jù),
    的頭像 發(fā)表于 05-24 09:33 ?2681次閱讀
    什么是基于<b class='flag-5'>深度</b><b class='flag-5'>學(xué)習(xí)</b>的超分辨<b class='flag-5'>率</b>

    什么是深度學(xué)習(xí)優(yōu)化算法

    先大致講一下什么是深度學(xué)習(xí)優(yōu)化算法吧,我們可以把模型比作函數(shù),一種很復(fù)雜的函數(shù):h(f(g(k(x)))),函數(shù)有參數(shù),這些參數(shù)是未知的,深度學(xué)習(xí)
    的頭像 發(fā)表于 02-13 15:31 ?1502次閱讀
    什么是<b class='flag-5'>深度</b><b class='flag-5'>學(xué)習(xí)</b><b class='flag-5'>中</b>優(yōu)化算法

    什么是深度學(xué)習(xí)算法?深度學(xué)習(xí)算法的應(yīng)用

    。 在深度學(xué)習(xí),使用了一些快速的算法,比如卷積神經(jīng)網(wǎng)絡(luò)以及深度神經(jīng)網(wǎng)絡(luò),這些算法在大量數(shù)據(jù)處理和圖像識(shí)別上面有著非常重要的作用。 深度
    的頭像 發(fā)表于 08-17 16:03 ?2018次閱讀

    深度學(xué)習(xí)框架pytorch入門與實(shí)踐

    深度學(xué)習(xí)框架pytorch入門與實(shí)踐 深度學(xué)習(xí)是機(jī)器學(xué)習(xí)
    的頭像 發(fā)表于 08-17 16:03 ?1521次閱讀

    深度學(xué)習(xí)框架是什么?深度學(xué)習(xí)框架有哪些?

    深度學(xué)習(xí)框架是什么?深度學(xué)習(xí)框架有哪些?? 深度學(xué)習(xí)框架是一種軟件工具,它可以幫助開發(fā)者輕松快速
    的頭像 發(fā)表于 08-17 16:03 ?2595次閱讀

    深度學(xué)習(xí)框架和深度學(xué)習(xí)算法教程

    基于神經(jīng)網(wǎng)絡(luò)的機(jī)器學(xué)習(xí)方法。 深度學(xué)習(xí)算法可以分為兩大類:監(jiān)督學(xué)習(xí)和無監(jiān)督學(xué)習(xí)。監(jiān)督學(xué)習(xí)的基本任
    的頭像 發(fā)表于 08-17 16:11 ?1010次閱讀

    深度學(xué)習(xí)在語音識(shí)別的應(yīng)用及挑戰(zhàn)

    一、引言 隨著深度學(xué)習(xí)技術(shù)的快速發(fā)展,其在語音識(shí)別領(lǐng)域的應(yīng)用也日益廣泛。深度學(xué)習(xí)技術(shù)可以有效地提高語音識(shí)別的精度和效率,并且被廣泛應(yīng)用于各種應(yīng)用場景。本文將探討
    的頭像 發(fā)表于 10-10 18:14 ?797次閱讀

    GPU在深度學(xué)習(xí)的應(yīng)用與優(yōu)勢

    人工智能的飛速發(fā)展,深度學(xué)習(xí)作為其重要分支,正在推動(dòng)著諸多領(lǐng)域的創(chuàng)新。在這個(gè)過程,GPU扮演著不可或缺的角色。就像超級(jí)英雄電影的主角一樣,GPU在
    的頭像 發(fā)表于 12-06 08:27 ?1159次閱讀
    GPU在<b class='flag-5'>深度</b><b class='flag-5'>學(xué)習(xí)</b><b class='flag-5'>中</b>的應(yīng)用與優(yōu)勢

    深度學(xué)習(xí)的無監(jiān)督學(xué)習(xí)方法綜述

    應(yīng)用往往難以實(shí)現(xiàn)。因此,無監(jiān)督學(xué)習(xí)深度學(xué)習(xí)扮演著越來越重要的角色。本文旨在綜述深度
    的頭像 發(fā)表于 07-09 10:50 ?301次閱讀

    深度學(xué)習(xí)的時(shí)間序列分類方法

    的發(fā)展,基于深度學(xué)習(xí)的TSC方法逐漸展現(xiàn)出其強(qiáng)大的自動(dòng)特征提取和分類能力。本文將從多個(gè)角度對(duì)深度學(xué)習(xí)在時(shí)間序列分類的應(yīng)用進(jìn)行綜述,探討常用
    的頭像 發(fā)表于 07-09 15:54 ?562次閱讀