佳木斯湛栽影视文化发展公司

主頁(yè) > 知識(shí)庫(kù) > 機(jī)器深度學(xué)習(xí)二分類電影的情感問(wèn)題

機(jī)器深度學(xué)習(xí)二分類電影的情感問(wèn)題

熱門標(biāo)簽:Win7旗艦版 電話運(yùn)營(yíng)中心 語(yǔ)音系統(tǒng) 呼叫中心市場(chǎng)需求 百度AI接口 企業(yè)做大做強(qiáng) 硅谷的囚徒呼叫中心 客戶服務(wù)

二分類問(wèn)題可能是應(yīng)用最廣泛的機(jī)器學(xué)習(xí)問(wèn)題。今天我們將學(xué)習(xí)根據(jù)電影評(píng)論的文字內(nèi)容將其劃分為正面或負(fù)面。

一、數(shù)據(jù)集來(lái)源

我們使用的是IMDB數(shù)據(jù)集,它包含來(lái)自互聯(lián)網(wǎng)電影數(shù)據(jù)庫(kù)(IMDB)的50000條嚴(yán)重兩極分化的評(píng)論。為了避免模型過(guò)擬合只記住訓(xùn)練數(shù)據(jù),我們將數(shù)據(jù)集分為用于訓(xùn)練的25000條評(píng)論與用于測(cè)試的25000條評(píng)論,訓(xùn)練集和測(cè)試集都包含50%的正面評(píng)論和50%的負(fù)面評(píng)論。

與MNIST數(shù)據(jù)集一樣,IMDB數(shù)據(jù)集也內(nèi)置于Keras庫(kù)。它已經(jīng)過(guò)預(yù)處理:評(píng)論(單詞序列)已經(jīng)被轉(zhuǎn)換為整數(shù)序列,其中每個(gè)整數(shù)代表字典中的某個(gè)單詞。

通過(guò)以下代碼加載數(shù)據(jù)集并限制每條評(píng)論最多取前一萬(wàn)個(gè)常用的word,以便于我們進(jìn)行向量處理。

import tensorflow as tf
imdb = tf.keras.datasets.imdb
(train_data, train_labels),(test_data, test_labels) = imdb.load_data(num_words=10000)
print(train_data[0])
print(train_labels[0])

通過(guò)輸出可以看到,train_data和test_data是評(píng)論記錄的集合,每條評(píng)論記錄又是由眾多的單詞索引組成的集合。
train_labels和test_labels是針對(duì)評(píng)論的分類的集合,其中0表示負(fù)面評(píng)論,1表示正面評(píng)論。

[1, 14, 22, 16, 43, 530, 973, 1622, 1385, 65, 458, 4468, 66, 3941, 4, 173, 36, 256, 5, 25, 100, 43, 838, 112, 50, 670, 2, 9, 35, 480, 284, 5, 150, 4, 172, 112, 167, 2, 336, 385, 39, 4, 172, 4536, 1111, 17, 546, 38, 13, 447, 4, 192, 50, 16, 6, 147, 2025, 19, 14, 22, 4, 1920, 4613, 469, 4, 22, 71, 87, 12, 16, 43, 530, 38, 76, 15, 13, 1247, 4, 22, 17, 515, 17, 12, 16, 626, 18, 2, 5, 62, 386, 12, 8, 316, 8, 106, 5, 4, 2223, 5244, 16, 480, 66, 3785, 33, 4, 130, 12, 16, 38, 619, 5, 25, 124, 51, 36, 135, 48, 25, 1415, 33, 6, 22, 12, 215, 28, 77, 52, 5, 14, 407, 16, 82, 2, 8, 4, 107, 117, 5952, 15, 256, 4, 2, 7, 3766, 5, 723, 36, 71, 43, 530, 476, 26, 400, 317, 46, 7, 4, 2, 1029, 13, 104, 88, 4, 381, 15, 297, 98, 32, 2071, 56, 26, 141, 6, 194, 7486, 18, 4, 226, 22, 21, 134, 476, 26, 480, 5, 144, 30, 5535, 18, 51, 36, 28, 224, 92, 25, 104, 4, 226, 65, 16, 38, 1334, 88, 12, 16, 283, 5, 16, 4472, 113, 103, 32, 15, 16, 5345, 19, 178, 32]
1

我們可以通過(guò)word與編號(hào)的映射關(guān)系將評(píng)論的內(nèi)容轉(zhuǎn)化為具體的文本

def get_text(comment_num):
    """將數(shù)字形式的評(píng)論轉(zhuǎn)化為文本"""
    # word_index = tf.keras.datasets.imdb.get_word_index()
    word_index = imdb.get_word_index()
    reverse_word_index = dict([(value, key) for (key, value) in word_index.items()])
    text = ' '.join([reverse_word_index.get(i - 3, '?') for i in comment_num])
    return text
comment = get_text(train_data[0])
print(comment)

