AI 부트캠프 - 19,20일차

Cookie Baking·2024년 10월 31일

AI 부트 캠프 TIL

목록 보기
17/42

앞서 기본 lstm 모델을 바탕으로 텍스트 리뷰 기반 딥러닝 모델을 만들어보았다.

해당 모델에서는 Attention 알고리즘 적용하여 에포크를 100번 돌았을 경우에 좋은 성능을 보임을 알 수 있었다.


Textblob

추가로 같은 방식으로 sentiment 예측 모델도 생성할 수 있었다.
해당 과제를 수행하면서
textblob라는 라이브러리도 알게 되었다.

# 감성 분석을 위한 함수
def get_sentiment(text):
    return TextBlob(text).sentiment.polarity

데이터 시각화

# textblob 적용된 sentiment_label
# 전처리 진행된 content_c 컬럼
negative_content = df[df['sentiment_label'] == 'negative']['content_c']

# 데이터 시각화 

from wordcloud import WordCloud, STOPWORDS

stopwords = set(STOPWORDS)
stopwords.update(['use', 'account', 'now', 'netflix', 'movie', 'show', 'time', 'app', 'series', 'phone', 'movies', 'watch', 'shows', 'update', 'video', 'say', 'one', 'please', 'will', 'im'])  # 리뷰에서 필요없는 단어는 여기 안에 추가하셔도 좋습니다.

negative_content = df[df['sentiment_label'] == 'negative']['content_c']
negative_reviews=" ".join(content for content in negative_content)

wordcloud = WordCloud(width=800, height=400, background_color='white', stopwords=stopwords).generate(negative_reviews)

plt.figure(figsize=(12,6))
plt.imshow(wordcloud, interpolation='bilinear')
plt.axis('off')
plt.title('Negative Reviews Word Cloud')
plt.show()

그렇다면 이렇게 좋은 성능을 가진 모델을 만들었다면 모델을 저장하는 방법은 없을까??


딥러닝 모델을 저장해보자

1. 단어집 저장 (pickle.dump)

  • 단어집 : 앞서 전처리 -> text_pipeline 거치며 정수형 변환한 값을 갖고 있는 딕셔너리 형태의 단어집
import pickle

# Vocab을 저장할 파일 경로
vocab_path = "vocab.pkl"
with open(vocab_path, "wb") as f:
	# String to Index
    pickle.dump(vocab.get_stoi(), f)  # stoi 사전 저장

2. 모댈 저장 (torch.save)

  • epoch : 끊긴 에포크 이후로 훈련을 진행할 수도 있기 때문
  • model.state_dict() : 모델의 구조와 가중치 저장
  • optimzer.state_dict() : Optimzer 상태 저장 (모멘텀, Optimzer 학습률 저장)
  • loss : 손실 (에포크와 같은 맥락으로 저장)

save_path = "lstm_sentiment_model_vocab.pth"
torch.save({
    'epoch': epoch,
    'model_state_dict': model.state_dict(),
    'optimizer_state_dict': optimizer.state_dict(),
    'loss': loss,
    'vocab_path': vocab_path  # 저장한 vocab 경로 포함
}, save_path)

3. 저장된 모델 불러오기

PROCESS


  • 사전집 (pickle.load)
from torchtext.vocab import Vocab

# 저장된 단어집 가져오기
with open("data/vocab.pkl", "rb") as f:
    stoi = pickle.load(f)
    
vocab = Vocab(stoi)

  • 문장에서 단어 분리해주는 tokenizer 전역 선언
tokenizer = get_tokenizer('basic_english')
  • 파이프라인 정의 (테스트 텍스트에 대해서도 단어 분리 및 정수값 반환을 위해)
def text_pipeline(text):
    return [vocab[token] for token in tokenizer(text)]

def label_pipeline(label):
    return int(label)

  • 기본 모델 선언
# 하이퍼파라미터 수정
VOCAB_SIZE = len(vocab)
EMBED_DIM = 64  
HIDDEN_DIM = 128  
OUTPUT_DIM = 3
NUM_EPOCHS = 100
LABEL_SMOOTHING = 0.05

model_in_path =  LSTMModel.LSTMModel(VOCAB_SIZE, EMBED_DIM, HIDDEN_DIM, OUTPUT_DIM)
  • 기본 모델에 학습된 성능 적용 (torch.load)
save_path = "lstm_sentiment_model_vocab.pth"
checkpoint = torch.load(save_path)
model_in_path.load_state_dict(checkpoint['model_state_dict'])

  • 예측 함수 정의
# 예측 함수(예시)
def predict_review(model, review):
    model.eval()
    with torch.no_grad():
        tensor_review = torch.tensor(text_pipeline(review), dtype=torch.long).unsqueeze(0)
        output = model(tensor_review)
        prediction =output.argmax(dim=1).item()
        return prediction
  • 예측 진행
# 새로운 리뷰에 대한 예측
new_review = "This app is good but there are some critical bugs"
predicted_score = predict_review(model_in_path, new_review)
print(f'Predicted Score: {predicted_score}')

Jupyter notebook에서 다른 py 파일 가져오는 방법

  • 모듈을 동적으로 불러오는 함수를 선언해준 후
  • 파일 경로를 설정 후에 필요한 모듈을 불러오면 됨

-> 주피터 노트북의 커널의 단점을 보완할 때 요긴하게 써먹을 수 있을 듯 하다

# 모듈을 동적으로 불러오는 함수
def load_module_from_path(path):
    module_name = os.path.splitext(os.path.basename(path))[0]
    spec = importlib.util.spec_from_file_location(module_name, path)
    module = importlib.util.module_from_spec(spec)
    spec.loader.exec_module(module)
    return module
    
# 파일 경로 설정
preProcessing_path = "preProcessing/sentiment.py"
attention_path = "model_class/Attention.py"
lstm_path = "model_class/LSTMModel.py"

# 각 파일 모듈 불러오기
preProcessing = load_module_from_path(preProcessing_path)
Attention = load_module_from_path(attention_path)
LSTMModel = load_module_from_path(lstm_path)

회고

  • 어제 발표회를 진행했는데
    하이퍼 파라미터를 자동으로 최적으로 만들어주는 라이브러리가 있다는 정보를 얻었다. Optuna

0개의 댓글