본문 바로가기

Data/Data Science

[Pytorch] LSTM 간단한 공부

반응형

2020년  새롭게 시작하는 프로젝트에서 LSTM을 사용해서 만드려고하는 작업이 있는데.

예전부터 말만하고 실행에 옮기지못하여 마음에 걸렸지만 이번년도엔 무조건 해봐야겠다...

 

먼저 계획한 프로젝트에서는 LSTM(RNN)의 many to one 유형을 사용하려고한다.

모델은 다음그림과 같을꺼고...

마지막 레이어에 softmax layer를 추가하여 LSTM Classification model로 만들면될꺼같다.

그리고 항상 궁금했던게 RNN, LSTM등 이러한 모델들은 input에 길이에 상관없다고했는데. 정확한 의미를 이해못했다.

이번에 공부하면서 알게된바로는 input의 dimension은 고정이되, input의 개수가 상관없다는건데. 글로는 내가 설명을 잘못하니... 코드에서 보자면...

 

간단하게 lstm모델 설정을 먼저하고...

import torch
import torch.autograd as autograd
import torch.nn as nn
import torch.functional as F
import torch.optim as optim

rnn = nn.LSTM(5, 10, 2)
h0 = torch.randn(2, 1, 10)
c0 = torch.randn(2, 1, 10)

nn.LSTM(input dimension, output layer dimension, layer count)

h0, c0은 lstm안에서 사용되는 매개변수같고

 

이제 input을 보자면

input = torch.randn(4, 1, 5)
output, (hn, cn) = rnn(input, (h0, c0))
print('input', input)
print('output', output)

torch.randn(3차원개수, 2차원 개수, 1차원 개수) *참고로 인자를 붙일수록 차원개수가 늘어남(Ex. torch.randn(4,1,2,3, ...,1))

lstm의 input은 3차원인거같다

 

따라서 위코드대로 넣는다면 결과는 다음과 같다

#input tensor([[[-0.3462,  0.0152, -2.2125, -0.4508, -0.8244]],
#        [[-0.2912,  0.4213,  1.4112, -0.3454, -1.2736]],
#        [[ 0.7223, -0.7976,  1.6597, -1.1539,  0.2208]],
#        [[-1.0504, -0.1451, -0.4546,  0.6491, -0.7236]]])
        
#output tensor([[[ 0.2834, -0.1347,  0.1493, -0.2070, -0.1598,  0.2677, -0.0834,
#          -0.4846, -0.1101,  0.1728]],
#        [[ 0.2768, -0.0874,  0.0042, -0.2604, -0.0232,  0.2117,  0.0501,
#          -0.4346, -0.0733,  0.2169]],
#        [[ 0.2799, -0.0477, -0.0402, -0.0743, -0.0024,  0.1773,  0.1031,
#          -0.3427, -0.0769,  0.2235]],
#        [[ 0.3036, -0.0549, -0.0528,  0.0383,  0.0037,  0.1468,  0.1405,
#          -0.2628, -0.0782,  0.2296]]], grad_fn=<StackBackward>)

input의 1차원 dimension을 5로 설정 (nn.LSTM(510, 2))

output의 dimension을 10으로 설정(nn.LSTM(5, 10, 2)해서 1차원에서 10개의 인자가 나오게된다.

 

또한, RNN, LSTM은 input의 길이에 상관없으니까 torch.randn([빈칸], 1, 5) 빈칸 값을 마음대로 설정해도 된다.

만일 2로 설정하면

#input tensor([[[-1.0019,  0.4757, -1.0311,  0.0879,  0.2766]],
#        [[ 0.0249, -0.8118, -0.5669, -0.6752,  0.4118]]])

#output tensor([[[ 0.2795, -0.1330,  0.1422, -0.2022, -0.1792,  0.2493, -0.0728,
#          -0.4580, -0.1166,  0.1742]],\
#        [[ 0.2658, -0.0686,  0.0109, -0.2321, -0.0399,  0.1842,  0.0442,
#          -0.3888, -0.0956,  0.2071]]], grad_fn=<StackBackward>)

이렇게 LSTM의 모델을 수정안해도 자동으로 output이 바뀌게된다.

 

만일 위에서말한 LSTM의 many to one을 사용한다하면 output의 마지막 차원만 뽑아서 fc(fully connected) 레이어를 사용하면 된다.

즉, output[-1] 만 쓰면된당

반응형