摘要:摘要機(jī)器學(xué)習(xí)實(shí)戰(zhàn)篇用簡單的代碼打造屬于自己的神經(jīng)網(wǎng)絡(luò)模型是目前最受歡迎的深度學(xué)習(xí)庫之一,對人工智能的商業(yè)化做出了巨大貢獻(xiàn)。你學(xué)會了如何建立一個(gè)簡單的六層神經(jīng)網(wǎng)絡(luò),可以預(yù)測電影評論的情感,其準(zhǔn)確率達(dá)到。
摘要: 機(jī)器學(xué)習(xí)實(shí)戰(zhàn)篇:用簡單的代碼打造屬于自己的神經(jīng)網(wǎng)絡(luò)模型~
Keras是目前最受歡迎的深度學(xué)習(xí)庫之一,對人工智能的商業(yè)化做出了巨大貢獻(xiàn)。它使用起來非常簡單,它使你能夠通過幾行代碼就可以構(gòu)建強(qiáng)大的神經(jīng)網(wǎng)絡(luò)。在這篇文章中,你將了解如何通過Keras構(gòu)建神經(jīng)網(wǎng)絡(luò),并且將用戶評論分為兩類:積極或消極來預(yù)測用戶評論的情感。這就是社交媒體所謂的情感分析,我們會用著名的imdb評論數(shù)據(jù)集來做。我們構(gòu)建的模型只需進(jìn)行一些更改,就可以應(yīng)用于其他機(jī)器學(xué)習(xí)問題。
請注意,我們不會深入Keras或深度學(xué)習(xí)的細(xì)節(jié),這對于想要進(jìn)入人工智能領(lǐng)域卻沒有深厚的數(shù)學(xué)功底的程序員來說是件好事。
目錄:
1.Keras是什么?
2.什么是情緒分析?
3.imdb數(shù)據(jù)集。
4.導(dǎo)入依賴關(guān)系并獲取數(shù)據(jù)。
5.探索數(shù)據(jù)。
6.數(shù)據(jù)準(zhǔn)備。
7.建立和訓(xùn)練模型。
Keras是什么?Keras是一個(gè)開源的python庫,可以讓你輕松構(gòu)建神經(jīng)網(wǎng)絡(luò)。該庫能夠在TensorFlow、Microsoft Cognitive Toolkit、Theano和MXNet上運(yùn)行。Tensorflow和Theano是Python中用來構(gòu)建深度學(xué)習(xí)算法的最常用的平臺,但它們可能相當(dāng)復(fù)雜且難以使用。相比之下,Keras提供了一種簡單方便的方法來構(gòu)建深度學(xué)習(xí)模型。它的創(chuàng)造者Fran?oisChollet開發(fā)了它,使人們能夠盡可能快速和簡單地構(gòu)建神經(jīng)網(wǎng)絡(luò)。他專注于可擴(kuò)展性、模塊化、極簡主義和python的支持。Keras可以與GPU和CPU一起使用,并支持Python 2和Python 3。Google Keras為深度學(xué)習(xí)和人工智能的商業(yè)化做出了巨大貢獻(xiàn),越來越多的人正在使用它們。
什么是情緒分析?借助情感分析,我們想要確定例如演講者或作家對于文檔或事件的態(tài)度(例如情感)。因此,這是一個(gè)自然語言處理問題,需要理解文本,以預(yù)測潛在的意圖。情緒主要分為積極的,消極的和中立的類別。通過使用情緒分析,我們希望根據(jù)他撰寫的評論,預(yù)測客戶對產(chǎn)品的意見和態(tài)度。因此,情緒分析廣泛應(yīng)用于諸如評論,調(diào)查,文檔等等。
imdb數(shù)據(jù)集imdb情緒分類數(shù)據(jù)集由來自imdb用戶的50,000個(gè)電影評論組成,標(biāo)記為positive(1)或negative(0)。評論是預(yù)處理的,每一個(gè)都被編碼為一個(gè)整數(shù)形式的單詞索引序列。評論中的單詞按照它們在數(shù)據(jù)集中的總體頻率進(jìn)行索引。例如,整數(shù)“2”編碼數(shù)據(jù)中第二個(gè)最頻繁的詞。50,000份評論分為25,000份訓(xùn)練和25,000份測試。該數(shù)據(jù)集由斯坦福大學(xué)的研究人員創(chuàng)建,并在2011年發(fā)表在一篇論文中,他們的準(zhǔn)確性達(dá)到了88.89%。它也被用在2011年Kaggle競賽的“Bag of Words Meets Bags of Popcorn”方案中,并且取得了非常好的效果。
導(dǎo)入依賴關(guān)系并獲取數(shù)據(jù)我們首先導(dǎo)入所需的依賴關(guān)系來預(yù)處理數(shù)據(jù)并構(gòu)建我們的模型。
%matplotlib inline import matplotlib import matplotlib.pyplot as plt import numpy as np from keras.utils import to_categorical from keras import keras import models from keras import layers
我們繼續(xù)下載imdb數(shù)據(jù)集,幸好它已經(jīng)被內(nèi)置到Keras中。這樣我們就不用將他進(jìn)行5/5測試拆分,但我們也會在下載后立即將數(shù)據(jù)合并到數(shù)據(jù)和目標(biāo)中,以便稍后進(jìn)行80/20的拆分。
from keras.datasets import imdb (training_data, training_targets), (testing_data, testing_targets) = imdb.load_data(num_words=10000) data = np.concatenate((training_data, testing_data), axis=0) targets = np.concatenate((training_targets, testing_targets), axis=0)探索數(shù)據(jù)
現(xiàn)在我們可以開始探索數(shù)據(jù)集了:
print("Categories:", np.unique(targets)) print("Number of unique words:", len(np.unique(np.hstack(data)))) Categories: [0 1] Number of unique words: 9998 length = [len(i) for i in data] print("Average Review length:", np.mean(length)) print("Standard Deviation:", round(np.std(length))) Average Review length: 234.75892 Standard Deviation: 173.0
你可以在上面的輸出中看到數(shù)據(jù)集被標(biāo)記為兩個(gè)類別,分別代表0或1,表示評論的情感。整個(gè)數(shù)據(jù)集包含9998個(gè)獨(dú)特單詞,平均評論長度為234個(gè)單詞,標(biāo)準(zhǔn)差為173個(gè)單詞。
現(xiàn)在我們來看一個(gè)訓(xùn)練樣例:
print("Label:", targets[0]) Label: 1 print(data[0]) [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]
在上方,你會看到標(biāo)記為肯定(1)的數(shù)據(jù)集評論。下面的代碼檢索字典映射詞索引回到原來的單詞,以便我們可以閱讀它們,它用“?!碧鎿Q每個(gè)未知的單詞。它可以通過使用get_word_index()函數(shù)來完成這一操作。
index = imdb.get_word_index() reverse_index = dict([(value, key) for (key, value) in index.items()]) decoded = " ".join( [reverse_index.get(i - 3, "#") for i in data[0]] ) print(decoded) # 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 # father came from the same scottish island as myself so i loved the fact there was a real connection with this film the witty remarks throughout the film were great it was just brilliant so much that i bought the film as soon as it was released for # and would recommend it to everyone to watch and the fly fishing was amazing really cried at the end it was so sad and you know what they say if you cry at a film it must have been good and this definitely was also # to the two little boy"s that played the # of norman and paul they were just brilliant children are often left out of the # list i think because the stars that play them all grown up are such a big profile for the whole film but these children are amazing and should be praised for what they have done don"t you think the whole story was so lovely because it was true and was someone"s life after all that was shared with us all數(shù)據(jù)準(zhǔn)備
現(xiàn)在是準(zhǔn)備我們的數(shù)據(jù)的時(shí)候了。我們將矢量化每個(gè)評論并填充零,以便它包含正好一萬個(gè)數(shù)字。這意味著我們用零填充每個(gè)比10,000短的評論。我們這樣做是因?yàn)榇蠖鄶?shù)的評論長度差不多都在這個(gè)長度,并且我們的神經(jīng)網(wǎng)絡(luò)的每次輸入都需要具有相同的大小。
def vectorize(sequences, dimension = 10000): results = np.zeros((len(sequences), dimension)) for i, sequence in enumerate(sequences): results[i, sequence] = 1 return results data = vectorize(data) targets = np.array(targets).astype("float32")
現(xiàn)在我們將數(shù)據(jù)分成訓(xùn)練和測試集。訓(xùn)練集將包含40,000條評論,測試設(shè)置為10,000條。
test_x = data[:10000] test_y = targets[:10000] train_x = data[10000:] train_y = targets[10000:]建立和訓(xùn)練模型
我們現(xiàn)在可以建立我們簡單的神經(jīng)網(wǎng)絡(luò)了,我們首先定義我們想要構(gòu)建的模型的類型。Keras中有兩種類型的模型可供使用:功能性API使用的Sequential模型和Model類。
然后我們只需添加輸入層,隱藏層和輸出層。在他們之間,我們使用dropout來防止過度擬合。請注意,你應(yīng)始終使用20%到50%之間的dropout。在每一層,我們使用“密集層”,這意味著單元完全連接。在隱藏層中,我們使用relu函數(shù),因?yàn)樗偸且粋€(gè)好的開始,并且在大多數(shù)情況下會產(chǎn)生令人滿意的結(jié)果,當(dāng)然你也可以隨意嘗試其他激活功能。在輸出層,我們使用sigmoid函數(shù),它將0和1之間的值進(jìn)行映射。請注意,我們在輸入層將輸入大小設(shè)置為10,000,因?yàn)槲覀兊脑u論長度為10,000個(gè)整數(shù)。輸入層需要10,000個(gè)輸入,并以50的shape輸出。
最后,我們讓Keras打印我們剛剛構(gòu)建的模型的摘要。
# Input - Layer model.add(layers.Dense(50, activation = "relu", input_shape=(10000, ))) # Hidden - Layers model.add(layers.Dropout(0.3, noise_shape=None, seed=None)) model.add(layers.Dense(50, activation = "relu") model.add(layers.Dropout(0.2, noise_shape=None, seed=None)) model.add(layers.Dense(50, activation = "relu")) # Output- Layer model.add(layers.Dense(1, activation = "sigmoid"))model.summary() model.summary() _________________________________________________________________ Layer (type) Output Shape Param # ================================================================= dense_1 (Dense) (None, 50) 500050 _________________________________________________________________ dropout_1 (Dropout) (None, 50) 0 _________________________________________________________________ dense_2 (Dense) (None, 50) 2550 _________________________________________________________________ dropout_2 (Dropout) (None, 50) 0 _________________________________________________________________ dense_3 (Dense) (None, 50) 2550 _________________________________________________________________ dense_4 (Dense) (None, 1) 51 ================================================================= Total params: 505,201 Trainable params: 505,201 Non-trainable params: 0 _________________________________________________________________
現(xiàn)在我們需要優(yōu)化我們的模型,這只不過是配置訓(xùn)練模型,我們使用“adam”優(yōu)化器。優(yōu)化器是在訓(xùn)練期間改變權(quán)重和偏差的算法。我們也選擇二進(jìn)制--交叉熵作為損失(因?yàn)槲覀兲幚矶M(jìn)制分類)和準(zhǔn)確性作為我們的評估指標(biāo)。
model.compile( optimizer = "adam", loss = "binary_crossentropy", metrics = ["accuracy"] )
我們現(xiàn)在開始訓(xùn)練我們的模型,我們用batch_size為500來完成這件事,并且只對兩個(gè)epochs,因?yàn)槲艺J(rèn)識到如果我們訓(xùn)練它的時(shí)間越長,模型就會過度擬合。批量大小定義了將通過網(wǎng)絡(luò)傳播的樣本數(shù)量,一個(gè)epoch是對整個(gè)訓(xùn)練數(shù)據(jù)的迭代??偟膩碚f,批量大小可以加快訓(xùn)練速度,但并不總是快速收斂。較小的批量大小是訓(xùn)練速度較慢,但它可以更快地收斂。這絕對取決于問題性質(zhì),所以你需要嘗試一些不同的值。如果你第一次遇到問題,我建議你首先使用批量大小為32。
results = model.fit( train_x, train_y, epochs= 2, batch_size = 500, validation_data = (test_x, test_y) ) Train on 40000 samples, validate on 10000 samples Epoch 1/2 40000/40000 [==============================] - 5s 129us/step - loss: 0.4051 - acc: 0.8212 - val_loss: 0.2635 - val_acc: 0.8945 Epoch 2/2 40000/40000 [==============================] - 4s 90us/step - loss: 0.2122 - acc: 0.9190 - val_loss: 0.2598 - val_acc: 0.8950
現(xiàn)在是評估我們的模型的時(shí)候了:
print(np.mean(results.history["val_acc"])) 0.894750000536
真棒!有了這個(gè)簡單的模型,我們已經(jīng)超過了我在開始時(shí)提到的2011年論文的準(zhǔn)確性。
你可以在下面看到整個(gè)模型的代碼:
import numpy as np from keras.utils import to_categorical from keras import models from keras import layers from keras.datasets import imdb (training_data, training_targets), (testing_data, testing_targets) = imdb.load_data(num_words=10000) data = np.concatenate((training_data, testing_data), axis=0) targets = np.concatenate((training_targets, testing_targets), axis=0) def vectorize(sequences, dimension = 10000): results = np.zeros((len(sequences), dimension)) for i, sequence in enumerate(sequences): results[i, sequence] = 1 return results test_x = data[:10000] test_y = targets[:10000] train_x = data[10000:] train_y = targets[10000:] model = models.Sequential() # Input - Layer model.add(layers.Dense(50, activation = "relu", input_shape=(10000, ))) # Hidden - Layers model.add(layers.Dropout(0.3, noise_shape=None, seed=None)) model.add(layers.Dense(50, activation = "relu")) model.add(layers.Dropout(0.2, noise_shape=None, seed=None)) model.add(layers.Dense(50, activation = "relu")) # Output- Layer model.add(layers.Dense(1, activation = "sigmoid")) model.summary() # compiling the model model.compile( optimizer = "adam", loss = "binary_crossentropy", metrics = ["accuracy"] ) results = model.fit( train_x, train_y, epochs= 2, batch_size = 500, validation_data = (test_x, test_y) ) print("Test-Accuracy:", np.mean(results.history["val_acc"]))
總結(jié)
在本文中,你了解到了什么是情感分析的內(nèi)容,以及為什么Keras是最常用的深度學(xué)習(xí)庫之一。最重要的是,你了解到Keras對深度學(xué)習(xí)和人工智能的商業(yè)化做出了巨大貢獻(xiàn)。你學(xué)會了如何建立一個(gè)簡單的六層神經(jīng)網(wǎng)絡(luò),可以預(yù)測電影評論的情感,其準(zhǔn)確率達(dá)到89%?,F(xiàn)在,你可以使用此模型對其他文本來源進(jìn)行情感分析,但需要將其全部更改為10,000的長度,或者更改輸入圖層的輸入大小。你也可以將此模型應(yīng)用于其他相關(guān)機(jī)器學(xué)習(xí)問題,只需進(jìn)行一些更改。
文章標(biāo)題《how-to-build-a-neural-network-with-keras》
作者:Niklas Donges
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/19725.html
摘要:初探最近在接觸些深度學(xué)習(xí)的東西,也對一些深度學(xué)習(xí)的框架進(jìn)行了大致的了解。兩次參數(shù)的更新也有可能互相抵消掉,造成目標(biāo)函數(shù)震蕩的比較劇烈。損失函數(shù)該參數(shù)為模型試圖最小化的目標(biāo)函數(shù),它可為預(yù)定義的損失函數(shù)名,如,也可以為一個(gè)損失函數(shù)。 Keras 初探 最近在接觸些深度學(xué)習(xí)的東西,也對一些深度學(xué)習(xí)的框架進(jìn)行了大致的了解。Python的科學(xué)計(jì)算包主要是Theano和TensorFlow,特點(diǎn)就...
閱讀 1947·2021-11-24 09:39
閱讀 3320·2021-09-22 14:58
閱讀 1179·2019-08-30 15:54
閱讀 3331·2019-08-29 11:33
閱讀 1800·2019-08-26 13:54
閱讀 1609·2019-08-26 13:35
閱讀 2480·2019-08-23 18:14
閱讀 776·2019-08-23 17:04