더북(TheBook)

torch.reshape은 텐서의 형태를 바꿀 때 사용하며, 훈련 데이터셋(X_train_tensors)의 형태(200, 5)를 (200, 1, 5)로 변경하겠다는 의미입니다.

다음은 훈련, 테스트 데이터셋의 형태가 변경된 결과입니다.

Training Shape torch.Size([200, 1, 5]) torch.Size([200, 1])
Testing Shape torch.Size([53, 1, 5]) torch.Size([53, 1])

이와 같이 데이터셋의 형태를 변경하는 이유는 LSTM 네트워크의 입력 형태와 맞추기 위함입니다.

이제 LSTM 모델의 네트워크를 구성해 봅니다.

코드 7-47 LSTM 네트워크

class LSTM(nn.Module):
    def __init__(self, num_classes, input_size, hidden_size, num_layers, seq_length):
        super(LSTM, self).__init__()
        self.num_classes = num_classes ------ 클래스 개수
        self.num_layers = num_layers ------ LSTM 계층의 개수
        self.input_size = input_size ------ 입력 크기로 훈련 데이터셋의 칼럼 개수를 의미
        self.hidden_size = hidden_size ------ 은닉층의 뉴런 개수
        self.seq_length = seq_length ------ 시퀀스 길이

        self.lstm = nn.LSTM(input_size=input_size, hidden_size=hidden_size, num_layers=num_layers, batch_first=True) ------ LSTM 계층
        self.fc_1 = nn.Linear(hidden_size, 128) ------ 완전연결층
        self.fc = nn.Linear(128, num_classes) ------ 출력층
        self.relu = nn.ReLU()

    def forward(self,x):
        h_0 = Variable(torch.zeros(self.num_layers, x.size(0), self.hidden_size)) ------ 은닉 상태를 0으로 초기화
        c_0 = Variable(torch.zeros(self.num_layers, x.size(0), self.hidden_size)) ------ 셀 상태를 0으로 초기화
        output, (hn, cn) = self.lstm(x, (h_0, c_0)) ------ LSTM 계층에 은닉 상태와 셀 상태 적용
        hn = hn.view(-1, self.hidden_size) ------ 완전연결층 적용을 위해 데이터의 형태 조정(1차원으로 조정)
        out = self.relu(hn)
        out = self.fc_1(out)
        out = self.relu(out)
        out = self.fc(out)
        return out
신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.