0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

如何使用TensorFlow Hub文本模塊構(gòu)建一個(gè)模型,以根據(jù)相關(guān)描述預(yù)測(cè)電影類型

Tensorflowers ? 來源:未知 ? 作者:李倩 ? 2018-09-07 17:13 ? 次閱讀

將遷移學(xué)習(xí)應(yīng)用于計(jì)算機(jī)視覺模型的例子很常見,但如果將其用于文本分類,情況又會(huì)如何呢?不妨進(jìn)入TensorFlow Hub,這是通過遷移學(xué)習(xí)來增強(qiáng) TF 模型的內(nèi)容庫(kù)。遷移學(xué)習(xí)是這樣一種過程:選用已借助大量數(shù)據(jù)訓(xùn)練好的已有模型的權(quán)重和變量,并將其運(yùn)用于自己的數(shù)據(jù)和預(yù)測(cè)任務(wù)。

遷移學(xué)習(xí)具有諸多好處,其中之一就是您無需像從頭開始訓(xùn)練時(shí)一樣提供自己的大量訓(xùn)練數(shù)據(jù)。但這些已有模型又來自何處呢?這正是 TensorFlow Hub 大顯身手之處:它可以為各類模型(圖像、文本等)提供現(xiàn)有模型檢查點(diǎn)的完整存儲(chǔ)區(qū)。在本篇博文中,我將介紹如何使用 TensorFlow Hub 文本模塊構(gòu)建一個(gè)模型,以根據(jù)相關(guān)描述預(yù)測(cè)電影類型。

您可以使用Colab在瀏覽器中運(yùn)行此模型,無需任何設(shè)置。

導(dǎo)入數(shù)據(jù)并進(jìn)行預(yù)處理

在這個(gè)模型中,我們將使用Kaggle 電影數(shù)據(jù)集這個(gè)出色的公共領(lǐng)域資源。該數(shù)據(jù)集包含逾 45000 部電影的數(shù)據(jù),每部電影均有大量相關(guān)數(shù)據(jù)。為簡(jiǎn)便起見,我們僅使用該數(shù)據(jù)集中的電影描述(稱作 “簡(jiǎn)介”)和電影類型。下面是該數(shù)據(jù)集在 Kaggle 中的預(yù)覽:

注:Kaggle 電影數(shù)據(jù)集鏈接

https://www.kaggle.com/rounakbanik/the-movies-dataset/home

首先,我們將導(dǎo)入要使用的內(nèi)容庫(kù),以構(gòu)建此模型:

1import numpy as np

2import pandas as pd

3

4import tensorflow as tf

5import tensorflow_hub as hub

6

7from sklearn.preprocessing import MultiLabelBinarizer

我已經(jīng)將這個(gè)數(shù)據(jù)集的 CSV 文件放在一個(gè)公共 Cloud Storage 存儲(chǔ)分區(qū)中。我們可以運(yùn)行如下命令,將數(shù)據(jù)下載到我們的 Colab 實(shí)例中,并讀取為 Pandas dataframe 格式:

1!wget 'https://storage.googleapis.com/movies_data/movies_metadata.csv'

2data = pd.read_csv('movies_metadata.csv')

3

4descriptions = data['overview']

5genres = data['genres']

為簡(jiǎn)便起見,我們將可能的類型限定為下列幾種:

1top_genres = ['Comedy', 'Thriller', 'Romance', 'Action', 'Horror', 'Crime', 'Documentary', 'Adventure', 'Science Fiction']

我們將數(shù)據(jù)集限定為這些類型中描述非空白的電影,然后按照 80% 訓(xùn)練和 20% 測(cè)試的比例將數(shù)據(jù)劃分為訓(xùn)練數(shù)據(jù)集和測(cè)試數(shù)據(jù)集:

1train_size = int(len(descriptions) * .8)

2

3train_descriptions = descriptions[:train_size]

4train_genres = genres[:train_size]

5

6test_descriptions = descriptions[train_size:]

7test_genres = genres[train_size:]

使用 TF Hub 構(gòu)建嵌入層