第一條電影評(píng)論的內(nèi)容

? this film was just brilliant casting location scenery story direction everyone's really suited the part they played and you could just imagine being there robert ? is an amazing actor and now the same being director ?

二、格式化輸入數(shù)據(jù)

由于我們無(wú)法直接將整數(shù)序列輸入神經(jīng)網(wǎng)絡(luò),所以需要將其轉(zhuǎn)換為張量??梢酝ㄟ^(guò)以下兩種方式進(jìn)行轉(zhuǎn)化

填充列表,使其具有相同的長(zhǎng)度,然后將列表轉(zhuǎn)化為(samples, word_index)的2D形狀的整數(shù)張量。對(duì)列表進(jìn)行one-hot編碼,將其轉(zhuǎn)化為0和1組成的向量。

這里我們采用one-hot進(jìn)行編碼處理

def vectorize_sequences(sequences, diamension = 10000):
    results = np.zeros((len(sequences), diamension))
    for i, sequence in enumerate(sequences):
        results[i, sequence] = 1
    return results
x_train = vectorize_sequences(train_data)
print(x_train[0])
print(len(x_train[0]))
x_test = vectorize_sequences(test_data)
print(x_test[0])
print(len(x_test[0]))

轉(zhuǎn)化完成的輸入結(jié)果

[0. 1. 1. ... 0. 0. 0.]

10000

[0. 1. 1. ... 0. 0. 0.]

將標(biāo)簽進(jìn)行向量化處理

y_train = np.asarray(train_labels).astype('float32')
y_test = np.asarray(test_labels).astype('float32')

三、構(gòu)建神經(jīng)網(wǎng)絡(luò)

針對(duì)這里二分類單標(biāo)簽,我們可以直接使用帶有relu激活函數(shù)的全連接層的簡(jiǎn)單堆疊。
我們使用了兩個(gè)具有16個(gè)隱藏單元的中間層和具有一個(gè)隱藏單元的層。中間層使用的relu激活函數(shù)負(fù)責(zé)將所有的負(fù)值歸零,最后一層使用sigmoid函數(shù)將任意值壓縮到[0,1]之間并作為預(yù)測(cè)結(jié)果的概率。

model = models.Sequential()
model.add(layers.Dense(16, activation='relu', input_shape=(10000,)))
model.add(layers.Dense(16, activation='relu'))
model.add(layers.Dense(1, activation='sigmoid'))

這里的Dense層實(shí)現(xiàn)了如下的張量計(jì)算,傳入Dense層的參數(shù)16表示隱藏單元的個(gè)數(shù),同時(shí)也表示這個(gè)層輸出的數(shù)據(jù)的維度數(shù)量。隱藏單元越多,網(wǎng)絡(luò)越能夠?qū)W習(xí)到更加復(fù)雜的表示,但是網(wǎng)絡(luò)計(jì)算的代價(jià)就越高。

output = relu(dot(W, input) + b)

我們使用rmsprop優(yōu)化器和binary_crossentropy損失函數(shù)來(lái)配置模型。

model.compile(optimizer='rmsprop', loss='binary_crossentropy', metrics=['accuracy'])

四、訓(xùn)練模型

將訓(xùn)練數(shù)據(jù)分出一小部分作為校驗(yàn)數(shù)據(jù),同時(shí)將512個(gè)樣本作為一批量處理,并進(jìn)行20輪的訓(xùn)練,同時(shí)出入validation_data來(lái)監(jiān)控校驗(yàn)樣本上的損失和計(jì)算精度。

x_val = x_train[:10000]
partial_x_train = x_train[10000:]
y_val = y_train[:10000]
partial_y_train = y_train[10000:]
history = model.fit(partial_x_train, partial_y_train, epochs= 20, batch_size=512, validation_data=(x_val, y_val))

調(diào)用fit()返回的history對(duì)象包含訓(xùn)練過(guò)程的所有數(shù)據(jù)

history_dict = history.history
print(history_dict.keys())

字典中包含4個(gè)條目,對(duì)應(yīng)訓(xùn)練過(guò)程和校驗(yàn)過(guò)程的指標(biāo),其中l(wèi)oss是訓(xùn)練過(guò)程中損失指標(biāo),accuracy是訓(xùn)練過(guò)程的準(zhǔn)確性指標(biāo),而val_loss是校驗(yàn)過(guò)程的損失指標(biāo),val_accuracy是校驗(yàn)過(guò)程的準(zhǔn)確性指標(biāo)。

dict_keys(['loss', 'accuracy', 'val_loss', 'val_accuracy'])

我們使用Matplotlib畫出訓(xùn)練損失和校驗(yàn)損失的情況

loss_values = history_dict['loss']
val_loss_values = history_dict['val_loss']
epochs = range(1, len(loss_values) + 1)
plt.plot(epochs, loss_values, 'bo', label='Training loss')
plt.plot(epochs, val_loss_values, 'b', label='Validation loss')
plt.title('Training and validation loss')
plt.xlabel('Epochs')
plt.ylabel('Loss')
plt.legend()
plt.show()

