自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

為什么加載之前保存的Keras模型得出不一樣的結(jié)果:經(jīng)驗(yàn)和教訓(xùn)

譯文
人工智能 機(jī)器學(xué)習(xí)
現(xiàn)在,機(jī)器學(xué)習(xí)模型在生產(chǎn)環(huán)境中的使用比以往都要廣泛。Keras就是這樣一種流行的庫(kù),用于創(chuàng)建強(qiáng)大的機(jī)器學(xué)習(xí)和深度學(xué)習(xí)模型。

現(xiàn)在,機(jī)器學(xué)習(xí)模型在生產(chǎn)環(huán)境中的使用比以往都要廣泛。Keras就是這樣一種流行的庫(kù),用于創(chuàng)建強(qiáng)大的機(jī)器學(xué)習(xí)和深度學(xué)習(xí)模型。然而,這些模型的訓(xùn)練過(guò)程常常計(jì)算開銷大,還費(fèi)時(shí),具體取決于實(shí)際處理的數(shù)據(jù)和模型架構(gòu)。一些模型需要數(shù)周到數(shù)月的時(shí)間來(lái)訓(xùn)練。因此,能夠在本地存儲(chǔ)模型、需要進(jìn)行預(yù)測(cè)時(shí)再次檢索它們變得至關(guān)重要。但如果由于某種原因保存的模型沒(méi)有正確加載,該怎么辦?我會(huì)根據(jù)本人的經(jīng)驗(yàn)試著給出答案。

我不會(huì)詳細(xì)介紹如何使用和保存Keras模型,只是假設(shè)讀者熟悉該過(guò)程,直接介紹如何處理加載時(shí)意外的模型行為。也就是說(shuō),在訓(xùn)練存儲(chǔ)在Model變量中的Keras模型之后,我們希望將其保存為原樣,那樣下次加載時(shí)我們可以跳過(guò)訓(xùn)練,就進(jìn)行預(yù)測(cè)。

我首選的方法是保存模型的權(quán)重,權(quán)重在模型創(chuàng)建開始時(shí)是隨機(jī)的,隨著模型的訓(xùn)練而加以更新。于是我點(diǎn)擊了model.save_weights(“model.h5”)。創(chuàng)建了“model.h5”文件,含有模型學(xué)習(xí)到的權(quán)重。接下來(lái),在另一個(gè)會(huì)話中,我使用與以前相同的架構(gòu)重建模型,并使用 new_model.load_weights(“model.h5”)加載我保存的訓(xùn)練權(quán)重。一切似乎都很好。只是我點(diǎn)擊 new_model.predict(test_data)后,得到的準(zhǔn)確性為零,不知道為什么。

事實(shí)證明,模型無(wú)法做出正確的預(yù)測(cè)有諸多原因。我在本文試著總結(jié)最常見(jiàn)的原因,并介紹如何解決。

1. 先仔細(xì)檢查數(shù)據(jù)。

我知道這似乎很明顯,但是從磁盤重新加載模型時(shí),一有疏忽就會(huì)導(dǎo)致性能下降。比如說(shuō),如果您在構(gòu)建語(yǔ)言模型,應(yīng)確保在每個(gè)新會(huì)話中,您執(zhí)行以下操作:

  • 重新檢查類標(biāo)簽的順序。如果您將它們映射到數(shù)字,重新檢查在每個(gè)會(huì)話中每個(gè)類標(biāo)簽都有相同的數(shù)字。如果您使用list(set())函數(shù)來(lái)檢索,可能會(huì)發(fā)生這種情況,該函數(shù)每次都會(huì)以不同的順序返回您的標(biāo)簽。這最終可能會(huì)搞亂您的標(biāo)簽預(yù)測(cè)。
  • 檢查數(shù)據(jù)集。如果您的測(cè)試數(shù)據(jù)還沒(méi)有在另一個(gè)文件中,檢查訓(xùn)練-測(cè)試拆分不是隨機(jī)的,以便每次進(jìn)行預(yù)測(cè)時(shí),您根據(jù)不同的數(shù)據(jù)進(jìn)行預(yù)測(cè),因此您的預(yù)測(cè)準(zhǔn)確性最終會(huì)不一致。

