Tensorflow2.4使用Tuner選擇模型最佳超參詳解
前言
本文使用 cpu 版本的 tensorflow 2.4 ,選用 Keras Tuner 工具以 Fashion 數(shù)據(jù)集的分類任務(wù)為例,完成最優(yōu)超參數(shù)的快速選擇任務(wù)。
當(dāng)我們搭建完成深度學(xué)習(xí)模型結(jié)構(gòu)之后,我們在訓(xùn)練模型的過程中,有很大一部分工作主要是通過驗(yàn)證集評估指標(biāo),來不斷調(diào)節(jié)模型的超參數(shù),這是比較耗時(shí)耗力的,如果只是不計(jì)代價(jià)為找到模型最優(yōu)的超參數(shù)組合,我們大可以使用暴力窮舉,把所有超參數(shù)都搭配組合試用一遍,肯定能找到一組最優(yōu)的超參數(shù)結(jié)果。但是現(xiàn)實(shí)情況是我們不僅要考慮時(shí)間成本,還要考慮計(jì)算成本等因素,而 Tuner 工具包可幫助我們省時(shí)省力做這件事情,為我們的 TensorFlow 程序選擇最佳的超參數(shù)集,整個(gè)這一找最佳超參數(shù)集的過程稱為超參數(shù)調(diào)節(jié)或超調(diào)。
我們要知道超參數(shù)有兩種類型:
- 模型超參:也就是能夠影響模型的架構(gòu)參數(shù),例如神經(jīng)元個(gè)數(shù)等
- 算法超參:也就是能夠影響模型學(xué)習(xí)算法參數(shù),例如學(xué)習(xí)率和 epoch 等
實(shí)現(xiàn)過程
1. 獲取 MNIST 數(shù)據(jù)并進(jìn)行處理
(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)將整個(gè)數(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)的模型時(shí),除了定義模型結(jié)構(gòu)之外,還要定義超參的可選范圍,這種為超調(diào)搭建的模型稱為超模型。
(2)第一層是將每張圖片的輸入從二維壓縮成一維。
(3)第二層是輸出一個(gè)維度為 units 的全連接層,units 是我們的神經(jīng)元個(gè)數(shù)選擇器,我們規(guī)定了從 16-256 中隨機(jī)選擇一個(gè)可用的整數(shù)來進(jìn)行模型的訓(xùn)練,整數(shù)選擇的步長為 32 ,并最終能確定一個(gè)使得模型能達(dá)到最好效果的神經(jīng)元個(gè)數(shù),并且使用了激活函數(shù) relu 來進(jìn)行非線性變換。
(4)第三層是一個(gè)輸出 10 個(gè)維度向量的全連接層,也就是輸出該圖片屬于這 10 個(gè)類別的概率分布。
(5)學(xué)習(xí)率也是一個(gè)需要不斷調(diào)整的超參數(shù),所以我們使用 learning_rate 當(dāng)做我們優(yōu)化器學(xué)習(xí)率的選擇器,從 [1e-2, 1e-3, 1e-4] 中選擇能使模型達(dá)到最好效果的那個(gè)。
(6)編譯模型的時(shí)候我們選擇了最常用的 Adam 優(yōu)化器,其學(xué)習(xí)率就是用我們剛才定義好的 learning_rate ,一會在模型學(xué)習(xí)的過程中會不斷隨機(jī)選擇一個(gè)學(xué)習(xí)率。
(7)損失函數(shù)選擇常見的 SparseCategoricalCrossentropy 。
(8)評估指標(biāo)選擇最簡單的準(zhǔn)確率 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. 實(shí)例化調(diào)節(jié)器并進(jìn)行模型超調(diào)
(1)Tuner 中常見的調(diào)節(jié)器包括:RandomSearch、Hyperband、BayesianOptimization 和 Sklearn。在本文中我們使用 Hyperband 調(diào)節(jié)器來完成超參數(shù)的選擇。
(2)我們知道現(xiàn)實(shí)中將所有的超參數(shù)進(jìn)行搭配可以形成很多組,這個(gè)組數(shù)越多,那么最優(yōu)超參數(shù)組合出現(xiàn)的概率也越大,但是與此相悖的是組數(shù)越多,在有限資源的情況下,能對每一組超參數(shù)進(jìn)行測試的資源就越少,找到最優(yōu)組的概率會下降, Hyperband 由此而生,Hyperband 就是假設(shè)盡可能出現(xiàn)多的超參數(shù)組,并且每組所能得到的資源要盡可能多,從而確保盡可能找到有最優(yōu)超參數(shù)的那個(gè)組。
(3)在實(shí)際超調(diào)過程中,Hyperband 會假設(shè) n 組超參數(shù)組合,然后對這 n 組超參數(shù)均勻地分配預(yù)算并進(jìn)行驗(yàn)證評估,根據(jù)驗(yàn)證結(jié)果淘汰一半表現(xiàn)差的超參數(shù)組,不斷重復(fù)上述過程直到找到一個(gè)最優(yōu)超參數(shù)組合。
(4)調(diào)用函數(shù) Hyperband 將調(diào)節(jié)器進(jìn)行實(shí)例化,我們需要傳入超模型、訓(xùn)練目標(biāo)和最大的訓(xùn)練 epoch 。
(5)為了訓(xùn)練過程中防止過擬合現(xiàn)象,我們還加入了 EarlyStopping ,當(dāng)經(jīng)過 3 次 epoch 都沒有優(yōu)化之后會停止模型訓(xùn)練。
(6)這里就是使用超調(diào)實(shí)例 tuner 在模型訓(xùn)練過程中,通過調(diào)用 model_builder 函數(shù)不斷地在 units 、learning_rate 中使用合適的超參構(gòu)建新模型,并使用訓(xùn)練集為新模型訓(xùn)練 10 個(gè) epoch ,最后選用訓(xùn)練集 20% 比例的驗(yàn)證集,記錄下每個(gè)配置下的模型在驗(yàn)證集上表現(xiàn)出的評估指標(biāo) val_accuracy 。
(7)當(dāng)超調(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)元個(gè)數(shù)建議選為 {best_hps.get('units')} ,優(yōu)化器學(xué)習(xí)率建議選為 {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)元個(gè)數(shù)建議選為176 ,優(yōu)化器學(xué)習(xí)率建議選為0.001.
4. 訓(xùn)練模型獲得最佳 epoch
(1)我們已經(jīng)通過 tuner 獲得了最優(yōu)的超參數(shù),接下來我們只需要用最優(yōu)的超參數(shù)構(gòu)建模型,然后使用訓(xùn)練數(shù)據(jù)對模型進(jìn)行訓(xùn)練 30 個(gè) epoch 即可,并且使用訓(xùn)練數(shù)據(jù)的 20% 作為驗(yàn)證集對模型進(jìn)行效果評估。
(2)我們可以將經(jīng)過驗(yàn)證集評估得到的每個(gè) epoch 產(chǎn)生的 val_accuracy 都取出來,然后選擇其中最大的那個(gè) epoch ,說明當(dāng)經(jīng)過 14 次 epoch 就可以達(dá)到最佳的模型效果
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 個(gè) 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 個(gè) epoch
5. 使用最有超參數(shù)集進(jìn)行模型訓(xùn)練和評估
(1) 經(jīng)過上面的過程我們已經(jīng)找到了最好的神經(jīng)元個(gè)數(shù)、學(xué)習(xí)率、以及訓(xùn)練模型的 epoch ,接下來使用這些超參重新實(shí)例化新的模型并使用上面的 best_epoch 對其進(jìn)行訓(xùn)練,仍然選擇訓(xùn)練集的 20% 作為驗(yàn)證集對模型效果進(jìn)行驗(yàn)證 。
best_model = tuner.hypermodel.build(best_hps) best_model.fit(img_train, label_train, epochs=best_epoch, validation_split=0.2)
(2)我們使用測試集堆模型進(jìn)行評估。
eval_result = best_model.evaluate(test_img, test_label) print("測試集損失值 %f , 測試集準(zhǔn)確率為 %f"% (eval_result[0], eval_result[1]))
輸出結(jié)果為:
測試集損失值 0.345943 , 測試集準(zhǔn)確率為 0.889400
以上就是Tensorflow2.4使用Tuner選擇模型最佳超參詳解的詳細(xì)內(nèi)容,更多關(guān)于Tensorflow2.4 Tuner選擇模型的資料請關(guān)注腳本之家其它相關(guān)文章!
- 深度學(xué)習(xí)Tensorflow?2.4?完成遷移學(xué)習(xí)和模型微調(diào)
- Tensorflow2.1 完成權(quán)重或模型的保存和加載
- python深度學(xué)習(xí)tensorflow訓(xùn)練好的模型進(jìn)行圖像分類
- python神經(jīng)網(wǎng)絡(luò)tensorflow利用訓(xùn)練好的模型進(jìn)行預(yù)測
- python人工智能TensorFlow自定義層及模型保存
- python深度學(xué)習(xí)TensorFlow神經(jīng)網(wǎng)絡(luò)模型的保存和讀取
- TensorFlow神經(jīng)網(wǎng)絡(luò)構(gòu)造線性回歸模型示例教程
- Tensorflow 2.4 搭建單層和多層 Bi-LSTM 模型
相關(guān)文章
python實(shí)現(xiàn)字符串加密成純數(shù)字
這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)字符串加密成純數(shù)字,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-03-03python實(shí)現(xiàn)定時(shí)壓縮指定文件夾發(fā)送郵件
這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)定時(shí)壓縮指定文件夾發(fā)送郵件,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-04-04Tensorflow 實(shí)現(xiàn)釋放內(nèi)存
今天小編就為大家分享一篇Tensorflow 實(shí)現(xiàn)釋放內(nèi)存,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-02-02Python使用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é)合示例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下2022-12-12Python?matplotlib的spines模塊實(shí)例詳解
作為程序員,經(jīng)常需要進(jìn)行繪圖,下面這篇文章主要給大家介紹了關(guān)于Python?matplotlib的spines模塊的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-08-08查看keras的默認(rèn)backend實(shí)現(xiàn)方式
這篇文章主要介紹了查看keras的默認(rèn)backend實(shí)現(xiàn)方式,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-06-06詳解Python如何實(shí)現(xiàn)Excel數(shù)據(jù)讀取和寫入
這篇文章主要為大家詳細(xì)介紹了python如何實(shí)現(xiàn)對EXCEL數(shù)據(jù)進(jìn)行讀取和寫入,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-04-04