以 TF Hub 創(chuàng)建嵌入層時(shí)僅需使用極少量代碼。我們的模型僅有一個(gè)特征(描述),并將表示為一個(gè)嵌入列。文本嵌入提供了在向量空間表示文本內(nèi)容的方法,如此一來,嵌入空間中相似的字詞或句子會(huì)更靠近(您可在此處閱讀更多相關(guān)內(nèi)容)。您可以完全使用自己的數(shù)據(jù)從頭開始構(gòu)建文本嵌入向量。TF Hub 可提供已使用各種文本數(shù)據(jù)訓(xùn)練過的文本嵌入,因而能夠簡(jiǎn)化這一過程。

注:文本嵌入鏈接

https://www.tensorflow.org/hub/modules/text

對(duì)于英文文本,TF Hub 提供了各種已使用不同種類文本數(shù)據(jù)訓(xùn)練過的嵌入:

通用語句編碼器 (Universal sentence encoder):用于較長(zhǎng)的文本輸入

ELMo:使用十億單詞基準(zhǔn) (1B Word Benchmark) 訓(xùn)練過的深度嵌入

神經(jīng)網(wǎng)絡(luò)語言模型 (Neural Network Language Model)嵌入:通過 Google 新聞?dòng)?xùn)練

Word2vec:通過 Wikipedia 訓(xùn)練

您所選擇的預(yù)訓(xùn)練文本嵌入是您模型中的一個(gè)超參數(shù),所以最好用不同的文本嵌入進(jìn)行試驗(yàn),看看哪個(gè)的準(zhǔn)確性最高。先從用與您的文本最接近的文本訓(xùn)練過的模型開始。由于我們的電影描述都是較長(zhǎng)的輸入,因此,我發(fā)現(xiàn)使用通用語句編碼器嵌入的準(zhǔn)確性最高。這可以將我們的描述編碼為高維文本向量。請(qǐng)注意,這一特定模型很大,會(huì)占用 1GB 容量。

注:通用語句編碼器鏈接

https://www.tensorflow.org/hub/modules/google/universal-sentence-encoder/2

我們可以使用 hub.text_embedding_column,以一行代碼為該層創(chuàng)建一個(gè)特征列,并向其傳遞我們層的名稱 (“movie_descriptions”) 和要使用的 TF Hub 模型網(wǎng)址:

1description_embeddings = hub.text_embedding_column(

2"movie_descriptions",

3module_spec="https://tfhub.dev/google/universal-sentence-encoder/2"

4)

請(qǐng)注意,該單元正在下載預(yù)訓(xùn)練過的嵌入,因此需要一些時(shí)間來運(yùn)行。

此操作最大的好處在于,我們無需進(jìn)行任何預(yù)處理,即可將文本描述饋送至預(yù)訓(xùn)練過的字詞嵌入。如果從頭開始構(gòu)建此模型,我們就需要自己將描述轉(zhuǎn)換為向量,但使用 TF Hub 列,我們可以將描述字符串直接傳遞至模型。

標(biāo)簽變?yōu)?multi-hot 編碼

由于一部電影往往具有多種類型,所以我們的模型會(huì)為每部電影返回多個(gè)可能的標(biāo)簽。我們的類型目前是每部電影有一個(gè)字符串列表(例如 [‘Action’, ‘Adventure’])。由于每個(gè)標(biāo)簽的長(zhǎng)度必須相同,所以我們要將這些列表轉(zhuǎn)換為由 1 和 0(與特定描述中的類型相對(duì)應(yīng))組成的 multi-hot 向量。動(dòng)作冒險(xiǎn)片的 multi-hot 向量如下所示:

注:多個(gè)可能的標(biāo)簽鏈接

https://en.wikipedia.org/wiki/Multi-label_classification

1# Genre lookup, each genre corresponds to an index

2top_genres = ['Comedy', 'Thriller', 'Romance', 'Action', 'Horror', 'Crime', 'Documentary', 'Adventure', 'Science Fiction']

3

4# Multi-hot label for an action and adventure movie

5[0 0 0 1 0 0 0 1 0]

要用短短幾行代碼將字符串標(biāo)簽轉(zhuǎn)換為 multi-hot 向量,我們需要使用名為 MultiLabelBinarizer 的 Scikit Learn 實(shí)用程序:

1encoder = MultiLabelBinarizer()

2encoder.fit_transform(train_genres)

3train_encoded = encoder.transform(train_genres)

4test_encoded = encoder.transform(test_genres)