當(dāng)然,您可能會(huì)遇到其他與數(shù)據(jù)相關(guān)的問(wèn)題,具體取決于您從事的領(lǐng)域。然而,請(qǐng)始終檢查數(shù)據(jù)表示的一致性。

2. 度量指標(biāo)問(wèn)題

導(dǎo)致錯(cuò)誤或結(jié)果不一致的另一個(gè)原因是,準(zhǔn)確性度量指標(biāo)的選擇。在構(gòu)建模型并保存其權(quán)重時(shí),我們通常執(zhí)行以下操作:

def build_model(max_len, n_tags): 
input_layer = Input(shape=(max_len, ))
output_layer = Dense(n_tags, activation = 'softmax')(input_layer)
model = Model(input_layer, output_layer)

return model

model = build_model()
model.compile(optimizer="adam",
loss="sparse_categorical_crossentropy", metrics=["accuracy"])

model.fit(..)
model.save_weights("model.h5")

如果我們需要在新的會(huì)話/腳本中打開它,需要執(zhí)行以下操作:

def build_model(max_len, n_tags): 
input_layer = Input(shape=(max_len, ))
output_layer = Dense(n_tags, activation = 'softmax')(input_layer)
model = Model(input_layer, output_layer)

return model
model = build_model()
model.compile(optimizer="adam", loss="sparse_categorical_crossentropy", metrics=["accuracy"])
model.load_weights("model.h5")
model.evaluate()

這可能拋出錯(cuò)誤,具體視所使用的特定的Keras/Tensorflow版本而定。編譯模型并選擇“準(zhǔn)確性”作為指標(biāo)時(shí),會(huì)出現(xiàn)問(wèn)題。Keras識(shí)別準(zhǔn)確性的各種定義:“稀疏分類準(zhǔn)確性”、“分類準(zhǔn)確性”等;視您使用的數(shù)據(jù)而定,不同的定義是優(yōu)選的解決方案。這是由于如果我們將度量指標(biāo)設(shè)為“準(zhǔn)確性”,Keras將試著分配其中一種特定的準(zhǔn)確性類型,具體取決于它認(rèn)為哪一種最適合數(shù)據(jù)分布。它可能會(huì)在不同的運(yùn)行中推斷出不同的準(zhǔn)確性指標(biāo)。這里最好的解決方法是,始終明確設(shè)置準(zhǔn)確性指標(biāo),而不是讓Keras自行選擇。比如說(shuō),把

model.compile(optimizer="adam", 
loss="sparse_categorical_crossentropy", metrics=["accuracy"])

換成:

model.compile(optimizer="adam", 
loss="sparse_categorical_crossentropy", metrics=["sparse_categorical_accuracy"])

3. 隨機(jī)性

在與以前相同的數(shù)據(jù)上重新訓(xùn)練Keras神經(jīng)網(wǎng)絡(luò)時(shí),您很少兩次獲得同樣的結(jié)果。這是由于Keras中的神經(jīng)網(wǎng)絡(luò)在初始化權(quán)重時(shí)使用隨機(jī)性,因此每次運(yùn)行時(shí)權(quán)重的初始化方式都不同,因此在學(xué)習(xí)過(guò)程中這些權(quán)重會(huì)以不同方式更新,于是在進(jìn)行預(yù)測(cè)時(shí)不太可能獲得相同的準(zhǔn)確性結(jié)果。

如果出于某種原因,您需要在訓(xùn)練之前使權(quán)重相等,可以在代碼前面設(shè)置隨機(jī)數(shù)生成器:

from numpy.random import seed
seed(42)
from tensorflow import set_random_seed
set_random_seed(42)

numpy隨機(jī)種子用于Keras,而至于Tensorflow后端,我們需要將其自己的隨機(jī)數(shù)生成器設(shè)置為相等的種子。該代碼片段將確保每次運(yùn)行代碼時(shí),您的神經(jīng)網(wǎng)絡(luò)權(quán)重都會(huì)被同等地初始化。

4. 留意自定義層的使用

