selenium之 chromedriver与chrome版本映射表_NLP实战篇之tf2训练与评估
本文是基于tensorflow2.2.0版本,介紹了模型的訓練與評估。主要介紹了tf.keras的內置訓練過程,包括compile、fit,其中compile中包含優化器、loss與metrics的使用,內置api中還包含了很多輔助工具,在Callback中進行介紹;除了簡單的單輸入單輸出模型之外,本文還介紹了多輸入、多輸出模型的訓練過程。本文中涉及的內容都是內置api,相關內容大都可以進行自定義,自定義相關內容會陸續在后續文章里介紹。
實戰系列篇章中主要會分享,解決實際問題時的過程、遇到的問題或者使用的工具等等。如問題分解、bug排查、模型部署等等。相關代碼實現開源在:https://github.com/wellinxu/nlp_store ,更多內容關注知乎專欄(或微信公眾號):NLP雜貨鋪。
- 簡單文本分類模型示例
- 訓練與評估流程
- compile
- fit
- Callback
- 多輸入、多輸出模型
- compile
- fit
- 參考
簡單文本分類模型示例
如下面代碼所示,根據【NLP實戰篇之tensorflow2.0快速入門】獲取一個完整的文本分類示例,其中包含數據獲取、數據簡單預處理、模型構建、訓練與評估。
import?tensorflow?as?tf#?下載IMDB數據
vocab_size?=?10000????#?保留詞的個數
imdb?=?tf.keras.datasets.imdb
(train_data,?train_labels),?(test_data,?test_labels)?=?imdb.load_data(num_words=vocab_size)
#?一個將單詞映射到整數索引的詞典
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
#?統一文本序列長度
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)
#?模型構建
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]
????])
#?配置模型訓練參數
#?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()])
#?訓練模型
history?=?model.fit(train_data,?train_labels,?epochs=40,?batch_size=512)
#?評估測試集
model.evaluate(test_data,??test_labels,?verbose=2)
訓練與評估流程
compile
如上面代碼所示,要使用fit進行訓練模型,需要制定優化器、損失函數和評價指標,通過compile方法傳遞給模型。除了這三個參數,compile還包含了其他參數:
其中優化器、loss和度量方法都有很多內置的api,如下表所示。除此之外,還支持自定義相關函數,此部分內容在后續文章中介紹。
在訓練神經網絡的時候,有個比較重要的超參數:學習率,這個參數的大小或者變化,都嚴重影響著最終模型的效果。通過優化器中learning_rate參數可以設置學習率的大小與變化。learning_rate可以設置為靜態的,比如2e-5,或者設置為動態的,tf.keras.optimizers.schedules中已經提供了部分學習率衰減方法,如:ExponentialDecay、InverseTimeDecay、LearningRateSchedule、PiecewiseConstantDecay、PolynomialDecay等等。
fit
fit方法是tf.keras中內置的訓練方法,其除了包含必要的輸入數據與訓練輪次之外,還有包含很多其他參數,如下所示:
其中validation_split參數可以自動分離訓練集留作驗證數據,class_weight作為類權重,可以緩解類別不平衡的問題,樣本權重sample_weight可以起到類似的作用,其控制程度更細致,能夠進一步提高難樣本的權重,或者降低簡單/無效等樣本。
Callback
Callback是訓練或評估期間,在不同時間點(某個周期開始時、某個批次結束時、某個周期結束時)調用的對象,這些對象可以實現以下行為:
具體使用方式,如下所示:
callbacks?=?[????#?提前終止訓練
????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),
????#?可視化化損失與指標
????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中提供了一些內置的callback,我們也可以進行自定義,自定義相關內容后續文章介紹。下面展示了keras中內置的callback:
多輸入、多輸出模型
前面的示例中,模型都是單個輸入與單個輸出,但有很多模型是多個輸入或輸出,例如上圖模型結構所示,我們用以下方法構建模型:
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參數只有單個傳遞給模型,則每一個輸出都用一個loss或者metrics,但在很多情況下不同的輸出需要不同的loss或者metrics,我們就需要對應每個輸出給出不同的值,如下面所示:
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的順序對應,而我們上面的模型中,已經給輸出層進行了命名,則可以通過字典來制定loss與metrics,當輸出超過2個的時候,尤其推薦字典的方式。同時,我們還可以使用loss_weights參數來給不同的輸出指定權重,具體使用方法如下:
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},
????)
除此之外,如果某些輸出不為訓練,只用來預測,則可以寫成這樣:
????#?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在接受多輸入的時候,跟上面loss類似,可以使用numpy數組的list或者dict形式,如下所示:
????#?隨機生成NumPy數據????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,
????)
當然可以將數據轉換成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
總結
以上是生活随笔為你收集整理的selenium之 chromedriver与chrome版本映射表_NLP实战篇之tf2训练与评估的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 电脑配置清单_2020电脑配置清单AMD
- 下一篇: iphone屏幕录制_如何将iPhone