5num_classes = len(encoder.classes_)

您可以打印 encoder.classes_,查看模型預(yù)測(cè)的所有字符串類列表。

構(gòu)建并訓(xùn)練 DNNEstimator 模型

針對(duì)我們的模型,我們將使用 DNNEstimator 構(gòu)建能夠返回 multi-hot 向量的深度神經(jīng)網(wǎng)絡(luò),這是因?yàn)槊坎侩娪皶?huì)具有 0 個(gè)或多個(gè)可能的標(biāo)簽(這與每個(gè)輸出正好有一個(gè)標(biāo)簽的模型不同)。我們傳遞至 DNNEstimator 的第一個(gè)參數(shù)稱作 head,且此參數(shù)會(huì)定義我們的模型預(yù)期具有的標(biāo)簽類型。我們希望我們的模型可以輸出多個(gè)標(biāo)簽,所以我們?cè)谶@里使用 multi_label_head:

1multi_label_head = tf.contrib.estimator.multi_label_head(

2num_classes,

3loss_reduction=tf.losses.Reduction.SUM_OVER_BATCH_SIZE

4)

現(xiàn)在,當(dāng)我們實(shí)例化 DNNEstimator 時(shí),便可對(duì)其進(jìn)行傳遞。hidden_units 參數(shù)表示我們網(wǎng)絡(luò)中的層數(shù)。此模型有 2 個(gè)層,第一層有 64 個(gè)神經(jīng)元,第二層有 10 個(gè)。層數(shù)和層大小是超參數(shù),所以您應(yīng)當(dāng)嘗試不同的值,看看哪個(gè)最適合您的數(shù)據(jù)集。最后,我們將特征列傳遞至估算器。在本例中,我們只有一個(gè)特征列(即描述),而且在上文中已將其定義為 TF Hub 嵌入列,所以在此我們可以將其作為列表傳遞:

1estimator = tf.contrib.estimator.DNNEstimator(

2head=multi_label_head,

3hidden_units=[64,10],

4feature_columns=[description_embeddings]

5)

我們基本準(zhǔn)備就緒,很快就可以開始訓(xùn)練模型了。在訓(xùn)練估算器實(shí)例之前,我們需要定義訓(xùn)練輸入函數(shù)。輸入函數(shù)可以將我們的數(shù)據(jù)與模型聯(lián)系起來。在這里,我們將使用 numpy_input_fn,并將我們的數(shù)據(jù)作為 Numpy 數(shù)組饋送至模型:

1# Format our data for the numpy_input_fn

2features = {

3"descriptions": np.array(train_descriptions)

4}

5labels = np.array(train_encoded)

6

7train_input_fn = tf.estimator.inputs.numpy_input_fn(

8features,

9labels,

10shuffle=True,

11batch_size=32,

12num_epochs=20

13)

我們輸入函數(shù)中的 batch_size 和 num_epochs 參數(shù)都是超函數(shù)。batch_size 可告知我們的模型在一次迭代中會(huì)有多少示例傳遞至模型,而 num_epochs 是指我們的模型完成整個(gè)訓(xùn)練集的次數(shù)。

現(xiàn)在可以開始訓(xùn)練我們的模型了。只用一行代碼即可:

1estimator.train(input_fn=train_input_fn)

為了評(píng)估模型的準(zhǔn)確性,我們用自己的測(cè)試數(shù)據(jù)創(chuàng)建一個(gè) eval 函數(shù) input_function,然后調(diào)用 estimator.evaluate():

1eval_input_fn = tf.estimator.inputs.numpy_input_fn({"descriptions": np.array(test_descriptions).astype(np.str)}, test_encoded.astype(np.int32), shuffle=False)

2

3estimator.evaluate(input_fn=eval_input_fn)

此模型的 AUC 達(dá)到 91.5%,而查準(zhǔn)率/查全率為 74%。您的結(jié)果可能稍有不同。

使用我們已訓(xùn)練的模型生成預(yù)測(cè)結(jié)果

現(xiàn)在到了最精彩的部分:根據(jù)我們的模型從未見過的數(shù)據(jù)生成預(yù)測(cè)結(jié)果。首先,我們?cè)O(shè)置一個(gè)包含一些描述的數(shù)組(我從 IMDB 中獲取這些描述):

