Kobert 모델을 수정하기로 했다.
무엇을 수정하냐고???
kobert 모델 사용(1)에서는 텍스트를 요청하면 해당 감정이 나왔다.
이 부분을 해당 감정들의 가중치로 뽑을 예정이다..
new_softmax (추가 부분)
def new_softmax(a) :
c = np.max(a) # 최댓값
exp_a = np.exp(a-c) # 각각의 원소에 최댓값을 뺀 값에 exp를 취한다. (이를 통해 overflow 방지)
sum_exp_a = np.sum(exp_a)
y = (exp_a / sum_exp_a) * 100
return np.round(y, 3)
실수를 치역으로 한 가중치 값을 softmax함수를 사용하여 텍스트를 확률값으로 변환헀다.
predict (수정 부분)
def predict(predict_sentence):
data = [predict_sentence, '0']
dataset_another = [data]
another_test = BERTDataset(dataset_another, 0, 1, tok, vocab, max_len, True, False) # 토큰화한 문장
test_dataloader = torch.utils.data.DataLoader(another_test, batch_size=batch_size, num_workers=5)
model.eval()
for batch_id, (token_ids, valid_length, segment_ids, label) in enumerate(test_dataloader):
token_ids = token_ids.long().to(device)
segment_ids = segment_ids.long().to(device)
valid_length= valid_length
label = label.long().to(device)
out = model(token_ids, valid_length, segment_ids)
test_eval=[]
for i in out:
logits=i
logits = logits.detach().cpu().numpy()
min_v = min(logits)
total = 0
probability = []
logits = np.round(new_softmax(logits), 3).tolist()
for logit in logits:
# print(logit)
probability.append(np.round(logit, 3))
if np.argmax(logits) == 0: emotion = "공포"
elif np.argmax(logits) == 1: emotion = "놀람"
elif np.argmax(logits) == 2: emotion = '분노'
elif np.argmax(logits) == 3: emotion = '슬픔'
elif np.argmax(logits) == 4: emotion = '행복'
elif np.argmax(logits) == 5: emotion = '혐오'
probability.append(emotion)
# print(probability)
return probability
해당 감정들을 확률로 뽑았다..
학습된 Kobert 모델을 저장할거다 기대!!
colab에서 google drive로 저장했다.
#구글드라이브 연동
from google.colab import drive
drive.mount('/content/drive')
import os
os.chdir('/content/drive/MyDrive/models/')
os.getcwd()
path = '/content/drive/MyDrive/models/'
torch.save(model, path + 'bookwave_model.pt') # 전체 모델 저장
torch.save(model.state_dict(), 'bookwave_model_state_dict.pt') # 모델 객체의 state_dict 저장
torch.save({
'model': model.state_dict(),
'optimizer': optimizer.state_dict()
}, 'bookwave_all.tar') # 여러 가지 값 저장, 학습 중 진행 상황 저장을 위해 epoch, loss 값 등 일반 scalar값 저장 가능
다음은 Kobert 학습된 모델을 Fast Api에서 적용해보겠다!!
3탄도 기대할게요~!