logo

[텍스트 분석] pytorch

설치

pip install torch

임포트

import torch
from torch import nn, optim

데이터셋 변환

train_dataset = torch.utils.data.TensorDataset(
    torch.Tensor(x_train.A),
    torch.unsqueeze(torch.Tensor(y_train.values), dim=1)
)

데이터 로더

train_loader = torch.utils.data.DataLoader(
    train_dataset, batch_size=32, shuffle=True)

모델 정의

input_size = cv.max_features
num_classes = 1
model = nn.Sequential(
    nn.Linear(input_size, num_classes),
    nn.Sigmoid()
)

훈련 설정

criterion = nn.BCELoss()
optimizer = optim.SGD(model.parameters(), lr=1.0)

훈련

losses = []
epochs = 10
for epoch in range(epochs):
    for i, data in enumerate(train_loader):  # 배치의 데이터와 레이블에 대해 반복
        inputs, labels = data
        optimizer.zero_grad()    # 경사를 0으로 초기화
        outputs = model(inputs)  # 모델에 데이터를 입력으로 전달하고, 출력을 계산
        loss = criterion(outputs, labels)  # 출력값과 레이블 값을 사용하여 손실 계산
        loss.backward()   # 손실값을 미분하여 모델의 파라미터의 기울기 계산
        optimizer.step()  # 옵티마이저를 사용하여 모델의 가중치와 편향 값을 업데이트
        losses.append(loss.item())  # 손실값 누적

손실 감소의 시각화

import matplotlib.pyplot as plt
plt.plot(losses);

예측

x_test_pt = torch.Tensor(x_test.A)
prob = model(x_test_pt)
prob = torch.squeeze(prob)

평가

from torchmetrics.functional import accuracy
y_test_pt = torch.Tensor(y_test.values)
accuracy(prob, y_test_pt, task='binary')

가중치

weight, bias = list(model.parameters())
word_weight = pd.DataFrame({
    '단어': cv.get_feature_names_out(),
    '가중치': weight.detach().numpy().flat
})

다층신경망

hidden_size = 32
model = nn.Sequential(
    nn.Linear(input_size, hidden_size),
    nn.ReLU(),
    nn.Linear(hidden_size, num_classes),
    nn.Sigmoid()
)
Previous
tensorflow