작성
·
295
0
안녕하세요.
아래 시퀀스데이터 만들 때 sequence_length 5일로 다음날 1일을 예측하는 것인데, 만약 5일로 3일을 예측하려고 하면 아래와 같이 변경하면 되나요?
기존 : y_seq.append(y[i+sequence_length])
변경 : y_seq.append(y[i+sequence_length+2])
[강사님 코드]
def seq_data(x, y, sequence_length):
x_seq = []
y_seq = []
for i in range(len(x)-sequence_length):
x_seq.append(x[i:i+sequence_length])
y_seq.append(y[i+sequence_length])
return torch.FloatTensor(x_seq).to(device), torch.FloatTensor(y_seq).to(device).view([-1, 1])
split = 200
sequence_length = 5
x_seq, y_seq = seq_data(X, y, sequence_length)
x_train_seq = x_seq[:split]
y_train_seq = y_seq[:split]
x_test_seq = x_seq[split:]
y_test_seq = y_seq[split:]
print(x_train_seq.size(), y_train_seq.size())
print(x_test_seq.size(), y_test_seq.size())
답변 3
0
RMSE코드도 변경을 해줘야 하는 것인가요?
RMSE 를 기존 코드 그대로 두고 하니 오류가 뜹니다.
오류 내용은 이해는 했는데, 어떤 부분을 수정해줘야 하는 것인지는 잘 모르겠어서 질문드립니다.
[오류 내용]
y_true and y_pred have different number of output (1!=3)
0
답변 감사합니다.
알려주신대로 코드 적용하고 taining 을 하는데, 아래와 같은 에러메시지가 뜹니다.
"The size od tensor a(3) must match the size of tensor b(2) at non-singleton dimension 1"
아래 강사님 코드이며, bold 부분를 수정해야 할 것으로 보이는데, 어떤 오류 때문인지 혹시 알 수 있을까요?
loss_graph = []
n = len(train_loader)
for epoch in range(num_epochs):
running_loss = 0.0
for data in train_loader:
seq, target = data # 배치 데이터
out = model(seq)
loss = criterion(out, target)
optimizer.zero_grad()
loss.backward()
optimizer.step()
running_loss += loss.item()
loss_graph.append(running_loss/n)
if epoch % 100 == 0:
print('[epoch: %d] loss: %.4f' %(epoch, running_loss/n))
0
안녕하세요.
i+sequence_length+2 는 i+sequence_length+2 번째를 저장하겠다는 의미입니다. 즉, +2 하셨으니 기존의 인덱스에서 2만큼 뒤 쪽 데이터를 저장한다는 의미이므로 타겟값이 하나가 되고 3일 뒤를 예측한다는 의미가 됩니다.
타겟값을 3개로 변경하실 경우에는 다음과 같은 부분을 수정하셔야 합니다.
1. 위에서 언급한 리스트 내의 인덱스를 i+sequence_length:i+sequence_length+3 으로 변경하셔야 합니다.
2. def seq_data내의 for문을 len(x)-sequence_length-3 까지 돌리셔야 합니다.
3. return 값의 view도 [-1,3]으로 변경하셔야 합니다.
4. LSTM의 마지막 노드 개수도 3으로 변경하셔야 합니다.
5. 마지막으로 모델의 아웃풋이 3개이므로 그래프를 어떻게 그리실 것인지 기준을 정해야합니다.
감사합니다.
안녕하세요.
위에 답변 주셨던 "2. def seq_data내의 for문을 len(x)-sequence_length-3 까지 돌리셔야 합니다." 관련해서, 제가 좀 이해가 안되는데, for문을 왜 len(x)-sequence_length-3 까지 돌리는 것인지 상세히 설명해주실 수 있을까요??
안녕하세요.
모델 아웃풋 3개에 대한 그래프를 그릴 때, 아래와 같이 변경하면 되는 걸까요?
기존 코드로 plot을 그리니 prediction 선이 3일 뒤로 밀려서 나와서 아래와 같이 +3을 넣으니 밀리지 않게 그려지더라구요.
기존 : plotting(train_loader, test_loader, df['Close'][sequence_length:].values)
변경 : plotting(train_loader, test_loader, df['Close'][sequence_length+3:].values)
[강사님 코드]
def plotting(train_loader, test_loader, actual):
with torch.no_grad():
train_pred = []
test_pred = []
for data in train_loader:
seq, target = data # 배치 데이터
#print(seq.size())
out = model(seq)
train_pred += out.cpu().numpy().tolist()
for data in test_loader:
seq, target = data # 배치 데이터
#print(seq.size())
out = model(seq)
test_pred += out.cpu().numpy().tolist()
total = train_pred+test_pred
plt.figure(figsize=(20,10))
plt.plot(np.ones(100)*len(train_pred),np.linspace(0,1,100),'--', linewidth=0.6)
plt.plot(actual,'--')
plt.plot(total,'b', linewidth=0.6)
plt.legend(['train boundary','actual','prediction'])
plt.show()
plotting(train_loader, test_loader, df['Close'][sequence_length:].values)
데이터의 가장 마지막 인덱스 len(x)-sequence_length-1을 i+sequence_length+3 여기에 넣어보시면 len(x)+2가 나옵니다. 즉, 데이터의 개수 len(x)보다 2가 더 많이 나오기때문에 -2를 빼주셔야 합니다. 제가 착각 했었네요. len(x)-sequence_length-3이 아니고 len(x)-sequence_length-2 입니다.
안녕하세요.
그래프를 그리고 있는데, 계속 중첩되게 그려지네요… 해결이 잘 되지 않는데, 중첩되지 않게 그리려면 강사님 코드에서 어떤 부분을 수정하면 될지 조언 부탁드려도 될까요??
out.shape, target.shape 확인하셔서 사이즈 맞춰주세요!