欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Tensorflow2.4使用Tuner選擇模型最佳超參詳解

 更新時間:2022年11月17日 16:48:33   作者:我是王大你是誰  
這篇文章主要介紹了Tensorflow2.4使用Tuner選擇模型最佳超參詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪

前言

本文使用 cpu 版本的 tensorflow 2.4 ,選用 Keras Tuner 工具以 Fashion 數(shù)據(jù)集的分類任務(wù)為例,完成最優(yōu)超參數(shù)的快速選擇任務(wù)。

當我們搭建完成深度學(xué)習模型結(jié)構(gòu)之后,我們在訓(xùn)練模型的過程中,有很大一部分工作主要是通過驗證集評估指標,來不斷調(diào)節(jié)模型的超參數(shù),這是比較耗時耗力的,如果只是不計代價為找到模型最優(yōu)的超參數(shù)組合,我們大可以使用暴力窮舉,把所有超參數(shù)都搭配組合試用一遍,肯定能找到一組最優(yōu)的超參數(shù)結(jié)果。但是現(xiàn)實情況是我們不僅要考慮時間成本,還要考慮計算成本等因素,而 Tuner 工具包可幫助我們省時省力做這件事情,為我們的 TensorFlow 程序選擇最佳的超參數(shù)集,整個這一找最佳超參數(shù)集的過程稱為超參數(shù)調(diào)節(jié)或超調(diào)。

我們要知道超參數(shù)有兩種類型:

  • 模型超參:也就是能夠影響模型的架構(gòu)參數(shù),例如神經(jīng)元個數(shù)等
  • 算法超參:也就是能夠影響模型學(xué)習算法參數(shù),例如學(xué)習率和 epoch 等

實現(xiàn)過程

1. 獲取 MNIST 數(shù)據(jù)并進行處理

(1)首先我們要保證 tensorflow 不低于 2.4.0 ,python 不低于 3.8 ,否則無法使用 keras-tuner ,然后使用 pip 安裝 keras-tuner 使用即可。

(2)使用 tensorflow 的內(nèi)置函數(shù)從網(wǎng)絡(luò)獲取 Fashion 數(shù)據(jù)集 。

(3)將整個數(shù)據(jù)集做歸一化操作,加快模型訓(xùn)練的收斂。

import tensorflow as tf
from tensorflow import keras
import keras_tuner as kt
(train_img, train_label), (test_img, test_label) = keras.datasets.fashion_mnist.load_data()
train_img = train_img.astype('float32') / 255.0
test_img = test_img.astype('float32') / 255.0

2. 搭建超模型

(1)這里主要是定義超模型,在構(gòu)建用于超調(diào)的模型時,除了定義模型結(jié)構(gòu)之外,還要定義超參的可選范圍,這種為超調(diào)搭建的模型稱為超模型。

(2)第一層是將每張圖片的輸入從二維壓縮成一維。

(3)第二層是輸出一個維度為 units 的全連接層,units 是我們的神經(jīng)元個數(shù)選擇器,我們規(guī)定了從 16-256 中隨機選擇一個可用的整數(shù)來進行模型的訓(xùn)練,整數(shù)選擇的步長為 32 ,并最終能確定一個使得模型能達到最好效果的神經(jīng)元個數(shù),并且使用了激活函數(shù) relu 來進行非線性變換。

(4)第三層是一個輸出 10 個維度向量的全連接層,也就是輸出該圖片屬于這 10 個類別的概率分布。

(5)學(xué)習率也是一個需要不斷調(diào)整的超參數(shù),所以我們使用 learning_rate 當做我們優(yōu)化器學(xué)習率的選擇器,從 [1e-2, 1e-3, 1e-4] 中選擇能使模型達到最好效果的那個。

(6)編譯模型的時候我們選擇了最常用的 Adam 優(yōu)化器,其學(xué)習率就是用我們剛才定義好的 learning_rate ,一會在模型學(xué)習的過程中會不斷隨機選擇一個學(xué)習率。

(7)損失函數(shù)選擇常見的 SparseCategoricalCrossentropy 。

(8)評估指標選擇最簡單的準確率 accuracy 。

def model_builder(hp):
    model = keras.Sequential()
    model.add(keras.layers.Flatten(input_shape=(28, 28)))
    units = hp.Int('units', min_value=16, max_value=256, step=32)
    model.add(keras.layers.Dense(units=units, activation='relu'))
    model.add(keras.layers.Dense(10))
    learning_rate = hp.Choice('learning_rate', values=[1e-2, 1e-3, 1e-4])
    model.compile(optimizer=keras.optimizers.Adam(learning_rate=learning_rate),
                loss=keras.losses.SparseCategoricalCrossentropy(from_logits=True),
                metrics=['accuracy'])
    return model

3. 實例化調(diào)節(jié)器并進行模型超調(diào)

