基於Keras的imdb資料集電影評論情感二分類

2022-03-19 02:29:03 字數 4681 閱讀 5525

載入資料集

from keras.datasets import imdb

(train_data,train_labels),(test_data,test_labels) = imdb.load_data(num_words=10000)

>>> train_data[0]

[1, 14, 22, 16, ... 178, 32]

>>> train_labels[0]

1

不能直接將list型別的資料送到神經網路中訓練,必須將list型別轉換為tensor張量型別。有兩種轉換方式:

import numpy as np

def vectorize_sequences(sequences, dimension=10000):

for i, sequence in enumerate(sequences):

results[i, sequence] = 1 # one-hot

return results

x_train = vectorize_sequences(train_data)

x_test = vectorize_sequences(test_data)

y_train = np.asarray(train_labels).astype('float32') # 向量化標籤資料

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

現在輸入資料是向量型別,對應標籤資料為標量(0, 1):最容易處理的資料格式。處理這類問題最常見的網路模型是dense網路層的線性堆疊,dense(16, activation='relu')。

dense網路層接收的引數16表示網路層神經元數目。乙個神經元單元表示網路層表示空間的乙個維度。16個神經元表示網路層權重係數形狀為(input_dimensions, 16);dot點積運算將會把輸出張量轉換為16維度的表示張量。越多的神經元數目表示神經網路可以學習到更加複雜的特徵表示,相應的計算效率降低,也可能學到不必要的特徵。

dense網路層堆疊時回答兩個關鍵的問題:

啟用函式能給網路模型增加非線性表示。

使用的網路模型如下:

from keras import models

from keras import layers

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'))

最後,選擇損失函式和優化演算法。因為是二分類問題,網路模型的輸出是乙個概率,最好使用binary_crossentropy損失函式,也可以使用mean_squared_error均方誤差損失函式。但是交叉熵是處理模型輸出為概率時最佳選擇。

配置使用rmsprop優化演算法以及binary_crossentropy損失函式,選擇監測的指標。

model.compile(optimizer='rmsprop',loss='binary_crossentropy',metrics=['accuracy'])
這裡引數使用字串傳遞,因為在keras中對應字串已經定義好了。同時,可以傳遞函式型別給相應的引數。如:

from keras import losses

from keras import metrics

model.compile(optimizer=optimizers.rmsprop(lr=0.001),

loss=losses.binary_crossentropy,

metrics=[metrics.binary_accuracy])

為了在訓練過程中在沒有見過資料上監測準確率變化,需要分出乙個驗證集。從訓練集中分出10000條做驗證集。

x_val = x_train[:10000]

partial_x_train = x_train[10000:]

y_val = y_train[:10000]

partial_y_train = y_train[10000:]

在512小批量,迭代20次進行模型訓練,同時在驗證集上監測準確率變化。

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

history = model.fit(partial_x_train,partial_y_train,epochs=20,batch_size=512,validation_data=(x_val, y_val))

通過呼叫model.fit()方法返回乙個history物件,history物件有history屬性---乙個包含在訓練過程中記錄的資料的字典。

>>> history_dict = history.history

>>> history_dict.keys()

[u'acc', u'loss', u'val_acc', u'val_loss']

字典包括4個鍵--在訓練、驗證過程中被監測的指標。

在圖中畫出訓練損失和驗證損失的變化圖:

import matplotlib.pyplot as plt

history_dict = history.history

loss_values = history_dict['loss']

val_loss_values = history_dict['val_loss']

epochs = range(1, len(acc) + 1)

plt.plot(epochs, loss_values, 'bo', label='training loss')#bo:blue dot藍點

plt.plot(epochs, val_loss_values, 'b', label='validation loss')#b: blue藍色

plt.title('training and validation loss')

plt.xlabel('epochs')

plt.ylabel('loss')

plt.legend()

plt.show()

訓練集和驗證集上準確率變化:

plt.clf()

acc_values = history_dict['acc']

val_acc_values = history_dict['val_acc']

plt.plot(epochs, acc, 'bo', label='training acc')

plt.plot(epochs, val_acc, 'b', label='validation acc')

plt.title('training and validation accuracy')

plt.xlabel('epochs')

plt.ylabel('loss')

plt.legend()

plt.show()

可以從上面的兩張圖中看到,訓練損失逐漸降低,訓練準確度逐漸提高--這正是使用梯度下降演算法,我們所期望看到的。但是,驗證損失和驗證集上的準確率卻在第4次迭代左右開始變差----模型在訓練集上表現良好,在沒有見過的資料上表現很差(泛化能力差)。用術語講,模型發生了過擬合。在這裡可以,使模型在第4次epoch時,訓練結束,這樣來盡可能避免過擬合現象的發生。

重新訓練

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'))

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

model.fit(x_train,y_train,epochs=4,batch_size=512)

results = model.evaluate(x_test, y_test)

#[0.2929924130630493, 0.88327999999999995] 模型準確率為88%

>>> model.predict(x_test)

array([[ 0.98006207]

[ 0.99758697]

[ 0.99975556]

...,

[ 0.82167041]

[ 0.02885115]

[ 0.65371346]], dtype=float32)

基於Keras的imdb資料集的情感二分類

簡單的 後注上解析 from keras.preprocessing import sequence from keras.models import sequential from keras.layers import dense,embedding from keras.layers impo...

影評情感分類(基於IMDB資料集)

回顧以前的筆記 在keras中,內建了imdb電影評分資料集,來進行評價 安裝keras conda install kerasconda就幫依賴全部搞定,記得加源 匯入imdb from keras.datasets import imdb資料集簡要說明 在資料中不是單詞,而是單詞的索引 一共就5...

IMDB資料集的解釋

目的 了解keras上的imdb資料集是怎麼一回事。前文主要是我的理解,官方解釋在後文,覺得官方解析得不夠到位。比如 embedding max features 20000 maxlen 100 embedding size 128 x train,y train x test,y test im...