모두를 위한 딥러닝 2 :: Lab-11-2 RNN hihello and charseq

Uomnf97·2021년 8월 23일
0
post-custom-banner

hihello

Hihello는 무엇인지

  • hihello를 예측하는 모델을 만들려고 함. 하나의 알파벳이 주어질 때 다음 문자를 예측할 수 있도록 하는 RNN 모델을 만들려고 함.

Data Setting(one-hot encoding)

  • 벡터의 하나의 축에서만 1로 표현되고 나머지부분은 0으로 표현되는 방식으로 벡터의 차원의 수는 알파벳의 종류이다. 입력할때는 출력될 부분과 입력될부분을 나눠서 인덱스를 표현한 데이터를 넣어준다.

Cross Entropy Loss

  • categorical 한 output을 출력할 때 사용하는 손실함수
  • criterion(output,label) : 첫 번째 인자에서는 모델의 output, 두번째인자는 정답 label을 줌

Code run through

import torch
import torch.optim as optim
import numpy as np

# Random seed to make results deterministic and reproducible
torch.manual_seed(0)

# declare dictionary
char_set = ['h', 'i', 'e', 'l', 'o']

# hyper parameters
input_size = len(char_set)
hidden_size = len(char_set)
learning_rate = 0.1

# data setting
x_data = [[0, 1, 0, 2, 3, 3]]
x_one_hot = [[[1, 0, 0, 0, 0],
              [0, 1, 0, 0, 0],
              [1, 0, 0, 0, 0],
              [0, 0, 1, 0, 0],
              [0, 0, 0, 1, 0],
              [0, 0, 0, 1, 0]]]
y_data = [[1, 0, 2, 3, 3, 4]]

# transform as torch tensor variable
X = torch.FloatTensor(x_one_hot)
Y = torch.LongTensor(y_data)

# declare RNN
rnn = torch.nn.RNN(input_size, hidden_size, batch_first=True)  # batch_first guarantees the order of output = (B, S, F)

# loss & optimizer setting
criterion = torch.nn.CrossEntropyLoss()
optimizer = optim.Adam(rnn.parameters(), learning_rate)

# start training
for i in range(100):
    optimizer.zero_grad()
    outputs, _status = rnn(X)
    loss = criterion(outputs.view(-1, input_size), Y.view(-1))
    loss.backward()
    optimizer.step()

    result = outputs.data.numpy().argmax(axis=2)
    result_str = ''.join([char_set[c] for c in np.squeeze(result)])
    print(i, "loss: ", loss.item(), "prediction: ", result, "true Y: ", y_data, "prediction str: ", result_str)

charseq

  • hihello 보다 일반적인 단어의 예측 모델이며, hihello코드를 보다 일반화한 코드라고 생각하면 됨. 어떠한 sample이 들어와도 다음을 예측할 수 있음
  • np.eye 간단하게 원하는 크기의 identity 메트릭스를 만들어줌.
import torch
import torch.optim as optim
import numpy as np

# Random seed to make results deterministic and reproducible
torch.manual_seed(0)

sample = " if you want you"

# make dictionary
char_set = list(set(sample))
char_dic = {c: i for i, c in enumerate(char_set)}
print(char_dic)

# hyper parameters
dic_size = len(char_dic)
hidden_size = len(char_dic)
learning_rate = 0.1

# data setting
sample_idx = [char_dic[c] for c in sample]
x_data = [sample_idx[:-1]]
x_one_hot = [np.eye(dic_size)[x] for x in x_data]
y_data = [sample_idx[1:]]

# declare RNN
rnn = torch.nn.RNN(dic_size, hidden_size, batch_first=True)

# loss & optimizer setting
criterion = torch.nn.CrossEntropyLoss()
optimizer = optim.Adam(rnn.parameters(), learning_rate)

# start training
for i in range(50):
    optimizer.zero_grad()
    outputs, _status = rnn(X)
    loss = criterion(outputs.view(-1, dic_size), Y.view(-1))
    loss.backward()
    optimizer.step()

    result = outputs.data.numpy().argmax(axis=2)
    result_str = ''.join([char_set[c] for c in np.squeeze(result)])
    print(i, "loss: ", loss.item(), "prediction: ", result, "true Y: ", y_data, "prediction str: ", result_str)
profile
사회적 가치를 실현하는 프로그래머
post-custom-banner

0개의 댓글