1raw_test = [

2"An examination of our dietary choices and the food we put in our bodies. Based on Jonathan Safran Foer's memoir.", # Documentary

3"A teenager tries to survive the last week of her disastrous eighth-grade year before leaving to start high school.", # Comedy

4"Ethan Hunt and his IMF team, along with some familiar allies, race against time after a mission gone wrong." # Action, Adventure

5]

然后,我們定義預(yù)測(cè)輸入函數(shù)并調(diào)用 predict():

1predict_input_fn = tf.estimator.inputs.numpy_input_fn({"descriptions": np.array(raw_test).astype(np.str)}, shuffle=False)

2

3results = estimator.predict(predict_input_fn)

最后,我們可以迭代訪問結(jié)果,并顯示為每部電影找到的前 2 個(gè)類型及其置信度值:

1for movie_genres in results:

2top_2 = movie_genres['probabilities'].argsort()[-2:][::-1]

3for genre intop_2:

4text_genre = encoder.classes_[genre]

5print(text_genre + ': ' + str(round(movie_genres['probabilities'][genre] * 100, 2)) + '%')

我們的模型能夠正確標(biāo)記上述所有電影描述。

使用入門

想用 TF Hub 開始構(gòu)建自己的模型嗎?請(qǐng)參閱此文檔和教程。您可以在GitHub或Colab上找到本文所述的完整模型代碼。在之后的博文中,我會(huì)介紹如何導(dǎo)出此模型,以用于 TensorFlow Serving 或 Cloud ML Engine,并構(gòu)建可根據(jù)新描述生成預(yù)測(cè)結(jié)果的應(yīng)用。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 數(shù)據(jù)集
    +關(guān)注

    關(guān)注

    4

    文章

    1208

    瀏覽量

    24699
  • tensorflow
    +關(guān)注

    關(guān)注

    13

    文章

    329

    瀏覽量

    60532
  • 遷移學(xué)習(xí)
    +關(guān)注

    關(guān)注

    0

    文章

    74

    瀏覽量

    5561

原文標(biāo)題:使用 TensorFlow Hub 和估算器構(gòu)建文本分類模型

