[學習筆記]使用神經網絡分析電影評論的正能量與負能量

背景介紹

這次主要將神經網絡直接運用到具體的分析項目中僵缺,使用keras來判斷用戶在網絡上編寫的影評中包含的是正能量還是負能量堰氓。

數(shù)據(jù)集介紹

本次主要使用imdb(Internet Movie Database)數(shù)據(jù)集,數(shù)據(jù)集在這->imdb
這數(shù)據(jù)集包含了50000條偏向明顯的評論阳谍,其中25000條作為訓練集蛀柴,25000作為測試集。label為pos(positive)和neg(negative)矫夯。
我們來看看這些數(shù)據(jù)

from keras.datasets import imdb
(train_data, train_labels), (test_data, test_labels) = imdb.load_data(num_words=100)
print(train_data[0])
print(train_labels[0])

這一份數(shù)據(jù)采用了一種神奇的結構鸽疾,即所謂單詞向量,這份數(shù)據(jù)對應一份單詞頻率表训貌,這份表的數(shù)據(jù)結構如圖所示

頻率單詞表

其中的數(shù)字既代表單詞出現(xiàn)的頻率制肮,第一個數(shù)字1,即代表頻率出現(xiàn)排名第一的單詞递沪;對應表下載;

其中做的標記中豺鼻,分為1,0兩種款慨,1代表正能量儒飒,0代表負能量

讓我們來看看這段影評長什么樣。


word_index = imdb.get_word_index()
#我們要把表中的對應關系反轉一下檩奠,變成key是頻率桩了,value是單詞
reverse_word_index = dict([(value, key) for (key, value) in word_index.items()])
decoded_review = ' '.join([reverse_word_index.get(i-3, '?') for i in train_data[0]])
print(decoded_review)

image.png

在train_data所包含的數(shù)值中,數(shù)值1埠戳,2井誉,3對應的不是單詞,而用來表示特殊含義整胃,1表示“填充”颗圣,2表示”文本起始“,
3表示”未知“爪模,因此當我們從trai
n_data中讀到的數(shù)值是1欠啤,2,3時屋灌,我們要忽略它洁段,從4開始才對應單詞,如果數(shù)值是4共郭,
那么它表示頻率出現(xiàn)最高的單詞is


import numpy as np

def vectorize_sequences(sequences, dimension=10000):
 
    results = np.zeros((len(sequences),dimension))
    for i, sequence in enumerate(sequences):
        results[i, sequence] = 1.
    return results

x_train = vectorize_sequences(train_data)
x_test = vectorize_sequences(test_data)

以上函數(shù)為的是把每個評論轉換成一個矩陣祠丝,一條評論對應一個矩陣,矩陣的行對應單詞數(shù)量除嘹,矩陣的列長度是一萬写半,代表一萬個單詞數(shù)量,這一萬個數(shù)一開始全為0尉咕,將出現(xiàn)的詞置為1.從頭到底進行排序叠蝇,接下來為了方便運算,我們將其轉換成浮點數(shù)年缎。

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


接下來我們開始構建神經網絡悔捶,我們構建一個四層的神經網絡铃慷。第一層輸入有10000個結點。第二層蜕该,第三層有16個節(jié)點犁柜,第四層有一個節(jié)點,輸出一個概率值堂淡。


from keras import models
from keras import layers

model = models.Sequential()
#構建第一層和第二層網絡馋缅,第一層有10000個節(jié)點,第二層有16個節(jié)點
#Dense的意思是绢淀,第一層每個節(jié)點都與第二層的所有節(jié)點相連接
#relu 對應的函數(shù)是relu(x) = max(0, x)萤悴,相當于神經元函數(shù)
model.add(layers.Dense(32, activation='relu', input_shape=(10000,)))
#第三層有16個神經元,第二層每個節(jié)點與第三層每個節(jié)點都相互連接
model.add(layers.Dense(32, activation='relu'))
#第四層只有一個節(jié)點皆的,輸出一個0-1之間的概率值
model.add(layers.Dense(1, activation='sigmoid'))

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

optimizer參數(shù)指定的是如何優(yōu)化鏈路權重稚疹,事實上各種優(yōu)化方法跟我們前面講的梯度下降法差不多,只不過在存在一些微小的變化祭务,特別是在更新鏈路權值時内狗,會做一些改動,但算法主體還是梯度下降法义锥。當我們的網絡用來將數(shù)據(jù)區(qū)分成兩種類型時柳沙,損失函數(shù)最好使用,輸出是兩種時,binary_crossentroy,它的表達式如下:
Hy′(y):=?∑i(y′ilog(y[i])+(1?y′[i])log(1?y[i]))
其中y[i]對應的是訓練數(shù)據(jù)提供的結果拌倍,y'[i]是我們網絡計算所得的結果赂鲤。metrics用于記錄網絡的改進效率,我們暫時用不上柱恤。接著我們把訓練數(shù)據(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))

