使用Keras和TensorFlow Hub對電影評論進行文本分類 (tensorflow2.0官方教程翻譯)

最全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)練模型可供測試:

讓我們首先創(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)建分類器:

  1. 第一層是TensorFlow Hub層忱详。該層使用預(yù)先訓(xùn)練的保存模型將句子映射到其嵌入向量。我們正在使用的預(yù)訓(xùn)練文本嵌入模型(google/tf2-preview/gnews-swivel-20dim/1)將句子拆分為標記跺涤,嵌入每個標記然后組合嵌入。生成的維度為:(num_examples, embedding_dimension)监透。

  2. 這個固定長度的輸出矢量通過一個帶有16個隱藏單元的完全連接(“密集”)層傳輸桶错。

  3. 最后一層與單個輸出節(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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末趋厉,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子胶坠,更是在濱河造成了極大的恐慌君账,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,406評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件沈善,死亡現(xiàn)場離奇詭異乡数,居然都是意外死亡,警方通過查閱死者的電腦和手機闻牡,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評論 3 393
  • 文/潘曉璐 我一進店門净赴,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人罩润,你說我怎么就攤上這事玖翅。” “怎么了割以?”我有些...
    開封第一講書人閱讀 163,711評論 0 353
  • 文/不壞的土叔 我叫張陵金度,是天一觀的道長。 經(jīng)常有香客問我严沥,道長猜极,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,380評論 1 293
  • 正文 為了忘掉前任祝峻,我火速辦了婚禮魔吐,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘莱找。我一直安慰自己酬姆,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,432評論 6 392
  • 文/花漫 我一把揭開白布奥溺。 她就那樣靜靜地躺著辞色,像睡著了一般。 火紅的嫁衣襯著肌膚如雪浮定。 梳的紋絲不亂的頭發(fā)上相满,一...
    開封第一講書人閱讀 51,301評論 1 301
  • 那天,我揣著相機與錄音桦卒,去河邊找鬼立美。 笑死,一個胖子當(dāng)著我的面吹牛方灾,可吹牛的內(nèi)容都是我干的建蹄。 我是一名探鬼主播碌更,決...
    沈念sama閱讀 40,145評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼洞慎!你這毒婦竟也來了痛单?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,008評論 0 276
  • 序言:老撾萬榮一對情侶失蹤劲腿,失蹤者是張志新(化名)和其女友劉穎旭绒,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體焦人,經(jīng)...
    沈念sama閱讀 45,443評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡挥吵,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,649評論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了花椭。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蔫劣。...
    茶點故事閱讀 39,795評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖个从,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情歪沃,我是刑警寧澤嗦锐,帶...
    沈念sama閱讀 35,501評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站沪曙,受9級特大地震影響奕污,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜液走,卻給世界環(huán)境...
    茶點故事閱讀 41,119評論 3 328
  • 文/蒙蒙 一碳默、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧缘眶,春花似錦嘱根、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,731評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至顶燕,卻和暖如春凑保,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背涌攻。 一陣腳步聲響...
    開封第一講書人閱讀 32,865評論 1 269
  • 我被黑心中介騙來泰國打工欧引, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人恳谎。 一個月前我還...
    沈念sama閱讀 47,899評論 2 370
  • 正文 我出身青樓芝此,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子癌蓖,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,724評論 2 354

推薦閱讀更多精彩內(nèi)容