文章出處:【微信號(hào):tensorflowers,微信公眾號(hào):Tensorflowers】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    如何使用TensorFlow構(gòu)建機(jī)器學(xué)習(xí)模型

    在這篇文章中,我將逐步講解如何使用 TensorFlow 創(chuàng)建個(gè)簡(jiǎn)單的機(jī)器學(xué)習(xí)模型。
    的頭像 發(fā)表于 01-08 09:25 ?985次閱讀
    如何使用<b class='flag-5'>TensorFlow</b><b class='flag-5'>構(gòu)建</b>機(jī)器學(xué)習(xí)<b class='flag-5'>模型</b>

    高階API構(gòu)建模型和數(shù)據(jù)集使用

    能擬合或逼近現(xiàn)實(shí)世界中事物或現(xiàn)象的數(shù)學(xué)模型,故樣本數(shù)據(jù)大,可以覆蓋事物或現(xiàn)象所有特征時(shí),可以越準(zhǔn)確的識(shí)別事物,這也是大數(shù)據(jù)時(shí)代,數(shù)據(jù)是燃料的觀點(diǎn)。TensorFlow個(gè)神經(jīng)網(wǎng)絡(luò)軟件
    發(fā)表于 11-04 07:49

    如何構(gòu)建文本生成器?如何實(shí)現(xiàn)馬爾可夫鏈實(shí)現(xiàn)更快的預(yù)測(cè)模型

    Compose,聊天機(jī)器人都是應(yīng)用的例子,本文將使用馬爾可夫鏈構(gòu)建個(gè)文本生成器。這將是個(gè)
    發(fā)表于 11-22 15:06

    谷歌推出了AdaNet,個(gè)基于TensorFlow的輕量化框架

    AdaNet采用TensorFlow估計(jì)器的交互界面,它通過簡(jiǎn)單訓(xùn)練、評(píng)估,大大簡(jiǎn)化了機(jī)器學(xué)習(xí)的編程過程。它把TensorFlow Hub模塊、Te
    的頭像 發(fā)表于 11-05 15:27 ?3131次閱讀

    訓(xùn)練個(gè)機(jī)器學(xué)習(xí)模型,實(shí)現(xiàn)了根據(jù)基于文本分析預(yù)測(cè)葡萄酒質(zhì)量

    我們可以把上述的其他信息也引入作為特征參數(shù),這樣就能構(gòu)建個(gè)更全面的模型預(yù)測(cè)葡萄酒質(zhì)量。為了將文字
    的頭像 發(fā)表于 05-16 18:27 ?6151次閱讀

    PyTorch Hub發(fā)布獲Yann LeCun強(qiáng)推 行代碼調(diào)用經(jīng)典模型

    全新API PyTorch Hub提供模型的基本構(gòu)建模塊,用于提高機(jī)器學(xué)習(xí)研究的模型復(fù)現(xiàn)性。
    的頭像 發(fā)表于 06-12 14:41 ?2384次閱讀

    Facebook新推出了個(gè)深度學(xué)習(xí)工具包:PyTorch Hub

    TensorFlow Hub個(gè)共享可重用的機(jī)器學(xué)習(xí)平臺(tái),主要面向開發(fā)者,谷歌希望TensorFlow
    的頭像 發(fā)表于 06-15 09:58 ?4777次閱讀

    如何構(gòu)建個(gè)雙編碼器神經(jīng)網(wǎng)絡(luò)模型

    這個(gè)例子需要TensorFlow 2.4或更高版本。此外,BERT模型需要TensorFlow HubTensorFlow Text,Ad
    的頭像 發(fā)表于 03-02 15:59 ?2540次閱讀

    如何在TensorFlow構(gòu)建并訓(xùn)練CNN模型

    TensorFlow構(gòu)建并訓(xùn)練個(gè)卷積神經(jīng)網(wǎng)絡(luò)(CNN)模型
    的頭像 發(fā)表于 07-04 11:47 ?926次閱讀

    如何使用Tensorflow保存或加載模型

    TensorFlow個(gè)廣泛使用的開源機(jī)器學(xué)習(xí)庫(kù),它提供了豐富的API來構(gòu)建和訓(xùn)練各種深度學(xué)習(xí)模型。在
    的頭像 發(fā)表于 07-04 13:07 ?1505次閱讀

    keras模型轉(zhuǎn)tensorflow session

    在這篇文章中,我們將討論如何將Keras模型轉(zhuǎn)換為TensorFlow session。 Keras和TensorFlow簡(jiǎn)介 Keras是個(gè)
    的頭像 發(fā)表于 07-05 09:36 ?534次閱讀

    tensorflow簡(jiǎn)單的模型訓(xùn)練

    TensorFlow開始,然后介紹如何構(gòu)建和訓(xùn)練個(gè)簡(jiǎn)單的神經(jīng)網(wǎng)絡(luò)模型。 1. 安裝TensorFlow
    的頭像 發(fā)表于 07-05 09:38 ?662次閱讀

    神經(jīng)網(wǎng)絡(luò)預(yù)測(cè)模型構(gòu)建方法

    神經(jīng)網(wǎng)絡(luò)模型作為種強(qiáng)大的預(yù)測(cè)工具,廣泛應(yīng)用于各種領(lǐng)域,如金融、醫(yī)療、交通等。本文將詳細(xì)介紹神經(jīng)網(wǎng)絡(luò)預(yù)測(cè)模型
    的頭像 發(fā)表于 07-05 17:41 ?659次閱讀

    利用TensorFlow實(shí)現(xiàn)基于深度神經(jīng)網(wǎng)絡(luò)的文本分類模型

    要利用TensorFlow實(shí)現(xiàn)個(gè)基于深度神經(jīng)網(wǎng)絡(luò)(DNN)的文本分類模型,我們首先需要明確幾個(gè)關(guān)鍵步驟:數(shù)據(jù)預(yù)處理、
    的頭像 發(fā)表于 07-12 16:39 ?855次閱讀

    如何使用Python構(gòu)建LSTM神經(jīng)網(wǎng)絡(luò)模型

    numpy tensorflow 2. 準(zhǔn)備數(shù)據(jù) LSTM模型通常用于序列數(shù)據(jù),比如時(shí)間序列預(yù)測(cè)文本生成。這里我們
    的頭像 發(fā)表于 11-13 10:10 ?350次閱讀