深度學(xué)習(xí)的學(xué)習(xí)率調(diào)節(jié)實(shí)踐
多層感知器多層感知器(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ù)增長(zhǎng)來尋找最佳學(xué)習(xí)率,繪制損失圖,并找到損失增長(zhǎng)的點(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ò)中最簡(jiǎn)單的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í)增長(zhǎng)的學(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)槲覀冇邢∈璧臉?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")
發(fā)表評(píng)論
請(qǐng)輸入評(píng)論內(nèi)容...
請(qǐng)輸入評(píng)論/評(píng)論長(zhǎng)度6~500個(gè)字
最新活動(dòng)更多
-
10月31日立即下載>> 【限時(shí)免費(fèi)下載】TE暖通空調(diào)系統(tǒng)高效可靠的組件解決方案
-
即日-11.13立即報(bào)名>>> 【在線會(huì)議】多物理場(chǎng)仿真助跑新能源汽車
-
11月28日立即報(bào)名>>> 2024工程師系列—工業(yè)電子技術(shù)在線會(huì)議
-
12月19日立即報(bào)名>> 【線下會(huì)議】OFweek 2024(第九屆)物聯(lián)網(wǎng)產(chǎn)業(yè)大會(huì)
-
即日-12.26火熱報(bào)名中>> OFweek2024中國智造CIO在線峰會(huì)
-
即日-2025.8.1立即下載>> 《2024智能制造產(chǎn)業(yè)高端化、智能化、綠色化發(fā)展藍(lán)皮書》
推薦專題
- 1 【一周車話】沒有方向盤和踏板的車,你敢坐嗎?
- 2 特斯拉發(fā)布無人駕駛車,還未迎來“Chatgpt時(shí)刻”
- 3 特斯拉股價(jià)大跌15%:Robotaxi離落地還差一個(gè)蘿卜快跑
- 4 馬斯克給的“驚喜”夠嗎?
- 5 打完“價(jià)格戰(zhàn)”,大模型還要比什么?
- 6 馬斯克致敬“國產(chǎn)蘿卜”?
- 7 神經(jīng)網(wǎng)絡(luò),誰是盈利最強(qiáng)企業(yè)?
- 8 比蘋果偉大100倍!真正改寫人類歷史的智能產(chǎn)品降臨
- 9 諾獎(jiǎng)進(jìn)入“AI時(shí)代”,人類何去何從?
- 10 Open AI融資后成萬億獨(dú)角獸,AI人才之爭(zhēng)開啟
- 高級(jí)軟件工程師 廣東省/深圳市
- 自動(dòng)化高級(jí)工程師 廣東省/深圳市
- 光器件研發(fā)工程師 福建省/福州市
- 銷售總監(jiān)(光器件) 北京市/海淀區(qū)
- 激光器高級(jí)銷售經(jīng)理 上海市/虹口區(qū)
- 光器件物理工程師 北京市/海淀區(qū)
- 激光研發(fā)工程師 北京市/昌平區(qū)
- 技術(shù)專家 廣東省/江門市
- 封裝工程師 北京市/海淀區(qū)
- 結(jié)構(gòu)工程師 廣東省/深圳市