곰퓨타의 SW 이야기

Lab 11-3 Long sequence 본문

인공지능/부스트코스_파이토치로 시작하는 딥러닝 기초

Lab 11-3 Long sequence

곰퓨타 2021. 3. 23. 19:31

부스트 코스 강의를 보며 따라했다!!

www.boostcourse.org/ai214/lecture/43776/?isDesc=false

 

파이토치로 시작하는 딥러닝 기초

부스트코스 무료 강의

www.boostcourse.org

 

 

'longseq' example

longseq introduction

아주 긴 문장이 있다면 이를 잘라서 사용하고자 한다.

 

making sequence dataset from long sentence

하나의 window가 있다고 생각하고 옆으로 한자리씩 이동한다.

Code

# data setting
x_data = []
y_data = []


# window를 이동하면서 data를 저장한다. 
for i in range(0, len(sentence) - sequence_length):
    x_str = sentence[i:i + sequence_length]
    y_str = sentence[i + 1: i + sequence_length + 1]
    print(i, x_str, '->', y_str)

    # character dictionary에 있던 index 값으로 저장한다.
    x_data.append([char_dic[c] for c in x_str])  # x str to index
    y_data.append([char_dic[c] for c in y_str])  # y str to index

# np.eye를 통해 one-hot vector로 바꾸어준다.
x_one_hot = [np.eye(dic_size)[x] for x in x_data]



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

 

adding FC layer and stacking RNN

이번 강의에서는 stacking 후, Fully connected layer를 추가한 것을 만들어보고자 한다.

 

 

Code

# declare RNN + FC
class Net(torch.nn.Module):
    def __init__(self, input_dim, hidden_dim, layers):
        # constructor
        super(Net, self).__init__()
        self.rnn = torch.nn.RNN(input_dim, hidden_dim, num_layers=layers, batch_first=True)
        self.fc = torch.nn.Linear(hidden_dim, hidden_dim, bias=True)

    def forward(self, x):
        x, _status = self.rnn(x)
        x = self.fc(x)
        return x


net = Net(dic_size, hidden_size, 2)

 

Code run through

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

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

	# 모델이 예측한 결과를 해석하기 위함
    results = outputs.argmax(dim=2)
    predict_str = ""
    for j, result in enumerate(results):
        # print(i, j, ''.join([char_set[t] for t in result]), loss.item())
        # 맨 처음에는 sequence length만큼의 문자를 가져온다.
        if j == 0:
            predict_str += ''.join([char_set[t] for t in result])
        
        # result에서 마지막에 해당하는 문자열만 추가해준다.
        else:
            predict_str += char_set[result[-1]]

    print(predict_str)

 

 

'인공지능 > 부스트코스_파이토치로 시작하는 딥러닝 기초' 카테고리의 다른 글

Lab11-5 RNN seq2seq  (0) 2021.03.23
Lab 11-4 RNN timeseries  (0) 2021.03.23
Lab 11-2 RNN hihello and charseq  (0) 2021.03.23
Lab 11-1 RNN Basics  (0) 2021.03.23
Lab 11-0 RNN intro  (0) 2021.03.23
Comments