코드 7-35 LSTM 셀의 전반적인 네트워크
class LSTMModel(nn.Module):
def __init__(self, input_dim, hidden_dim, layer_dim, output_dim, bias=True):
super(LSTMModel, self).__init__()
self.hidden_dim = hidden_dim ------ 은닉층의 뉴런/유닛 개수
self.layer_dim = layer_dim
self.lstm = LSTMCell(input_dim, hidden_dim, layer_dim) ------ ①
self.fc = nn.Linear(hidden_dim, output_dim)
def forward(self, x):
if torch.cuda.is_available(): ------ GPU 사용 유무 확인
h0 = Variable(torch.zeros(self.layer_dim, x.size(0), self.hidden_dim).cuda()) ------(은닉층의 계층 개수, 배치 크기, 은닉층의 뉴런 개수) 형태를 갖는 은닉 상태를 0으로 초기화
else:
h0 = Variable(torch.zeros(self.layer_dim, x.size(0), self.hidden_dim))
if torch.cuda.is_available(): ------ GPU 사용 유무 확인
c0 = Variable(torch.zeros(self.layer_dim, x.size(0), self.hidden_dim).cuda()) ------ (은닉층의 계층 개수, 배치 크기, 은닉층의 뉴런 개수) 형태를 갖는 셀 상태를 0으로 초기화
else:
c0 = Variable(torch.zeros(self.layer_dim, x.size(0), hidden_dim))
outs = []
cn = c0[0,:,:] ------ (은닉층의 계층 개수, 배치 크기, 은닉층의 뉴런 개수) 크기를 갖는 셀 상태에 대한 텐서
hn = h0[0,:,:] ------ (은닉층의 계층 개수, 배치 크기, 은닉층의 뉴런 개수) 크기를 갖는 은닉 상태에 대한 텐서
for seq in range(x.size(1)): ------ LSTM 셀 계층을 반복하여 쌓아 올립니다.
hn, cn = self.lstm(x[:,seq,:], (hn,cn)) ------ 은닉 상태(hn)와 셀 상태를 LSTMCell에 적용한 결과를 또다시 hn, cn에 저장
outs.append(hn)
out = outs[-1].squeeze()
out = self.fc(out)
return out