Keras提供了眾多層(Dense、LSTM、Dropout和BatchNormalizaton等),但有時(shí)我們希望對(duì)模型中的數(shù)據(jù)采取某種特定的操作,但又沒(méi)有為它定義的特定層。一般來(lái)說(shuō),Keras提供了兩種類型的層:Lambda和基礎(chǔ)層類。但對(duì)這兩種層要很小心,如果您將模型架構(gòu)保存為json格式更要小心。Lambda層的棘手地方在于序列化限制。由于它與Python字節(jié)碼的序列化一同保存,它只能加載到保存它的同一個(gè)環(huán)境中,即它不可移植。遇到該問(wèn)題時(shí),通常建議覆蓋keras.layers.Layer層,或者只保存其權(quán)重,從頭開始重建模型,而不是保存整個(gè)模型。

5. 自定義對(duì)象

很多時(shí)候,您會(huì)想要使用自定義函數(shù)應(yīng)用于數(shù)據(jù),或計(jì)算損失/準(zhǔn)確性等指標(biāo)的函數(shù)。

Keras允許這種使用,為此讓我們可以在保存/加載模型時(shí)指定額外的參數(shù)。假設(shè)我們想要將我們自行創(chuàng)建的特殊的損失函數(shù)與之前保存的模型一并加載:

model = load_model("model.h5", custom_objects=
{"custom_loss":custom_loss})

如果我們?cè)谛颅h(huán)境中加載該模型,必須在新環(huán)境中小心定義custom_loss函數(shù),因?yàn)槟J(rèn)情況下,保存模型時(shí)不會(huì)記住這些函數(shù)。即使我們保存了模型的整個(gè)架構(gòu),它也會(huì)保存該自定義函數(shù)的名稱,但函數(shù)體是我們需要額外提供的東西。

6. 全局變量初始化器

如果您使用Tensorflow 1.x作為后端——您可能仍然需要該后端用于許多應(yīng)用程序,這點(diǎn)尤為重要。運(yùn)行tf 1.x會(huì)話時(shí),您需要運(yùn)行tf.global_variables_initializer(),它隨機(jī)初始化所有變量。這么做的副作用是,當(dāng)您嘗試保存模型時(shí),它可能重新初始化所有權(quán)重。您可以手動(dòng)停止該行為,只需運(yùn)行:

from keras.backend import manual_variable_initialization manual_variable_initialization(True)

結(jié)語(yǔ)

本文列出了最常導(dǎo)致您的Keras模型無(wú)法在新環(huán)境中正確加載的幾個(gè)因素。有時(shí)這些問(wèn)題導(dǎo)致不可預(yù)測(cè)的結(jié)果,而在其他情況下,它們只會(huì)拋出錯(cuò)誤。它們何時(shí)發(fā)生、如何發(fā)生,在很大程度上也取決于您使用的Python版本以及Tensorflow和Keras版本,因?yàn)槠渲幸恍┌姹静幌嗉嫒荩瑥亩鴮?dǎo)致意外的行為。但愿讀完本文后,下次遇到此類問(wèn)題時(shí)您知道從何處入手。

原文標(biāo)題:Why Loading a Previously Saved Keras Model Gives Different Results: Lessons Learned,作者:Kristina Popova

責(zé)任編輯:華軒 來(lái)源: 51CTO
相關(guān)推薦

2021-07-12 23:53:22

Python交換變量

2012-03-07 17:24:10

戴爾咨詢

2012-12-20 10:17:32

IT運(yùn)維

2021-01-11 14:02:22

dudf運(yùn)維

2017-05-25 15:02:46

聯(lián)宇益通SD-WAN

2015-10-19 12:33:01

華三/新IT

2011-09-02 10:12:36

網(wǎng)速測(cè)試結(jié)果網(wǎng)速測(cè)試網(wǎng)速測(cè)試方法

2016-05-09 18:40:26

VIP客戶緝拿

2020-02-14 14:36:23

DevOps落地認(rèn)知

2021-12-23 15:11:46

Web 3.0元宇宙Metaverse

2018-05-09 15:42:24

新零售

2009-02-04 15:43:45

敏捷開發(fā)PHPFleaPHP

2009-12-01 16:42:27

Gentoo Linu

2011-03-14 16:51:24

2012-07-18 02:05:02

函數(shù)語(yǔ)言編程語(yǔ)言

2011-02-28 10:38:13

Windows 8

2009-06-12 15:26:02

2016-03-24 18:51:40

2023-03-20 08:19:23

GPT-4OpenAI

2015-08-25 09:52:36

云計(jì)算云計(jì)算產(chǎn)業(yè)云計(jì)算政策
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)