最全tensorflow2.0學(xué)習(xí)路線 https://www.mashangxue123.com
最新版本:https://www.mashangxue123.com/tensorflow/tf2-tutorials-keras-basic_text_classification_with_tfhub.html
此教程本會將文本形式的影評分為“正面”或“負面”影評。這是一個二元分類(又稱為兩類分類)的示例幻锁,也是一種重要且廣泛適用的機器學(xué)習(xí)問題尝蠕。
本教程演示了使用TensorFlow Hub和Keras進行遷移學(xué)習(xí)的基本應(yīng)用侦香。
數(shù)據(jù)集使用 IMDB 數(shù)據(jù)集,其中包含來自互聯(lián)網(wǎng)電影數(shù)據(jù)庫 https://www.imdb.com/ 的50000 條影評文本纺阔。我們將這些影評拆分為訓(xùn)練集(25000 條影評)和測試集(25000 條影評)。訓(xùn)練集和測試集之間達成了平衡,意味著它們包含相同數(shù)量的正面和負面影評撞蚕。
此教程使用tf.keras,一種用于在 TensorFlow 中構(gòu)建和訓(xùn)練模型的高階 API过牙,以及TensorFlow Hub甥厦,一個用于遷移學(xué)習(xí)的庫和平臺纺铭。
有關(guān)使用 tf.keras 的更高級文本分類教程,請參閱 MLCC 文本分類指南刀疙。
導(dǎo)入庫:
from __future__ import absolute_import, division, print_function, unicode_literals
import numpy as np
import tensorflow as tf
import tensorflow_hub as hub
import tensorflow_datasets as tfds
print("Version: ", tf.__version__)
print("Eager mode: ", tf.executing_eagerly())
print("Hub version: ", hub.__version__)
print("GPU is", "available" if tf.test.is_gpu_available() else "NOT AVAILABLE")
1. 下載 IMDB 數(shù)據(jù)集
TensorFlow數(shù)據(jù)集上提供了IMDB數(shù)據(jù)集舶赔。以下代碼將IMDB數(shù)據(jù)集下載到您的機器:
# 將訓(xùn)練集分成60%和40%,因此我們最終會得到15,000個訓(xùn)練樣本谦秧,10,000個驗證樣本和25,000個測試樣本竟纳。
train_validation_split = tfds.Split.TRAIN.subsplit([6, 4])
(train_data, validation_data), test_data = tfds.load(
name="imdb_reviews",
split=(train_validation_split, tfds.Split.TEST),
as_supervised=True)
2. 探索數(shù)據(jù)
我們花點時間來了解一下數(shù)據(jù)的格式,每個樣本表示電影評論和相應(yīng)標簽的句子疚鲤,該句子不以任何方式進行預(yù)處理锥累。每個標簽都是整數(shù)值 0 或 1,其中 0 表示負面影評集歇,1 表示正面影評桶略。
我們先打印10個樣本。
train_examples_batch, train_labels_batch = next(iter(train_data.batch(10)))
train_examples_batch
我們還打印前10個標簽鬼悠。
train_labels_batch
3. 構(gòu)建模
神經(jīng)網(wǎng)絡(luò)通過堆疊層創(chuàng)建而成删性,這需要做出三個架構(gòu)方面的主要決策:
- 如何表示文字?
- 要在模型中使用多少個層焕窝?
- 要針對每個層使用多少個隱藏單元蹬挺?
在此示例中,輸入數(shù)據(jù)由句子組成它掂。要預(yù)測的標簽是0或1巴帮。
表示文本的一種方法是將句子轉(zhuǎn)換為嵌入向量。我們可以使用預(yù)先訓(xùn)練的文本嵌入作為第一層虐秋,這將具有兩個優(yōu)點:
- 我們不必擔(dān)心文本預(yù)處理榕茧,
- 我們可以從遷移學(xué)習(xí)中受益
- 嵌入具有固定的大小,因此處理起來更簡單客给。
對于此示例用押,我們將使用來自TensorFlow Hub 的預(yù)訓(xùn)練文本嵌入模型滚朵,名為google/tf2-preview/gnews-swivel-20dim/1.
要達到本教程的目的晕鹊,還有其他三種預(yù)訓(xùn)練模型可供測試:
google/tf2-preview/gnews-swivel-20dim-with-oov/1 與 google/tf2-preview/gnews-swivel-20dim/1相同,但2.5%的詞匯量轉(zhuǎn)換為OOV桶眠冈。如果模型的任務(wù)和詞匯表的詞匯不完全重疊桩引,這可以提供幫助缎讼。
google/tf2-preview/nnlm-en-dim50/1 一個更大的模型,具有約1M的詞匯量和50個維度坑匠。
google/tf2-preview/nnlm-en-dim128/1 甚至更大的模型血崭,具有約1M的詞匯量和128個維度。
讓我們首先創(chuàng)建一個使用TensorFlow Hub模型嵌入句子的Keras層,并在幾個輸入示例上進行嘗試夹纫。請注意咽瓷,無論輸入文本的長度如何,嵌入的輸出形狀為:(num_examples, embedding_dimension)
捷凄。
embedding = "https://tfhub.dev/google/tf2-preview/gnews-swivel-20dim/1"
hub_layer = hub.KerasLayer(embedding, input_shape=[],
dtype=tf.string, trainable=True)
hub_layer(train_examples_batch[:3])
現(xiàn)在讓我們構(gòu)建完整的模型:
model = tf.keras.Sequential()
model.add(hub_layer)
model.add(tf.keras.layers.Dense(16, activation='relu'))
model.add(tf.keras.layers.Dense(1, activation='sigmoid'))
model.summary()
Model: "sequential"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
keras_layer (KerasLayer) (None, 20) 400020
_________________________________________________________________
dense (Dense) (None, 16) 336
_________________________________________________________________
dense_1 (Dense) (None, 1) 17
=================================================================
Total params: 400,373 Trainable params: 400,373 Non-trainable params: 0
_________________________________________________________________
這些圖層按順序堆疊以構(gòu)建分類器:
第一層是TensorFlow Hub層忱详。該層使用預(yù)先訓(xùn)練的保存模型將句子映射到其嵌入向量。我們正在使用的預(yù)訓(xùn)練文本嵌入模型(google/tf2-preview/gnews-swivel-20dim/1)將句子拆分為標記跺涤,嵌入每個標記然后組合嵌入。生成的維度為:
(num_examples, embedding_dimension)
监透。這個固定長度的輸出矢量通過一個帶有16個隱藏單元的完全連接(“密集”)層傳輸桶错。
最后一層與單個輸出節(jié)點密集連接。使用
sigmoid
激活函數(shù)胀蛮,該值是0到1之間的浮點數(shù)院刁,表示概率或置信度。
讓我們編譯模型粪狼。
3.1. 損失函數(shù)和優(yōu)化器
模型在訓(xùn)練時需要一個損失函數(shù)和一個優(yōu)化器退腥。由于這是一個二元分類問題且模型會輸出一個概率(應(yīng)用 S 型激活函數(shù)的單個單元層),因此我們將使用 binary_crossentropy 損失函數(shù)再榄。
該函數(shù)并不是唯一的損失函數(shù)狡刘,例如,您可以選擇 mean_squared_error困鸥。但一般來說嗅蔬,binary_crossentropy 更適合處理概率問題,它可測量概率分布之間的“差距”疾就,在本例中則為實際分布和預(yù)測之間的“差距”澜术。
稍后,在探索回歸問題(比如預(yù)測房價)時猬腰,我們將了解如何使用另一個稱為均方誤差的損失函數(shù)鸟废。
現(xiàn)在,配置模型以使用優(yōu)化器和損失函數(shù):
model.compile(optimizer='adam',
loss='binary_crossentropy',
metrics=['accuracy'])
4. 訓(xùn)練模型
用有 512 個樣本的小批次訓(xùn)練模型 40 個周期姑荷。這將對 x_train 和 y_train 張量中的所有樣本進行 40 次迭代盒延。在訓(xùn)練期間,監(jiān)控模型在驗證集的 10000 個樣本上的損失和準確率:
history = model.fit(train_data.shuffle(10000).batch(512),
epochs=20,
validation_data=validation_data.batch(512),
verbose=1)
...output
Epoch 20/20
30/30 [==============================] - 4s 144ms/step - loss: 0.2027 - accuracy: 0.9264 - val_loss: 0.3079 - val_accuracy: 0.8697
5. 評估模型
我們來看看模型的表現(xiàn)如何厢拭。模型會返回兩個值:損失(表示誤差的數(shù)字兰英,越低越好)和準確率。
results = model.evaluate(test_data.batch(512), verbose=0)
for name, value in zip(model.metrics_names, results):
print("%s: %.3f" % (name, value))
loss: 0.324 accuracy: 0.860
使用這種相當(dāng)簡單的方法可實現(xiàn)約 87% 的準確率供鸠。如果采用更高級的方法畦贸,模型的準確率應(yīng)該會接近 95%。
6. 進一步閱讀
要了解處理字符串輸入的更一般方法,以及更詳細地分析訓(xùn)練過程中的準確性和損失薄坏,請查看 https://www.tensorflow.org/tutorials/keras/basic_text_classification
最全tensorflow2.0學(xué)習(xí)路線 https://www.mashangxue123.com
最新版本:https://www.mashangxue123.com/tensorflow/tf2-tutorials-keras-basic_text_classification_with_tfhub.html