訓練數(shù)據(jù)總共有60000條梗顺,我們把最前一萬條作為校驗數(shù)據(jù)泡孩,用來檢測網絡是否優(yōu)化到合適的程度,然后我們把數(shù)據(jù)從第一萬條開始作為訓練網絡來用寺谤,把數(shù)據(jù)分割好后仑鸥,調用fit函數(shù)就可以開始訓練過程,上面代碼運行后結果如下:


import matplotlib.pyplot as plt

acc = history.history['acc']
val_acc = history.history['val_acc']
loss = history.history['loss']
val_loss = history.history['val_loss']

epochs = range(1, len(acc) + 1)
#繪制訓練數(shù)據(jù)識別準確度曲線
plt.plot(epochs, loss, 'bo', label='Trainning loss')
#繪制校驗數(shù)據(jù)識別的準確度曲線
plt.plot(epochs, val_loss, 'b', label='Validation loss')
plt.title('Trainning and validation loss')
plt.xlabel('Epochs')
plt.ylabel('Loss')
plt.legend()
plt.show()
image.png

我們看上面圖示能發(fā)現(xiàn)一個問題变屁,隨著迭代次數(shù)的增加眼俊,網絡對訓練數(shù)據(jù)識別的準確度越來越高,也就是loss越來越低粟关,然后校驗數(shù)據(jù)的識別準確的卻越來越低疮胖,這種現(xiàn)象叫“過度擬合”,這意味著訓練的次數(shù)并不是越多越好,而是會“過猶不及”澎灸,有時候訓練迭代次數(shù)多了反而導致效果下降谷市。從上圖我們看到,大概在第4個epoch的時候击孩,校驗數(shù)據(jù)的識別錯誤率開始上升,因此我們將前面的代碼修改鹏漆,把參數(shù)epochs修改成4才能達到最佳效果巩梢。 訓練好網絡后,我們就可以用它來識別新數(shù)據(jù)艺玲,我們把測試數(shù)據(jù)放入網絡進行識別括蝠,代碼如下:

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

model.fit(x_train, y_train, epochs=2, batch_size=512)
results = model.evaluate(x_test, y_test)

![image.png](https://upload-images.jianshu.io/upload_images/16487280-4a050e3a67ac79a7.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市饭聚,隨后出現(xiàn)的幾起案子忌警,更是在濱河造成了極大的恐慌,老刑警劉巖秒梳,帶你破解...
    沈念sama閱讀 219,539評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件法绵,死亡現(xiàn)場離奇詭異,居然都是意外死亡酪碘,警方通過查閱死者的電腦和手機朋譬,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,594評論 3 396
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來兴垦,“玉大人徙赢,你說我怎么就攤上這事√皆剑” “怎么了狡赐?”我有些...
    開封第一講書人閱讀 165,871評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長钦幔。 經常有香客問我枕屉,道長,這世上最難降的妖魔是什么鲤氢? 我笑而不...
    開封第一講書人閱讀 58,963評論 1 295
  • 正文 為了忘掉前任搀庶,我火速辦了婚禮,結果婚禮上铜异,老公的妹妹穿的比我還像新娘哥倔。我一直安慰自己,他們只是感情好揍庄,可當我...
    茶點故事閱讀 67,984評論 6 393
  • 文/花漫 我一把揭開白布咆蒿。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪沃测。 梳的紋絲不亂的頭發(fā)上缭黔,一...
    開封第一講書人閱讀 51,763評論 1 307
  • 那天,我揣著相機與錄音蒂破,去河邊找鬼馏谨。 笑死,一個胖子當著我的面吹牛附迷,可吹牛的內容都是我干的惧互。 我是一名探鬼主播,決...
    沈念sama閱讀 40,468評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼喇伯,長吁一口氣:“原來是場噩夢啊……” “哼喊儡!你這毒婦竟也來了?” 一聲冷哼從身側響起稻据,我...
    開封第一講書人閱讀 39,357評論 0 276
  • 序言:老撾萬榮一對情侶失蹤艾猜,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后捻悯,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體匆赃,經...
    沈念sama閱讀 45,850評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,002評論 3 338
  • 正文 我和宋清朗相戀三年今缚,在試婚紗的時候發(fā)現(xiàn)自己被綠了炸庞。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,144評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡荚斯,死狀恐怖埠居,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情事期,我是刑警寧澤滥壕,帶...
    沈念sama閱讀 35,823評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站兽泣,受9級特大地震影響绎橘,放射性物質發(fā)生泄漏。R本人自食惡果不足惜唠倦,卻給世界環(huán)境...
    茶點故事閱讀 41,483評論 3 331
  • 文/蒙蒙 一称鳞、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧稠鼻,春花似錦冈止、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,026評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽闺属。三九已至,卻和暖如春周霉,著一層夾襖步出監(jiān)牢的瞬間掂器,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,150評論 1 272
  • 我被黑心中介騙來泰國打工俱箱, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留国瓮,地道東北人。 一個月前我還...
    沈念sama閱讀 48,415評論 3 373
  • 正文 我出身青樓狞谱,卻偏偏與公主長得像乃摹,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子芋簿,可洞房花燭夜當晚...
    茶點故事閱讀 45,092評論 2 355