從圖中可以看到整個(gè)訓(xùn)練過(guò)程,損失函數(shù)值一直在不斷的變小,但是校驗(yàn)過(guò)程的損失函數(shù)值卻先變小后變大,在2.5-5之間的某個(gè)點(diǎn)達(dá)到最小值。

我們使用Matplotlib畫出訓(xùn)練精度和校驗(yàn)精度的情況

plt.clf()
acc = history_dict['accuracy']
val_acc = history_dict['val_accuracy']
plt.plot(epochs, acc, 'bo', label='Training accuracy')
plt.plot(epochs, val_acc, 'b', label='Validation accuracy')
plt.title('Training and validation accuracy')
plt.xlabel('Epochs')
plt.ylabel('Accuracy')
plt.legend()
plt.show()

從圖中可以看到整個(gè)訓(xùn)練過(guò)程,準(zhǔn)確度值一直在不斷的升高,但是校驗(yàn)過(guò)程的精度數(shù)值卻在不斷的進(jìn)行波動(dòng),在2.5-5之間的某個(gè)點(diǎn)達(dá)到最大值。

通過(guò)對(duì)訓(xùn)練和校驗(yàn)指標(biāo)的分析,可以看到訓(xùn)練的損失每輪都在降低,訓(xùn)練的精度每輪都在提升。但是校驗(yàn)損失和校驗(yàn)精度基本上在第4輪左右達(dá)到最佳值。為了防止這種過(guò)擬合的情況,我們可以在第四輪完成之后直接停止訓(xùn)練。

history = model.fit(partial_x_train, partial_y_train, epochs= 4, batch_size=512, validation_data=(x_val, y_val))
results = model.evaluate(x_test, y_test)
print(results)

重新執(zhí)行可以看到模型的精度可以達(dá)到87%

782/782 [==============================] - 1s 876us/step - loss: 0.3137 - accuracy: 0.8729
[0.3137112557888031, 0.8728799819946289]

五、使用測(cè)試數(shù)據(jù)預(yù)測(cè)結(jié)果

使用訓(xùn)練的模型對(duì)test數(shù)據(jù)集進(jìn)行預(yù)測(cè)

result = model.predict(x_test)
print(result)

[[0.31683978]

 [0.9997941 ]

 [0.9842608 ]

 ...

 [0.18170357]

 [0.23360077]

六、小結(jié)

  • 需要對(duì)原始數(shù)據(jù)進(jìn)行預(yù)處理并轉(zhuǎn)化為符合要求的張量。
  • 對(duì)于二分類問(wèn)題,最后一層使用sigmoid作為激活函數(shù),并輸出0-1的標(biāo)量來(lái)表示結(jié)果出現(xiàn)的概率。
  • 對(duì)于二分類問(wèn)題的sigmoid標(biāo)量輸出,應(yīng)該使用binary_crossentropy損失函數(shù)。
  • 隨著訓(xùn)練過(guò)程的進(jìn)行,很容易出現(xiàn)過(guò)擬合現(xiàn)象,我們需要時(shí)刻監(jiān)控模型在非訓(xùn)練數(shù)據(jù)集的表現(xiàn)。

到此這篇關(guān)于機(jī)器深度學(xué)習(xí)之電影的二分類情感問(wèn)題的文章就介紹到這了,更多相關(guān)深度學(xué)習(xí)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:
  • 深度學(xué)習(xí)詳解之初試機(jī)器學(xué)習(xí)
  • 深度學(xué)習(xí)小工程練習(xí)之tensorflow垃圾分類詳解
  • 深度學(xué)習(xí)tensorflow基礎(chǔ)mnist
  • 吳恩達(dá)機(jī)器學(xué)習(xí)練習(xí):神經(jīng)網(wǎng)絡(luò)(反向傳播)

標(biāo)簽:崇左 長(zhǎng)沙 山西 山西 海南 安康 喀什 濟(jì)南

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《機(jī)器深度學(xué)習(xí)二分類電影的情感問(wèn)題》,本文關(guān)鍵詞  ;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 收縮
    • 微信客服
    • 微信二維碼
    • 電話咨詢

    • 400-1100-266
    牙克石市| 磐石市| 昔阳县| 章丘市| 灵山县| 托克逊县| 旬阳县| 定安县| 靖安县| 安国市| 原阳县| 乐东| 屏南县| 新疆| 慈利县| 平湖市| 武夷山市| 合川市| 论坛| 桓仁| 满城县| 鄂托克前旗| 和平县| 蓝山县| 邹平县| 齐河县| 临朐县| 四会市| 新郑市| 泰顺县| 高清| 纳雍县| 枣庄市| 荔波县| 新郑市| 南投市| 叙永县| 渭源县| 龙南县| 东至县| 内乡县|