selenium之 chromedriver与chrome版本映射表_NLP实战篇之tf2训练与评估
本文是基于tensorflow2.2.0版本,介紹了模型的訓(xùn)練與評估。主要介紹了tf.keras的內(nèi)置訓(xùn)練過程,包括compile、fit,其中compile中包含優(yōu)化器、loss與metrics的使用,內(nèi)置api中還包含了很多輔助工具,在Callback中進(jìn)行介紹;除了簡單的單輸入單輸出模型之外,本文還介紹了多輸入、多輸出模型的訓(xùn)練過程。本文中涉及的內(nèi)容都是內(nèi)置api,相關(guān)內(nèi)容大都可以進(jìn)行自定義,自定義相關(guān)內(nèi)容會(huì)陸續(xù)在后續(xù)文章里介紹。
實(shí)戰(zhàn)系列篇章中主要會(huì)分享,解決實(shí)際問題時(shí)的過程、遇到的問題或者使用的工具等等。如問題分解、bug排查、模型部署等等。相關(guān)代碼實(shí)現(xiàn)開源在:https://github.com/wellinxu/nlp_store ,更多內(nèi)容關(guān)注知乎專欄(或微信公眾號):NLP雜貨鋪。
- 簡單文本分類模型示例
- 訓(xùn)練與評估流程
- compile
- fit
- Callback
- 多輸入、多輸出模型
- compile
- fit
- 參考
簡單文本分類模型示例
如下面代碼所示,根據(jù)【NLP實(shí)戰(zhàn)篇之tensorflow2.0快速入門】獲取一個(gè)完整的文本分類示例,其中包含數(shù)據(jù)獲取、數(shù)據(jù)簡單預(yù)處理、模型構(gòu)建、訓(xùn)練與評估。
import?tensorflow?as?tf#?下載IMDB數(shù)據(jù)
vocab_size?=?10000????#?保留詞的個(gè)數(shù)
imdb?=?tf.keras.datasets.imdb
(train_data,?train_labels),?(test_data,?test_labels)?=?imdb.load_data(num_words=vocab_size)
#?一個(gè)將單詞映射到整數(shù)索引的詞典
word_index?=?imdb.get_word_index()???#?索引從1開始
word_index?=?{k:(v+3)?for?k,v?in?word_index.items()}
word_index[""]?=?0
word_index[""]?=?1
word_index[""]?=?2??#?unknown
word_index[""]?=?3
#?統(tǒng)一文本序列長度
train_data?=?tf.keras.preprocessing.sequence.pad_sequences(train_data,?value=word_index[""],?padding="post",?truncating="post",?maxlen=256)
test_data?=?tf.keras.preprocessing.sequence.pad_sequences(test_data,?value=word_index[""],?padding="post",?truncating="post",?maxlen=256)
#?模型構(gòu)建
model?=?tf.keras.Sequential([
????????tf.keras.layers.Embedding(vocab_size,?16),????#?[batch_size,?seq_len,?16]
????????tf.keras.layers.GlobalAveragePooling1D(),????#?[batch_size,?16]
????????tf.keras.layers.Dense(16,?activation='relu'),????#?[batch_size,?16]
????????tf.keras.layers.Dense(1,?activation='sigmoid')????#?[batch_size,?1]
????])
#?配置模型訓(xùn)練參數(shù)
#?model.compile(optimizer='adam',?loss='binary_crossentropy',?metrics=['accuracy'])
model.compile(optimizer=tf.keras.optimizers.Adam(),?loss=tf.keras.losses.BinaryCrossentropy(),?metrics=[tf.keras.metrics.BinaryAccuracy()])
#?訓(xùn)練模型
history?=?model.fit(train_data,?train_labels,?epochs=40,?batch_size=512)
#?評估測試集
model.evaluate(test_data,??test_labels,?verbose=2)
訓(xùn)練與評估流程
compile
如上面代碼所示,要使用fit進(jìn)行訓(xùn)練模型,需要制定優(yōu)化器、損失函數(shù)和評價(jià)指標(biāo),通過compile方法傳遞給模型。除了這三個(gè)參數(shù),compile還包含了其他參數(shù):
其中優(yōu)化器、loss和度量方法都有很多內(nèi)置的api,如下表所示。除此之外,還支持自定義相關(guān)函數(shù),此部分內(nèi)容在后續(xù)文章中介紹。
在訓(xùn)練神經(jīng)網(wǎng)絡(luò)的時(shí)候,有個(gè)比較重要的超參數(shù):學(xué)習(xí)率,這個(gè)參數(shù)的大小或者變化,都嚴(yán)重影響著最終模型的效果。通過優(yōu)化器中l(wèi)earning_rate參數(shù)可以設(shè)置學(xué)習(xí)率的大小與變化。learning_rate可以設(shè)置為靜態(tài)的,比如2e-5,或者設(shè)置為動(dòng)態(tài)的,tf.keras.optimizers.schedules中已經(jīng)提供了部分學(xué)習(xí)率衰減方法,如:ExponentialDecay、InverseTimeDecay、LearningRateSchedule、PiecewiseConstantDecay、PolynomialDecay等等。
fit
fit方法是tf.keras中內(nèi)置的訓(xùn)練方法,其除了包含必要的輸入數(shù)據(jù)與訓(xùn)練輪次之外,還有包含很多其他參數(shù),如下所示:
其中validation_split參數(shù)可以自動(dòng)分離訓(xùn)練集留作驗(yàn)證數(shù)據(jù),class_weight作為類權(quán)重,可以緩解類別不平衡的問題,樣本權(quán)重sample_weight可以起到類似的作用,其控制程度更細(xì)致,能夠進(jìn)一步提高難樣本的權(quán)重,或者降低簡單/無效等樣本。
Callback
Callback是訓(xùn)練或評估期間,在不同時(shí)間點(diǎn)(某個(gè)周期開始時(shí)、某個(gè)批次結(jié)束時(shí)、某個(gè)周期結(jié)束時(shí))調(diào)用的對象,這些對象可以實(shí)現(xiàn)以下行為:
具體使用方式,如下所示:
callbacks?=?[????#?提前終止訓(xùn)練
????tf.keras.callbacks.EarlyStopping(monitor="val_loss",?min_delta=1e-2,?patience=2,?verbose=1),
????#?保存中間模型
????tf.keras.callbacks.ModelCheckpoint(filepath="mymodel_{epoch}",?save_best_only=True,?monitor="val_loss",?verbose=1),
????#?可視化化損失與指標(biāo)
????tf.keras.callbacks.TensorBoard(log_dir="/full_path_to_your_logs",?histogram_freq=0,?embeddings_freq=0,?update_freq="epoch")
]
model.fit(train_data,?train_labels,?epochs=40,?batch_size=512,?callbacks=callbacks)
tf.keras.callbacks中提供了一些內(nèi)置的callback,我們也可以進(jìn)行自定義,自定義相關(guān)內(nèi)容后續(xù)文章介紹。下面展示了keras中內(nèi)置的callback:
多輸入、多輸出模型
前面的示例中,模型都是單個(gè)輸入與單個(gè)輸出,但有很多模型是多個(gè)輸入或輸出,例如上圖模型結(jié)構(gòu)所示,我們用以下方法構(gòu)建模型:
timeseries_input?=?tf.keras.Input(shape=(None,?10),?name="ts_input")
x1?=?tf.keras.layers.Conv2D(3,?3)(image_input)
x1?=?tf.keras.layers.GlobalMaxPooling2D()(x1)
x2?=?tf.keras.layers.Conv1D(3,?3)(timeseries_input)
x2?=?tf.keras.layers.GlobalMaxPooling1D()(x2)
x?=?tf.keras.layers.concatenate([x1,?x2])
score_output?=?tf.keras.layers.Dense(1,?name="score_output")(x)
class_output?=?tf.keras.layers.Dense(5,?activation="softmax",?name="class_output")(x)
model?=?tf.keras.Model(
????????inputs=[image_input,?timeseries_input],?outputs=[score_output,?class_output]
????)
compile
如果loss或者metrics參數(shù)只有單個(gè)傳遞給模型,則每一個(gè)輸出都用一個(gè)loss或者metrics,但在很多情況下不同的輸出需要不同的loss或者metrics,我們就需要對應(yīng)每個(gè)輸出給出不同的值,如下面所示:
model.compile(????????optimizer=tf.keras.optimizers.RMSprop(1e-3),
????????loss=[tf.keras.losses.MeanSquaredError(),?tf.keras.losses.CategoricalCrossentropy()],
????????metrics=[
????????????[
????????????????tf.keras.metrics.MeanAbsolutePercentageError(),
????????????????tf.keras.metrics.MeanAbsoluteError(),
????????????],
????????????[tf.keras.metrics.CategoricalAccuracy()],
????????],
????)
loss與metrics都是list的形式,按照output的順序?qū)?yīng),而我們上面的模型中,已經(jīng)給輸出層進(jìn)行了命名,則可以通過字典來制定loss與metrics,當(dāng)輸出超過2個(gè)的時(shí)候,尤其推薦字典的方式。同時(shí),我們還可以使用loss_weights參數(shù)來給不同的輸出指定權(quán)重,具體使用方法如下:
model.compile(????????optimizer=tf.keras.optimizers.RMSprop(1e-3),
????????loss={
????????????"score_output":?tf.keras.losses.MeanSquaredError(),
????????????"class_output":?tf.keras.losses.CategoricalCrossentropy(),
????????},
????????metrics={
????????????"score_output":?[
????????????????tf.keras.metrics.MeanAbsolutePercentageError(),
????????????????tf.keras.metrics.MeanAbsoluteError(),
????????????],
????????????"class_output":?[tf.keras.metrics.CategoricalAccuracy()],
????????},
????????loss_weights={"score_output":?2.0,?"class_output":?1.0},
????)
除此之外,如果某些輸出不為訓(xùn)練,只用來預(yù)測,則可以寫成這樣:
????#?list的形式????model.compile(
????????optimizer=tf.keras.optimizers.RMSprop(1e-3),
????????loss=[None,?tf.keras.losses.CategoricalCrossentropy()],
????)
????#?或dict的形式
????model.compile(
????????optimizer=tf.keras.optimizers.RMSprop(1e-3),
????????loss={"class_output":?tf.keras.losses.CategoricalCrossentropy()},
????)
fit
fit在接受多輸入的時(shí)候,跟上面loss類似,可以使用numpy數(shù)組的list或者dict形式,如下所示:
????#?隨機(jī)生成NumPy數(shù)據(jù)????img_data?=?np.random.random_sample(size=(100,?32,?32,?3))
????ts_data?=?np.random.random_sample(size=(100,?20,?10))
????score_targets?=?np.random.random_sample(size=(100,?1))
????class_targets?=?np.random.random_sample(size=(100,?5))
????#?list形式
????model.fit([img_data,?ts_data],?[score_targets,?class_targets],?batch_size=32,?epochs=1)
????#?或者dict形式
????model.fit(
????????{"img_input":?img_data,?"ts_input":?ts_data},
????????{"score_output":?score_targets,?"class_output":?class_targets},
????????batch_size=32,
????????epochs=1,
????)
當(dāng)然可以將數(shù)據(jù)轉(zhuǎn)換成Dataset格式,然后傳給fit,如下面代碼所示:
????#?dataset格式????train_dataset?=?tf.data.Dataset.from_tensor_slices(
????????(
????????????{"img_input":?img_data,?"ts_input":?ts_data},
????????????{"score_output":?score_targets,?"class_output":?class_targets},
????????)
????)
????train_dataset?=?train_dataset.shuffle(buffer_size=1024).batch(64)
????model.fit(train_dataset,?epochs=1)
參考
https://www.tensorflow.org/guide/keras/train_and_evaluate
總結(jié)
以上是生活随笔為你收集整理的selenium之 chromedriver与chrome版本映射表_NLP实战篇之tf2训练与评估的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 电脑配置清单_2020电脑配置清单AMD
- 下一篇: iphone屏幕录制_如何将iPhone