<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                # 如何開發用于情感分析的 N-gram 多通道卷積神經網絡 > 原文: [https://machinelearningmastery.com/develop-n-gram-multichannel-convolutional-neural-network-sentiment-analysis/](https://machinelearningmastery.com/develop-n-gram-multichannel-convolutional-neural-network-sentiment-analysis/) 用于文本分類和情感分析的標準深度學習模型使用單詞嵌入層和一維卷積神經網絡。 可以通過使用多個并行卷積神經網絡來擴展模型,該網絡使用不同的內核大小讀取源文檔。實際上,這為文本創建了一個多通道卷積神經網絡,用于讀取具有不同 n-gram 大小(單詞組)的文本。 在本教程中,您將了解如何開發一個多通道卷積神經網絡,用于文本電影評論數據的情感預測。 完成本教程后,您將了解: * 如何準備電影評論文本數據進行建模。 * 如何為 Keras 中的文本開發多通道卷積神經網絡。 * 如何評估看不見的電影評論數據的擬合模型。 讓我們開始吧。 * **2018 年 2 月更新**:小代碼更改以反映 Keras 2.1.3 API 中的更改。 ![How to Develop an N-gram Multichannel Convolutional Neural Network for Sentiment Analysis](img/d19e490e849082fca1f80af6ce6a80e3.jpg) 如何開發用于情感分析的 N-gram 多通道卷積神經網絡 [Ed Dunens](https://www.flickr.com/photos/blachswan/32732882104/) 的照片,保留一些權利。 ## 教程概述 本教程分為 4 個部分;他們是: 1. 電影評論數據集 2. 數據準備 3. 開發多渠道模型 4. 評估模型 ### Python 環境 本教程假定您已安裝 Python 3 SciPy 環境。 您必須安裝帶有 TensorFlow 或 Theano 后端的 Keras(2.0 或更高版本)。 本教程還假設您安裝了 scikit-learn,Pandas,NumPy 和 Matplotlib。 如果您需要有關環境的幫助,請參閱此帖子: * [如何使用 Anaconda 設置用于機器學習和深度學習的 Python 環境](https://machinelearningmastery.com/setup-python-environment-machine-learning-deep-learning-anaconda/) ## 電影評論數據集 電影評論數據是 Bo Pang 和 Lillian Lee 在 21 世紀初從 imdb.com 網站上檢索到的電影評論的集合。收集的評論作為他們自然語言處理研究的一部分。 評論最初于 2002 年發布,但更新和清理版本于 2004 年發布,稱為“v2.0”。 該數據集包含 1,000 個正面和 1,000 個負面電影評論,這些評論來自 imdb.com 上托管的 rec.arts.movi??es.reviews 新聞組的存檔。作者將此數據集稱為“極性數據集”。 > 我們的數據包含 2000 年之前寫的 1000 份正面和 1000 份負面評論,每位作者的評論上限為 20(每位作者共 312 位)。我們將此語料庫稱為極性數據集。 - [感傷教育:基于最小削減的主觀性總結的情感分析](http://xxx.lanl.gov/abs/cs/0409058),2004。 數據已經有所清理;例如: * 數據集僅包含英語評論。 * 所有文本都已轉換為小寫。 * 標點符號周圍有空格,如句號,逗號和括號。 * 文本每行被分成一個句子。 該數據已用于一些相關的自然語言處理任務。對于分類,機器學習模型(例如支持向量機)對數據的表現在高 70%到低 80%(例如 78%-82%)的范圍內。 更復雜的數據準備可以看到高達 86%的結果,交叉驗證 10 倍。如果我們想在現代方法的實驗中使用這個數據集,這給了我們 80 年代中期的球場。 > ...根據下游極性分類器的選擇,我們可以實現高度統計上的顯著改善(從 82.8%到 86.4%) - [感傷教育:基于最小削減的主觀性總結的情感分析](http://xxx.lanl.gov/abs/cs/0409058),2004。 您可以從此處下載數據集: * [電影評論 Polarity Dataset](https://www.cs.cornell.edu/people/pabo/movie-review-data/review_polarity.tar.gz) (review_polarity.tar.gz,3MB) 解壓縮文件后,您將有一個名為“ _txt_sentoken_ ”的目錄,其中包含兩個子目錄,其中包含文本“ _neg_ ”和“ _pos_ ”的負數和積極的評論。對于每個 neg 和 pos,每個文件存儲一個評論約定 _cv000_ 到 _cv999_ 。 接下來,我們來看看加載和準備文本數據。 ## 數據準備 在本節中,我們將看看 3 件事: 1. 將數據分成訓練和測試集。 2. 加載和清理數據以刪除標點符號和數字。 3. 準備所有評論并保存到文件。 ### 分為訓練和測試裝置 我們假裝我們正在開發一種系統,可以預測文本電影評論的情感是積極的還是消極的。 這意味著在開發模型之后,我們需要對新的文本評論進行預測。這將要求對這些新評論執行所有相同的數據準備,就像對模型的訓練數據執行一樣。 我們將通過在任何數據準備之前拆分訓練和測試數據集來確保將此約束納入我們模型的評估中。這意味著測試集中的數據中的任何知識可以幫助我們更好地準備數據(例如,所使用的單詞)在用于訓練模型的數據的準備中是不可用的。 話雖如此,我們將使用最近 100 次正面評論和最后 100 次負面評論作為測試集(100 條評論),其余 1,800 條評論作為訓練數據集。 這是 90%的訓練,10%的數據分割。 通過使用評論的文件名可以輕松實現拆分,其中評論為 000 至 899 的評論用于訓練數據,而評論為 900 以上的評論用于測試。 ### 裝載和清潔評論 文本數據已經非常干凈;沒有太多準備工作。 不會因細節問題而陷入困境,我們將按以下方式準備數據: * 在白色空間的分裂標記。 * 從單詞中刪除所有標點符號。 * 刪除所有不完全由字母字符組成的單詞。 * 刪除所有已知停用詞的單詞。 * 刪除長度為&lt; = 1 個字符的所有單詞。 我們可以將所有這些步驟放入一個名為 _clean_doc()_ 的函數中,該函數將從文件加載的原始文本作為參數,并返回已清理的標記列表。我們還可以定義一個函數 _load_doc()_,它從文件中加載文件,以便與 _clean_doc()_ 函數一起使用。下面列出了清理第一次正面評價的示例。 ```py from nltk.corpus import stopwords import string # load doc into memory def load_doc(filename): # open the file as read only file = open(filename, 'r') # read all text text = file.read() # close the file file.close() return text # turn a doc into clean tokens def clean_doc(doc): # split into tokens by white space tokens = doc.split() # remove punctuation from each token table = str.maketrans('', '', string.punctuation) tokens = [w.translate(table) for w in tokens] # remove remaining tokens that are not alphabetic tokens = [word for word in tokens if word.isalpha()] # filter out stop words stop_words = set(stopwords.words('english')) tokens = [w for w in tokens if not w in stop_words] # filter out short tokens tokens = [word for word in tokens if len(word) > 1] return tokens # load the document filename = 'txt_sentoken/pos/cv000_29590.txt' text = load_doc(filename) tokens = clean_doc(text) print(tokens) ``` 運行該示例加載并清除一個電影評論。 打印清潔評論中的標記以供審閱。 ```py ... 'creepy', 'place', 'even', 'acting', 'hell', 'solid', 'dreamy', 'depp', 'turning', 'typically', 'strong', 'performance', 'deftly', 'handling', 'british', 'accent', 'ians', 'holm', 'joe', 'goulds', 'secret', 'richardson', 'dalmatians', 'log', 'great', 'supporting', 'roles', 'big', 'surprise', 'graham', 'cringed', 'first', 'time', 'opened', 'mouth', 'imagining', 'attempt', 'irish', 'accent', 'actually', 'wasnt', 'half', 'bad', 'film', 'however', 'good', 'strong', 'violencegore', 'sexuality', 'language', 'drug', 'content'] ``` ### 清除所有評論并保存 我們現在可以使用該功能來清理評論并將其應用于所有評論。 為此,我們將在下面開發一個名為 _process_docs()_ 的新函數,它將遍歷目錄中的所有評論,清理它們并將它們作為列表返回。 我們還將為函數添加一個參數,以指示函數是處理序列還是測試評論,這樣可以過濾文件名(如上所述),并且只清理和返回所請求的那些訓練或測試評論。 完整功能如下所列。 ```py # load all docs in a directory def process_docs(directory, is_trian): documents = list() # walk through all files in the folder for filename in listdir(directory): # skip any reviews in the test set if is_trian and filename.startswith('cv9'): continue if not is_trian and not filename.startswith('cv9'): continue # create the full path of the file to open path = directory + '/' + filename # load the doc doc = load_doc(path) # clean doc tokens = clean_doc(doc) # add to list documents.append(tokens) return documents ``` 我們可以將此功能稱為負面訓練評論,如下所示: ```py negative_docs = process_docs('txt_sentoken/neg', True) ``` 接下來,我們需要訓練和測試文件的標簽。我們知道我們有 900 份訓練文件和 100 份測試文件。我們可以使用 Python 列表推導為訓練和測試集的負(0)和正(1)評論創建標簽。 ```py trainy = [0 for _ in range(900)] + [1 for _ in range(900)] testY = [0 for _ in range(100)] + [1 for _ in range(100)] ``` 最后,我們希望將準備好的訓練和測試集保存到文件中,以便我們以后可以加載它們進行建模和模型評估。 下面命名為 _save_dataset()_ 的函數將使用 pickle API 將給定的準備數據集(X 和 y 元素)保存到文件中。 ```py # save a dataset to file def save_dataset(dataset, filename): dump(dataset, open(filename, 'wb')) print('Saved: %s' % filename) ``` ### 完整的例子 我們可以將所有這些數據準備步驟結合在一起。 下面列出了完整的示例。 ```py from string import punctuation from os import listdir from nltk.corpus import stopwords from pickle import dump # load doc into memory def load_doc(filename): # open the file as read only file = open(filename, 'r') # read all text text = file.read() # close the file file.close() return text # turn a doc into clean tokens def clean_doc(doc): # split into tokens by white space tokens = doc.split() # remove punctuation from each token table = str.maketrans('', '', punctuation) tokens = [w.translate(table) for w in tokens] # remove remaining tokens that are not alphabetic tokens = [word for word in tokens if word.isalpha()] # filter out stop words stop_words = set(stopwords.words('english')) tokens = [w for w in tokens if not w in stop_words] # filter out short tokens tokens = [word for word in tokens if len(word) > 1] tokens = ' '.join(tokens) return tokens # load all docs in a directory def process_docs(directory, is_trian): documents = list() # walk through all files in the folder for filename in listdir(directory): # skip any reviews in the test set if is_trian and filename.startswith('cv9'): continue if not is_trian and not filename.startswith('cv9'): continue # create the full path of the file to open path = directory + '/' + filename # load the doc doc = load_doc(path) # clean doc tokens = clean_doc(doc) # add to list documents.append(tokens) return documents # save a dataset to file def save_dataset(dataset, filename): dump(dataset, open(filename, 'wb')) print('Saved: %s' % filename) # load all training reviews negative_docs = process_docs('txt_sentoken/neg', True) positive_docs = process_docs('txt_sentoken/pos', True) trainX = negative_docs + positive_docs trainy = [0 for _ in range(900)] + [1 for _ in range(900)] save_dataset([trainX,trainy], 'train.pkl') # load all test reviews negative_docs = process_docs('txt_sentoken/neg', False) positive_docs = process_docs('txt_sentoken/pos', False) testX = negative_docs + positive_docs testY = [0 for _ in range(100)] + [1 for _ in range(100)] save_dataset([testX,testY], 'test.pkl') ``` 運行該示例分別清除文本電影評論文檔,創建標簽,并分別為 _train.pkl_ 和 _test.pkl_ 中的訓練和測試數據集保存準備好的數據。 現在我們準備開發我們的模型了。 ## 開發多渠道模型 在本節中,我們將開發一個用于情感分析預測問題的多通道卷積神經網絡。 本節分為 3 部分: 1. 編碼數據 2. 定義模型。 3. 完整的例子。 ### 編碼數據 第一步是加載已清理的訓練數據集。 可以調用以下名為 _load_dataset()_ 的函數來加載 pickle 訓練數據集。 ```py # load a clean dataset def load_dataset(filename): return load(open(filename, 'rb')) trainLines, trainLabels = load_dataset('train.pkl') ``` 接下來,我們必須在訓練數據集上安裝 Keras Tokenizer。我們將使用此標記器來定義嵌入層的詞匯表,并將審閱文檔編碼為整數。 下面的函數 _create_tokenizer()_ 將創建一個給定文檔列表的 Tokenizer。 ```py # fit a tokenizer def create_tokenizer(lines): tokenizer = Tokenizer() tokenizer.fit_on_texts(lines) return tokenizer ``` 我們還需要知道輸入序列的最大長度作為模型的輸入并將所有序列填充到固定長度。 下面的函數 _max_length()_ 將計算訓練數據集中所有評論的最大長度(單詞數)。 ```py # calculate the maximum document length def max_length(lines): return max([len(s.split()) for s in lines]) ``` 我們還需要知道嵌入層的詞匯量大小。 這可以從準備好的 Tokenizer 計算,如下: ```py # calculate vocabulary size vocab_size = len(tokenizer.word_index) + 1 ``` 最后,我們可以整數編碼并填充干凈的電影評論文本。 名為 _encode_text()_ 的以下函數將編碼和填充文本數據到最大查看長度。 ```py # encode a list of lines def encode_text(tokenizer, lines, length): # integer encode encoded = tokenizer.texts_to_sequences(lines) # pad encoded sequences padded = pad_sequences(encoded, maxlen=length, padding='post') return padded ``` ### 定義模型 文檔分類的標準模型是使用嵌入層作為輸入,然后是一維卷積神經網絡,池化層,然后是預測輸出層。 卷積層中的內核大小定義了卷積在輸入文本文檔中傳遞時要考慮的單詞數,從而提供分組參數。 用于文檔分類的多通道卷積神經網絡涉及使用具有不同大小的內核的標準模型的多個版本。這允許一次以不同的分辨率或不同的 n-gram(單詞組)處理文檔,同時模型學習如何最好地整合這些解釋。 Yoon Kim 在他的 2014 年題為“[用于句子分類的卷積神經網絡](https://arxiv.org/abs/1408.5882)”的論文中首次描述了這種方法。 在本文中,Kim 嘗試了靜態和動態(更新)嵌入層,我們可以簡化方法,而只關注使用不同的內核大小。 使用 Kim 的論文中的圖表可以最好地理解這種方法: ![Depiction of the multiple-channel convolutional neural network for text](img/1d7144ec7b965e35ec9366cc83c40995.jpg) 描述文本的多通道卷積神經網絡。 取自“用于句子分類的卷積神經網絡”。 在 Keras 中,可以使用[功能 API](https://keras.io/getting-started/functional-api-guide/) 定義多輸入模型。 我們將定義一個帶有三個輸入通道的模型,用于處理 4 克,6 克和 8 克的電影評論文本。 每個頻道由以下元素組成: * 輸入層,用于定義輸入序列的長度。 * 嵌入層設置為詞匯表的大小和 100 維實值表示。 * 一維卷積層,具有 32 個濾波器,內核大小設置為一次讀取的字數。 * Max Pooling 層用于合并卷積層的輸出。 * 展平層以將三維輸出減少為二維以進行連接。 三個通道的輸出連接成一個向量,并由 Dense 層和輸出層處理。 下面的函數定義并返回模型。作為定義模型的一部分,將打印已定義模型的摘要,并創建模型圖的圖并將其保存到文件中。 ```py # define the model def define_model(length, vocab_size): # channel 1 inputs1 = Input(shape=(length,)) embedding1 = Embedding(vocab_size, 100)(inputs1) conv1 = Conv1D(filters=32, kernel_size=4, activation='relu')(embedding1) drop1 = Dropout(0.5)(conv1) pool1 = MaxPooling1D(pool_size=2)(drop1) flat1 = Flatten()(pool1) # channel 2 inputs2 = Input(shape=(length,)) embedding2 = Embedding(vocab_size, 100)(inputs2) conv2 = Conv1D(filters=32, kernel_size=6, activation='relu')(embedding2) drop2 = Dropout(0.5)(conv2) pool2 = MaxPooling1D(pool_size=2)(drop2) flat2 = Flatten()(pool2) # channel 3 inputs3 = Input(shape=(length,)) embedding3 = Embedding(vocab_size, 100)(inputs3) conv3 = Conv1D(filters=32, kernel_size=8, activation='relu')(embedding3) drop3 = Dropout(0.5)(conv3) pool3 = MaxPooling1D(pool_size=2)(drop3) flat3 = Flatten()(pool3) # merge merged = concatenate([flat1, flat2, flat3]) # interpretation dense1 = Dense(10, activation='relu')(merged) outputs = Dense(1, activation='sigmoid')(dense1) model = Model(inputs=[inputs1, inputs2, inputs3], outputs=outputs) # compile model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy']) # summarize print(model.summary()) plot_model(model, show_shapes=True, to_file='multichannel.png') return model ``` ### 完整的例子 將所有這些結合在一起,下面列出了完整的示例。 ```py from pickle import load from numpy import array from keras.preprocessing.text import Tokenizer from keras.preprocessing.sequence import pad_sequences from keras.utils.vis_utils import plot_model from keras.models import Model from keras.layers import Input from keras.layers import Dense from keras.layers import Flatten from keras.layers import Dropout from keras.layers import Embedding from keras.layers.convolutional import Conv1D from keras.layers.convolutional import MaxPooling1D from keras.layers.merge import concatenate # load a clean dataset def load_dataset(filename): return load(open(filename, 'rb')) # fit a tokenizer def create_tokenizer(lines): tokenizer = Tokenizer() tokenizer.fit_on_texts(lines) return tokenizer # calculate the maximum document length def max_length(lines): return max([len(s.split()) for s in lines]) # encode a list of lines def encode_text(tokenizer, lines, length): # integer encode encoded = tokenizer.texts_to_sequences(lines) # pad encoded sequences padded = pad_sequences(encoded, maxlen=length, padding='post') return padded # define the model def define_model(length, vocab_size): # channel 1 inputs1 = Input(shape=(length,)) embedding1 = Embedding(vocab_size, 100)(inputs1) conv1 = Conv1D(filters=32, kernel_size=4, activation='relu')(embedding1) drop1 = Dropout(0.5)(conv1) pool1 = MaxPooling1D(pool_size=2)(drop1) flat1 = Flatten()(pool1) # channel 2 inputs2 = Input(shape=(length,)) embedding2 = Embedding(vocab_size, 100)(inputs2) conv2 = Conv1D(filters=32, kernel_size=6, activation='relu')(embedding2) drop2 = Dropout(0.5)(conv2) pool2 = MaxPooling1D(pool_size=2)(drop2) flat2 = Flatten()(pool2) # channel 3 inputs3 = Input(shape=(length,)) embedding3 = Embedding(vocab_size, 100)(inputs3) conv3 = Conv1D(filters=32, kernel_size=8, activation='relu')(embedding3) drop3 = Dropout(0.5)(conv3) pool3 = MaxPooling1D(pool_size=2)(drop3) flat3 = Flatten()(pool3) # merge merged = concatenate([flat1, flat2, flat3]) # interpretation dense1 = Dense(10, activation='relu')(merged) outputs = Dense(1, activation='sigmoid')(dense1) model = Model(inputs=[inputs1, inputs2, inputs3], outputs=outputs) # compile model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy']) # summarize print(model.summary()) plot_model(model, show_shapes=True, to_file='multichannel.png') return model # load training dataset trainLines, trainLabels = load_dataset('train.pkl') # create tokenizer tokenizer = create_tokenizer(trainLines) # calculate max document length length = max_length(trainLines) # calculate vocabulary size vocab_size = len(tokenizer.word_index) + 1 print('Max document length: %d' % length) print('Vocabulary size: %d' % vocab_size) # encode data trainX = encode_text(tokenizer, trainLines, length) print(trainX.shape) # define model model = define_model(length, vocab_size) # fit model model.fit([trainX,trainX,trainX], array(trainLabels), epochs=10, batch_size=16) # save the model model.save('model.h5') ``` 首先運行該示例將打印準備好的訓練數據集的摘要。 ```py Max document length: 1380 Vocabulary size: 44277 (1800, 1380) ``` 接下來,打印已定義模型的摘要。 ```py ____________________________________________________________________________________________________ Layer (type) Output Shape Param # Connected to ==================================================================================================== input_1 (InputLayer) (None, 1380) 0 ____________________________________________________________________________________________________ input_2 (InputLayer) (None, 1380) 0 ____________________________________________________________________________________________________ input_3 (InputLayer) (None, 1380) 0 ____________________________________________________________________________________________________ embedding_1 (Embedding) (None, 1380, 100) 4427700 input_1[0][0] ____________________________________________________________________________________________________ embedding_2 (Embedding) (None, 1380, 100) 4427700 input_2[0][0] ____________________________________________________________________________________________________ embedding_3 (Embedding) (None, 1380, 100) 4427700 input_3[0][0] ____________________________________________________________________________________________________ conv1d_1 (Conv1D) (None, 1377, 32) 12832 embedding_1[0][0] ____________________________________________________________________________________________________ conv1d_2 (Conv1D) (None, 1375, 32) 19232 embedding_2[0][0] ____________________________________________________________________________________________________ conv1d_3 (Conv1D) (None, 1373, 32) 25632 embedding_3[0][0] ____________________________________________________________________________________________________ dropout_1 (Dropout) (None, 1377, 32) 0 conv1d_1[0][0] ____________________________________________________________________________________________________ dropout_2 (Dropout) (None, 1375, 32) 0 conv1d_2[0][0] ____________________________________________________________________________________________________ dropout_3 (Dropout) (None, 1373, 32) 0 conv1d_3[0][0] ____________________________________________________________________________________________________ max_pooling1d_1 (MaxPooling1D) (None, 688, 32) 0 dropout_1[0][0] ____________________________________________________________________________________________________ max_pooling1d_2 (MaxPooling1D) (None, 687, 32) 0 dropout_2[0][0] ____________________________________________________________________________________________________ max_pooling1d_3 (MaxPooling1D) (None, 686, 32) 0 dropout_3[0][0] ____________________________________________________________________________________________________ flatten_1 (Flatten) (None, 22016) 0 max_pooling1d_1[0][0] ____________________________________________________________________________________________________ flatten_2 (Flatten) (None, 21984) 0 max_pooling1d_2[0][0] ____________________________________________________________________________________________________ flatten_3 (Flatten) (None, 21952) 0 max_pooling1d_3[0][0] ____________________________________________________________________________________________________ concatenate_1 (Concatenate) (None, 65952) 0 flatten_1[0][0] flatten_2[0][0] flatten_3[0][0] ____________________________________________________________________________________________________ dense_1 (Dense) (None, 10) 659530 concatenate_1[0][0] ____________________________________________________________________________________________________ dense_2 (Dense) (None, 1) 11 dense_1[0][0] ==================================================================================================== Total params: 14,000,337 Trainable params: 14,000,337 Non-trainable params: 0 ____________________________________________________________________________________________________ ``` 該模型相對較快,并且似乎在訓練數據集上表現出良好的技能。 ```py ... Epoch 6/10 1800/1800 [==============================] - 30s - loss: 9.9093e-04 - acc: 1.0000 Epoch 7/10 1800/1800 [==============================] - 29s - loss: 5.1899e-04 - acc: 1.0000 Epoch 8/10 1800/1800 [==============================] - 28s - loss: 3.7958e-04 - acc: 1.0000 Epoch 9/10 1800/1800 [==============================] - 29s - loss: 3.0534e-04 - acc: 1.0000 Epoch 10/10 1800/1800 [==============================] - 29s - loss: 2.6234e-04 - acc: 1.0000 ``` 定義模型的圖表將保存到文件中,清楚地顯示模型的三個輸入通道。 ![Plot of the Multichannel Convolutional Neural Network For Text](img/bf3bb1f5fdb70a9f04e09e0cd212c5af.jpg) 文本多通道卷積神經網絡圖 該模型適用于多個時期并保存到文件 _model.h5_ 以供以后評估。 ## 評估模型 在本節中,我們可以通過預測未見測試數據集中所有評論的情感來評估擬合模型。 使用上一節中開發的數據加載函數,我們可以加載和編碼訓練和測試數據集。 ```py # load datasets trainLines, trainLabels = load_dataset('train.pkl') testLines, testLabels = load_dataset('test.pkl') # create tokenizer tokenizer = create_tokenizer(trainLines) # calculate max document length length = max_length(trainLines) # calculate vocabulary size vocab_size = len(tokenizer.word_index) + 1 print('Max document length: %d' % length) print('Vocabulary size: %d' % vocab_size) # encode data trainX = encode_text(tokenizer, trainLines, length) testX = encode_text(tokenizer, testLines, length) print(trainX.shape, testX.shape) ``` 我們可以加載保存的模型并在訓練和測試數據集上進行評估。 下面列出了完整的示例。 ```py from pickle import load from numpy import array from keras.preprocessing.text import Tokenizer from keras.preprocessing.sequence import pad_sequences from keras.models import load_model # load a clean dataset def load_dataset(filename): return load(open(filename, 'rb')) # fit a tokenizer def create_tokenizer(lines): tokenizer = Tokenizer() tokenizer.fit_on_texts(lines) return tokenizer # calculate the maximum document length def max_length(lines): return max([len(s.split()) for s in lines]) # encode a list of lines def encode_text(tokenizer, lines, length): # integer encode encoded = tokenizer.texts_to_sequences(lines) # pad encoded sequences padded = pad_sequences(encoded, maxlen=length, padding='post') return padded # load datasets trainLines, trainLabels = load_dataset('train.pkl') testLines, testLabels = load_dataset('test.pkl') # create tokenizer tokenizer = create_tokenizer(trainLines) # calculate max document length length = max_length(trainLines) # calculate vocabulary size vocab_size = len(tokenizer.word_index) + 1 print('Max document length: %d' % length) print('Vocabulary size: %d' % vocab_size) # encode data trainX = encode_text(tokenizer, trainLines, length) testX = encode_text(tokenizer, testLines, length) print(trainX.shape, testX.shape) # load the model model = load_model('model.h5') # evaluate model on training dataset loss, acc = model.evaluate([trainX,trainX,trainX], array(trainLabels), verbose=0) print('Train Accuracy: %f' % (acc*100)) # evaluate model on test dataset dataset loss, acc = model.evaluate([testX,testX,testX],array(testLabels), verbose=0) print('Test Accuracy: %f' % (acc*100)) ``` 運行該示例將在訓練和測試數據集上打印模型的技能。 ```py Max document length: 1380 Vocabulary size: 44277 (1800, 1380) (200, 1380) Train Accuracy: 100.000000 Test Accuracy: 87.500000 ``` 我們可以看到,正如預期的那樣,訓練數據集的技能非常出色,這里的準確率為 100%。 我們還可以看到模型在看不見的測試數據集上的技能也非常令人印象深刻,達到了 87.5%,這高于 2014 年論文中報告的模型的技能(盡管不是直接的蘋果對蘋果的比較)。 ## 擴展 本節列出了一些擴展您可能希望探索的教程的想法。 * **不同的 n-gram** 。通過更改模型中通道使用的內核大小(n-gram 的數量)來探索模型,以了解它如何影響模型技能。 * **更多或更少的頻道**。探索在模型中使用更多或更少的渠道,并了解它如何影響模型技能。 * **深層網絡**。卷積神經網絡在更深層時在計算機視覺中表現更好。在這里探索使用更深層的模型,看看它如何影響模型技能。 ## 進一步閱讀 如果您希望深入了解,本節將提供有關該主題的更多資源。 * [用于句子分類的卷積神經網絡](https://arxiv.org/abs/1408.5882),2014。 * [用于句子分類的卷積神經網絡(代碼)](https://github.com/yoonkim/CNN_sentence)。 * [Keras 功能 API](https://keras.io/getting-started/functional-api-guide/) ## 摘要 在本教程中,您了解了如何為文本電影評論數據開發多通道卷積神經網絡以進行情感預測。 具體來說,你學到了: * 如何準備電影評論文本數據進行建模。 * 如何為 Keras 中的文本開發多通道卷積神經網絡。 * 如何評估看不見的電影評論數據的擬合模型。 你有任何問題嗎? 在下面的評論中提出您的問題,我會盡力回答。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看