(1)Tuner 中常見的調(diào)節(jié)器包括:RandomSearch、Hyperband、BayesianOptimization 和 Sklearn。在本文中我們使用 Hyperband 調(diào)節(jié)器來完成超參數(shù)的選擇。

(2)我們知道現(xiàn)實中將所有的超參數(shù)進行搭配可以形成很多組,這個組數(shù)越多,那么最優(yōu)超參數(shù)組合出現(xiàn)的概率也越大,但是與此相悖的是組數(shù)越多,在有限資源的情況下,能對每一組超參數(shù)進行測試的資源就越少,找到最優(yōu)組的概率會下降, Hyperband 由此而生,Hyperband 就是假設(shè)盡可能出現(xiàn)多的超參數(shù)組,并且每組所能得到的資源要盡可能多,從而確保盡可能找到有最優(yōu)超參數(shù)的那個組。

(3)在實際超調(diào)過程中,Hyperband 會假設(shè) n 組超參數(shù)組合,然后對這 n 組超參數(shù)均勻地分配預(yù)算并進行驗證評估,根據(jù)驗證結(jié)果淘汰一半表現(xiàn)差的超參數(shù)組,不斷重復(fù)上述過程直到找到一個最優(yōu)超參數(shù)組合。

(4)調(diào)用函數(shù) Hyperband 將調(diào)節(jié)器進行實例化,我們需要傳入超模型、訓(xùn)練目標和最大的訓(xùn)練 epoch 。

(5)為了訓(xùn)練過程中防止過擬合現(xiàn)象,我們還加入了 EarlyStopping ,當經(jīng)過 3 次 epoch 都沒有優(yōu)化之后會停止模型訓(xùn)練。

(6)這里就是使用超調(diào)實例 tuner 在模型訓(xùn)練過程中,通過調(diào)用 model_builder 函數(shù)不斷地在 units 、learning_rate 中使用合適的超參構(gòu)建新模型,并使用訓(xùn)練集為新模型訓(xùn)練 10 個 epoch ,最后選用訓(xùn)練集 20% 比例的驗證集,記錄下每個配置下的模型在驗證集上表現(xiàn)出的評估指標 val_accuracy 。

(7)當超調(diào)結(jié)束之后,我們返回最好的超參選用結(jié)果 best_hps 。

tuner = kt.Hyperband(model_builder, objective='val_accuracy', max_epochs=10)
stop_early = tf.keras.callbacks.EarlyStopping(monitor='val_loss', patience=3)
tuner.search(train_img, train_label, epochs=10, validation_split=0.2, callbacks=[stop_early])
best_hps=tuner.get_best_hyperparameters(num_trials=1)[0]
print(f"""超調(diào)結(jié)束, 第一層全連接層的神經(jīng)元個數(shù)建議選為 {best_hps.get('units')} ,優(yōu)化器學(xué)習率建議選為 {best_hps.get('learning_rate')}.""")

輸出結(jié)果為:

Trial 30 Complete [00h 00m 15s]
val_accuracy: 0.8845000267028809
Best val_accuracy So Far: 0.8864166736602783
Total elapsed time: 00h 03m 04s
INFO:tensorflow:Oracle triggered exit
超調(diào)結(jié)束, 第一層全連接層的神經(jīng)元個數(shù)建議選為176 ,優(yōu)化器學(xué)習率建議選為0.001.

4. 訓(xùn)練模型獲得最佳 epoch

(1)我們已經(jīng)通過 tuner 獲得了最優(yōu)的超參數(shù),接下來我們只需要用最優(yōu)的超參數(shù)構(gòu)建模型,然后使用訓(xùn)練數(shù)據(jù)對模型進行訓(xùn)練 30 個 epoch 即可,并且使用訓(xùn)練數(shù)據(jù)的 20% 作為驗證集對模型進行效果評估。

(2)我們可以將經(jīng)過驗證集評估得到的每個 epoch 產(chǎn)生的 val_accuracy 都取出來,然后選擇其中最大的那個 epoch ,說明當經(jīng)過 14 次 epoch 就可以達到最佳的模型效果

model = tuner.hypermodel.build(best_hps)
history = model.fit(img_train, label_train, epochs=30, validation_split=0.2)
val_acc_per_epoch = history.history['val_accuracy']
best_epoch = val_acc_per_epoch.index(max(val_acc_per_epoch)) + 1
print('產(chǎn)生最好的 val_accuracy 是在第 %d 個 epoch ' % (best_epoch,))

輸出為:

