데이터 분석/머신러닝

PyTorch RNN 모델 경로 예측/완성 (샘플 코드)

Family in August 2023. 2. 23. 22:26
반응형

RNN 모델을 사용하여 고객의 이동경로 로그를 기반으로 가상 경로를 예측하는 샘플 코드를 소개해 드리겠습니다.

PyTorch를 사용한 예제 코드입니다.

이 코드는 경로 기록을 바탕으로 가상 경로를 예측합니다.

import torch
import torch.nn as nn

# Define the RNN model
class RNN(nn.Module):
    def __init__(self, input_size, hidden_size, output_size):
        super(RNN, self).__init__()

        self.hidden_size = hidden_size
        self.i2h = nn.Linear(input_size + hidden_size, hidden_size)
        self.i2o = nn.Linear(input_size + hidden_size, output_size)
        self.softmax = nn.LogSoftmax(dim=1)

    def forward(self, input_tensor, hidden_tensor):
        combined = torch.cat((input_tensor, hidden_tensor), 1)
        hidden = self.i2h(combined)
        output = self.i2o(combined)
        output = self.softmax(output)
        return output, hidden

    def init_hidden(self):
        return torch.zeros(1, self.hidden_size)

# Define the training data
training_data = [("page1", "page2", "page3", "page4"),
                 ("page1", "page2", "page4"),
                 ("page1", "page2", "page3"),
                 ("page1", "page2", "page4", "page5")]

# Define the dictionary for converting page names to indices
pages = ["page1", "page2", "page3", "page4", "page5"]
page_to_index = {pages[i]: i for i in range(len(pages))}

# Convert the training data into tensor format
def sequence_to_tensor(sequence):
    tensor = torch.zeros(len(sequence), 1, len(pages))
    for i, page in enumerate(sequence):
        tensor[i][0][page_to_index[page]] = 1
    return tensor

training_tensors = [sequence_to_tensor(sequence) for sequence in training_data]

# Define the RNN model
input_size = len(pages)
hidden_size = 128
output_size = len(pages)
rnn = RNN(input_size, hidden_size, output_size)

# Define the loss function and optimizer
criterion = nn.NLLLoss()
optimizer = torch.optim.Adam(rnn.parameters(), lr=0.001)

# Train the RNN model
num_epochs = 1000
for epoch in range(num_epochs):
    for tensor in training_tensors:
        hidden = rnn.init_hidden()
        rnn.zero_grad()
        loss = 0

        for i in range(tensor.size()[0]-1):
            output, hidden = rnn(tensor[i], hidden)
            loss += criterion(output, torch.argmax(tensor[i+1]))

        loss.backward()
        optimizer.step()

    if epoch % 100 == 0:
        print("Epoch: {}/{} | Loss: {:.4f}".format(epoch+1, num_epochs, loss.item()))

# Predict the virtual path for a given input sequence
def predict(sequence):
    tensor = sequence_to_tensor(sequence)
    hidden = rnn.init_hidden()
    for i in range(tensor.size()[0]-1):
        output, hidden = rnn(tensor[i], hidden)
    _, topi = output.topk(1)
    return pages[topi.item()]

# Test the RNN model
test_sequence = ("page1", "page2")
print("Input: ", test_sequence)
print("Output: ", predict(test_sequence))

이 코드는 PyTorch를 사용하여 간단한 RNN (Recurrent Neural Network) 모델을 정의하고 학습시키는 예제입니다.

이 모델은 주어진 일련의 페이지 (sequence of pages)를 입력으로 받아 다음 페이지를 예측하는 작업을 수행합니다.

이를 가상 경로 (virtual path) 예측이라고 부릅니다.

코드는 다음과 같은 단계로 구성됩니다.

우선, RNN 클래스는 nn.Module을 상속하며, init 메서드에서 입력 크기, 은닉 상태 크기, 출력 크기를 받아서 i2h와 i2o 두 개의 fully connected layer와 softmax activation 함수를 정의합니다.

 

forward 메서드에서는 입력 시퀀스와 은닉 상태를 받아서 두 개의 fully connected layer를 거쳐서 출력값을 계산하고, 이를 softmax 함수를 통해 확률값으로 변환합니다.

 

init_hidden 메서드는 처음 은닉 상태를 0으로 초기화합니다.

 

sequence_to_tensor 함수는 문자열 시퀀스를 one-hot 인코딩된 tensor 형식으로 변환하는 함수입니다.

 

training_data 리스트에는 문자열 시퀀스가 포함되어 있으며, page_to_index 딕셔너리는 페이지 이름을 인덱스로 변환해주는 딕셔너리입니다.

 

training_tensors 리스트에는 sequence_to_tensor 함수를 통해 변환된 tensor가 저장되어 있습니다.

 

학습을 위해 input_size, hidden_size, output_size를 정의하고, RNN 클래스 객체 rnn을 생성합니다.

 

criterion은 negative log likelihood loss 함수이며, optimizer는 Adam optimizer를 사용합니다.

 

num_epochs 횟수만큼 학습을 수행하며, 각 epoch마다 training_tensors에 있는 모든 tensor를 사용하여 loss를 계산하고, 역전파를 통해 가중치를 업데이트합니다.

 

predict 함수는 입력 문자열 시퀀스를 받아서 sequence_to_tensor 함수를 통해 tensor로 변환하고, 모델에 입력하여 가장 높은 확률값을 갖는 페이지를 예측합니다.

 

마지막으로, test_sequence 변수에 값을 할당하고, predict 함수를 사용하여 가상의 페이지 방문 경로를 예측합니다.

반응형