양방향 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'])
이제 모델을 훈련할 수 있습니다. 훈련 중에 과적합이 발생하지 않도록 개발 데이터 세트를 검증 데이터로 사용하겠습니다.
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 중국어 웹사이트의 기타 관련 기사를 참조하세요!