Epoch 1/30
1500/1500 [==============================] - 2s 1ms/step - loss: 0.6338 - accuracy: 0.7770 - val_loss: 0.4494 - val_accuracy: 0.8401
Epoch 2/30
1500/1500 [==============================] - 1s 938us/step - loss: 0.3950 - accuracy: 0.8575 - val_loss: 0.3971 - val_accuracy: 0.8497
...
Epoch 14/30
1500/1500 [==============================] - 2s 1ms/step - loss: 0.2027 - accuracy: 0.9229 - val_loss: 0.3150 - val_accuracy: 0.8943
Epoch 15/30
1500/1500 [==============================] - 1s 985us/step - loss: 0.1951 - accuracy: 0.9280 - val_loss: 0.3200 - val_accuracy: 0.8912
...
Epoch 29/30
1500/1500 [==============================] - 1s 906us/step - loss: 0.1298 - accuracy: 0.9517 - val_loss: 0.3939 - val_accuracy: 0.8902
Epoch 30/30
1500/1500 [==============================] - 1s 951us/step - loss: 0.1194 - accuracy: 0.9561 - val_loss: 0.4027 - val_accuracy: 0.8904
產(chǎn)生最好的 val_accuracy 是在第 14 個 epoch 

5. 使用最有超參數(shù)集進行模型訓(xùn)練和評估

(1) 經(jīng)過上面的過程我們已經(jīng)找到了最好的神經(jīng)元個數(shù)、學(xué)習率、以及訓(xùn)練模型的 epoch ,接下來使用這些超參重新實例化新的模型并使用上面的 best_epoch 對其進行訓(xùn)練,仍然選擇訓(xùn)練集的 20% 作為驗證集對模型效果進行驗證 。

best_model = tuner.hypermodel.build(best_hps)
best_model.fit(img_train, label_train, epochs=best_epoch, validation_split=0.2)

(2)我們使用測試集堆模型進行評估。

eval_result = best_model.evaluate(test_img, test_label)
print("測試集損失值 %f , 測試集準確率為 %f"% (eval_result[0], eval_result[1]))

輸出結(jié)果為:

測試集損失值 0.345943 , 測試集準確率為 0.889400

以上就是Tensorflow2.4使用Tuner選擇模型最佳超參詳解的詳細內(nèi)容,更多關(guān)于Tensorflow2.4 Tuner選擇模型的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • python實現(xiàn)字符串加密成純數(shù)字

    python實現(xiàn)字符串加密成純數(shù)字

    這篇文章主要為大家詳細介紹了python實現(xiàn)字符串加密成純數(shù)字,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-03-03
  • Python中最常用的操作列表的幾種方法歸納

    Python中最常用的操作列表的幾種方法歸納

    這篇文章主要介紹了Python中最常用的操作列表的幾種方法歸納,列表的方法是Python學(xué)習中最基本的知識,需要的朋友可以參考下
    2015-04-04
  • Python常用的爬蟲技巧總結(jié)

    Python常用的爬蟲技巧總結(jié)

    本文給大家匯總介紹了Python編寫爬蟲的時候經(jīng)常需要用到的一些技巧,非常的實用,有需要的小伙伴可以參考下
    2016-03-03
  • python實現(xiàn)定時壓縮指定文件夾發(fā)送郵件

    python實現(xiàn)定時壓縮指定文件夾發(fā)送郵件

    這篇文章主要為大家詳細介紹了python實現(xiàn)定時壓縮指定文件夾發(fā)送郵件,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-04-04
  • Tensorflow 實現(xiàn)釋放內(nèi)存

    Tensorflow 實現(xiàn)釋放內(nèi)存

    今天小編就為大家分享一篇Tensorflow 實現(xiàn)釋放內(nèi)存,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-02-02
  • Python使用pandas導(dǎo)入xlsx格式的excel文件內(nèi)容操作代碼

    Python使用pandas導(dǎo)入xlsx格式的excel文件內(nèi)容操作代碼

    這篇文章主要介紹了Python使用pandas導(dǎo)入xlsx格式的excel文件內(nèi)容,基本導(dǎo)入是在Python中使用pandas導(dǎo)入.xlsx文件的方法是read_excel(),本文結(jié)合示例代碼給大家介紹的非常詳細,需要的朋友可以參考下
    2022-12-12
  • python中reader的next用法

    python中reader的next用法

    這篇文章主要介紹了python中reader的next用法,分別介紹了python3中的用法和python2中的用法,具體實例代碼大家參考下本文
    2018-07-07
  • Python?matplotlib的spines模塊實例詳解

    Python?matplotlib的spines模塊實例詳解

    作為程序員,經(jīng)常需要進行繪圖,下面這篇文章主要給大家介紹了關(guān)于Python?matplotlib的spines模塊的相關(guān)資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-08-08
  • 查看keras的默認backend實現(xiàn)方式

    查看keras的默認backend實現(xiàn)方式

    這篇文章主要介紹了查看keras的默認backend實現(xiàn)方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-06-06
  • 詳解Python如何實現(xiàn)Excel數(shù)據(jù)讀取和寫入

    詳解Python如何實現(xiàn)Excel數(shù)據(jù)讀取和寫入

    這篇文章主要為大家詳細介紹了python如何實現(xiàn)對EXCEL數(shù)據(jù)進行讀取和寫入,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-04-04

最新評論