• 카테고리

    질문 & 답변
  • 세부 분야

    딥러닝 · 머신러닝

  • 해결 여부

    미해결

텐서데이터 만들기 코드 관련 문의

22.08.10 11:12 작성 조회수 154

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

메시림님의 프로필

메시림

질문자

2022.09.02

RMSE코드도 변경을 해줘야 하는 것인가요?

RMSE 를 기존 코드 그대로 두고 하니 오류가 뜹니다.

 

오류 내용은 이해는 했는데, 어떤 부분을 수정해줘야 하는 것인지는 잘 모르겠어서 질문드립니다.

[오류 내용]

y_true and y_pred have different number of output (1!=3)

0

메시림님의 프로필

메시림

질문자

2022.08.10

답변 감사합니다.

알려주신대로 코드 적용하고 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))

out.shape, target.shape  확인하셔서 사이즈 맞춰주세요!

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개이므로 그래프를 어떻게 그리실 것인지 기준을 정해야합니다.

 

감사합니다.

메시림님의 프로필

메시림

질문자

2022.08.18

안녕하세요.

 

위에 답변 주셨던  "2. def seq_data내의 for문을 len(x)-sequence_length-3 까지 돌리셔야 합니다." 관련해서, 제가 좀 이해가 안되는데, for문을 왜 len(x)-sequence_length-3 까지 돌리는 것인지 상세히 설명해주실 수 있을까요??

 

메시림님의 프로필

메시림

질문자

2022.08.18

안녕하세요.

 

모델 아웃풋 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 입니다.

3일치 예측 결과가 나왔으므로 당연히 예측값들이 같은 날짜에 중첩하게 됩니다. 여기서 특별한 규칙이 없기 때문에 원하시는 기준을 정해서 그리시면 됩니다 :)

메시림님의 프로필

메시림

질문자

2022.09.15

안녕하세요.

그래프를 그리고 있는데, 계속 중첩되게 그려지네요… 해결이 잘 되지 않는데, 중첩되지 않게 그리려면 강사님 코드에서 어떤 부분을 수정하면 될지 조언 부탁드려도 될까요??