RNN, LSTM 등은 공부해 본 적이 없는데, 이번 재직자 교육 때 할 수 있게 되었다.(LSTM 몇 주 뒤에 배운다.) 현재 회사에서의 업무는 전통적인 통계학
(회귀, 로지스틱, Lasso, PCA, 잘해봤다 decision tree)에 매우 가깝지만,
인생이라는게 어떤 식으로든 준비를 해두면 언젠가는 빛을 발하는 것 같더라.
import torch
import torch.nn as nn
import numpy as np
# 문자셋
char_data = 'hihello'
char_set = list(set(char_data))
char2idx = {c: i for i, c in enumerate(char_set)}
idx2char = {i: c for i, c in enumerate(char_set)}
# 입력/출력 시퀀스
x_data = [char2idx[c] for c in 'hihell']
y_data = [char2idx[c] for c in 'ihello']
# One-hot encoding
x_one_hot = [np.eye(len(char_set))[x] for x in x_data]
inputs = torch.Tensor([x_one_hot]) # shape: (1, seq_len, input_size)
labels = torch.LongTensor([y_data]) # shape: (1, seq_len)
# 모델 정의
class RNN(nn.Module):
def __init__(self, input_size, hidden_size, output_size):
super().__init__()
self.rnn = nn.RNN(input_size, hidden_size, batch_first=True)
self.fc = nn.Linear(hidden_size, output_size)
def forward(self, x):
out, _ = self.rnn(x) # out: (batch, seq, hidden)
out = self.fc(out) # out: (batch, seq, output)
return out
model = RNN(input_size=len(char_set), hidden_size=8, output_size=len(char_set))
criterion = nn.CrossEntropyLoss()
optimizer = torch.optim.Adam(model.parameters(), lr=0.01)
# 학습 루프
for epoch in range(100):
optimizer.zero_grad()
outputs = model(inputs)
loss = criterion(outputs.view(-1, len(char_set)), labels.view(-1))
loss.backward()
optimizer.step()
result = outputs.argmax(dim=2)
result_str = ''.join([idx2char[c.item()] for c in result[0]])
if epoch % 10 == 0:
print(f"[{epoch}] loss: {loss.item():.4f}, prediction: {result_str}")