雙向LSTM模型是一種用於文字分類的神經網路。以下是一個簡單範例,示範如何使用雙向LSTM進行文字分類任務。
首先,我們需要匯入所需的函式庫和模組:
import os import numpy as np from keras.preprocessing.text import Tokenizer from keras.preprocessing.sequence import pad_sequences from keras.models import Sequential from keras.layers import Dense, Embedding, Bidirectional, LSTM from sklearn.model_selection import train_test_split
接下來,我們需要準備資料集。這裡我們假設資料集已經存在於指定的路徑中,包含三個檔案:train.txt、dev.txt和test.txt。每個文件中包含一系列文字和對應的標籤。我們可以使用以下程式碼載入資料集:
def load_imdb_data(path): assert os.path.exists(path) trainset, devset, testset = [], [], [] with open(os.path.join(path, "train.txt"), "r") as fr: for line in fr: sentence_label, sentence = line.strip().lower().split("\t", maxsplit=1) trainset.append((sentence, sentence_label)) with open(os.path.join(path, "dev.txt"), "r") as fr: for line in fr: sentence_label, sentence = line.strip().lower().split("\t", maxsplit=1) devset.append((sentence, sentence_label)) with open(os.path.join(path, "test.txt"), "r") as fr: for line in fr: sentence_label, sentence = line.strip().lower().split("\t", maxsplit=1) testset.append((sentence, sentence_label)) return trainset, devset, testset
載入資料集後,我們可以對文字進行預處理和序列化。這裡我們使用Tokenizer進行文字分詞,然後將每個字的索引序列填入相同的長度,以便能夠應用於LSTM模型。
max_features = 20000 maxlen = 80 # cut texts after this number of words (among top max_features most common words) batch_size = 32 print('Pad & split data into training set and dev set') x_train, y_train = [], [] for sent, label in trainset: x_train.append(sent) y_train.append(label) x_train, y_train = pad_sequences(x_train, maxlen=maxlen), np.array(y_train) x_train, y_train = np.array(x_train), np.array(y_train) x_dev, y_dev = [], [] for sent, label in devset: x_dev.append(sent) y_dev.append(label) x_dev, y_dev = pad_sequences(x_dev, maxlen=maxlen), np.array(y_dev) x_dev, y_dev = np.array(x_dev), np.array(y_dev)
接下來,我們可以建立雙向LSTM模型。在這個模型中,我們使用兩個LSTM層,一個正向傳遞訊息,一個反向傳遞訊息。這兩個LSTM層的輸出被連結起來,形成一個更強大的表示文字的向量。最後,我們使用全連接層進行分類。
print('Build model...') model = Sequential() model.add(Embedding(max_features, 128, input_length=maxlen)) model.add(Bidirectional(LSTM(64))) model.add(LSTM(64)) model.add(Dense(1, activation='sigmoid')) print('Compile model...') model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
現在,我們可以訓練模型了。我們將使用dev資料集作為驗證數據,以確保我們在訓練過程中不會過度擬合。
epochs = 10 batch_size = 64 history = model.fit(x_train, y_train, batch_size=batch_size, epochs=epochs, validation_data=(x_dev, y_dev))
訓練完成後,我們可以評估模型在測試集上的表現。
test_loss, test_acc = model.evaluate(x_test, y_test) print('Test accuracy:', test_acc)
以上,是一個簡單的雙向LSTM模型的文字分類範例。您也可以嘗試調整模型的參數,例如層數、神經元數量、優化器等,以獲得更好的效能。亦或是使用預先訓練的字詞嵌入(例如Word2Vec或GloVe)來替換嵌入層,以捕捉更多的語意資訊。
以上是利用雙向LSTM模型進行文本分類的案例的詳細內容。更多資訊請關注PHP中文網其他相關文章!