안녕하세요. 딥러닝을 공부하고 있는 한 대학원생입니다.
lstm 기법을 활용하여 데이터를 예측하면 연구에 도움이 될 것 같아 인터넷 검색을 통해 코드를 작성하고 있는 중인데, 몇 가지 문제가 생겨서 전문가분들의 도움을 요청드리고 싶습니다.
시간 순으로 나열된 데이터이고, 총 6차원 (입력 5차원, 결과값 1차원) 의 데이터셋입니다.
데이터셋을 모델에 올려 normalize와 텐서화는 제가 확인해봤을 땐 정상적으로 동작하는 것으로 확인하였습니다.
제 코드는 아래와 같습니다.
def train_model(model, train_df, num_epochs = None, lr = None, verbose = 20, patience = 10):
criterion = nn.MSELoss(reduction='sum')
optimizer = optim.Adam(model.parameters(), lr = learning_rate)
nb_epochs = num_epochs
train_hist = np.zeros(nb_epochs)
for epoch in range(nb_epochs):
avg_cost = 0
total_batch = len(train_df)
for batch_idx, samples in enumerate(train_df):
x_train, y_train = samples
model.reset_hidden_state()
# H(x)
outputs = model(x_train)
# cost
loss = criterion(outputs, y_train)
optimizer.zero_grad()
loss.backward()
optimizer.step()
avg_cost += loss / total_batch
train_hist[epoch] = avg_cost
torch.autograd.set_detect_anomaly(True)
if epoch % verbose == 0:
print('Epoch: ', '%03d' % (epoch), 'train loss : ', '{: .4f}'.format(avg_cost))
if (epoch % patience == 0) & (epoch != 0):
if train_hist[epoch-patience] < train_hist[epoch]:
print('\nEarly Stopped')
break
return model.eval(), train_hist
위 코드에서 batch_idx가 점점 커지다가 62를 지나는 시점부터 avg_cost 값이 nan으로 출력됩니다. 뭐가 문제인지 확인해보려고 autograd.set_detect_anomaly를 사용하여 확인해보니
Function 'MSELossBackward0' returned nan values in its 0th output 이라고 나타납니다.
따라서 최종적으로 train_hist[epoch] 에 nan 값이 들어가게 되며, 터미널 창에 출력되는 값은 epoch가 0부터 nan으로 뜨는 것으로 나옵니다.
제 데이터셋을 입력받는 코드는 아래와 같습니다. 혹시 여기에 문제가 있을 수도 있다고 생각이 듭니다.
def build_dataset(time_series, seq_length):
dataX = []
dataY = []
for i in range(0, len(time_series) - seq_length):
_x = time_series[i:i + seq_length, :]
_y = time_series[i + seq_length, [-1]]
#print(_x, "-->", _y)
dataX.append(_x)
dataY.append(_y)
return np.array(dataX), np.array(dataY)
# 데이터셋 생성
trainX, trainY = build_dataset(np.array(train_set), seq_length)
testX, testY = build_dataset(np.array(test_set), seq_length)
# 텐서로 변환
trainX_tensor = torch.FloatTensor(trainX)
trainY_tensor = torch.FloatTensor(trainY)
testX_tensor = torch.FloatTensor(testX)
testY_tensor = torch.FloatTensor(testY)
# 텐서 형태로 데이터 정의
dataset = TensorDataset(trainX_tensor, trainY_tensor)
# 데이터로더는 기본적으로 2개의 인자를 입력받으며 배치크기는 통상적으로 2의 거듭제곱으로 설정
dataloader = DataLoader(dataset, batch_size = batch, shuffle=True, drop_last=True)
데이터 csv 파일의 형태는 시간 축 없이 5개의 입력에 대한 1개의 출력 으로 총 6열이며, 11400행의 형태입니다.
전문가분들의 도움을 부탁드립니다. 몇 일 째 이 부분에서 막혀서 해결을 못하고 있는 중입니다..