메뉴 건너뛰기

목록
2022.11.23 20:59

확인용

profile
조회 수 24 댓글 2 예스잼 0 노잼 0

No Attached Image

import torch
import torch.optim as optim
import torch.nn as nn
import numpy as np
import pandas as pd
from torch.utils.data import DataLoader, TensorDataset
from sklearn.preprocessing import MinMaxScaler
 
import matplotlib.pyplot as plt
 
torch.manual_seed(0)
 
device = torch.device("cuda:0" if torch.cuda.is_available()
                      else "cpu")
 
seq_length = 7
data_dim = 8
hidden_dim = 10
output_dim = 1
learning_rate = 0.01
epochs = 500
batch_size = 100
 
def build_dataset(data, seq_len):
    dataX = []
    dataY = []
    for i in range(len(data)-seq_len):
        x = data[i:i+seq_len, :]
        y = data[i+seq_len, [-1]]
        dataX.append(x)
        dataY.append(y)
    return np.array(dataX), np.array(dataY)
 
df = pd.read_csv('------------')
 
df = df[::-1]
df = df[['입맛에 맞게 고치세요']]
 
train_size = int(len(df)*0.7)
train_set = df[0:train_size]
test_set = df[train_size-seq_length:]
 
scaler_x = MinMaxScaler()
scaler_x.fit(train_set.iloc[:,:-1])
 
train_set.iloc[:,:-1] = scaler_x.transform(train_set.iloc[:,:-1])
test_set.iloc[:,:-1] =scaler_x.transform(test_set.iloc[:,:-1])
 
scaler_y = MinMaxScaler()
scaler_y.fit(train_set.iloc[:,[-1]])
 
trainX, trainY = build_dataset(np.array(train_set), seq_length)
testX, testY = build_dataset(np.array(test_set), seq_length)
 
trainX_tensor = torch.LongTensor(trainX).to(device)
trainY_tensor = torch.LongTensor(trainY).to(device)
 
testX_tensor = torch.LongTensor(testX).to(device)
testY_tensor = torch.LongTensor(testY).to(device)
 
dataset = TensorDataset(trainX_tensor, trainY_tensor)
 
dataloader = DataLoader(dataset,
                        batch_size=batch_size,
                        shuffle=False,
                        drop_last=True)
 
class LSTM(nn.Module):
    def __init__(self, input_dim, hidden_dim, seq_len, output_dim, layers):
        super(LSTM, self).__init__()
        self.hidden_dim = hidden_dim
        self.seq_len = seq_len
        self.output_dim = output_dim
        self.layers = layers
        self.lstm = nn.LSTM(input_dim, hidden_dim, num_layers=layers,
                            batch_first=True)
        self.fc = nn.Linear(hidden_dim, output_dim, bias=True)
    def reset_hidden_state(self):
        self.hidden = (
            torch.zeros(self.layers, self.seq_len, self.hidden_dim),
            torch.zeros(self.layers, self.seq_len, self.hidden_dim)            
        )
   
    def forward(self, x):
        x, _status = self.lstm(x)
        x = self.fc(x[:,-1])
        return x;
LSTM = LSTM(data_dim, hidden_dim, seq_length, output_dim, 1).to(device)
 
def train_model(mode, train_df, epochs=None, lr=None, verbose=10,
                patience=10):
    criterion = nn.MSELoss().to(device)
   
    optimizer = optim.Adam(model.parameters(), lr=learning_rate)
 
    train_hist = np.zeros(epochs)
    for epoch in range(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()
           
            outputs =model(x_train)
           
            loss = criterion(outputs, y_train)
            optimizer.zero_grad()
            loss.backward()
            optimizer.step()
           
            avg_cost += loss/total_batch
        train_hist[epoch] = avg_cost
       
        if epoch%verbose==0:
            print('Epoch: ', '%04d' % (epoch),
                  'train loss : ', '{:.4f}'.format(avg_cost))
         
        if(epoch%patience==0) % (epoch):
            if train_hist[epoch-patience] < train_hist[epoch]:
                print('\n Early Stopping')
                break
        return model.eval(), train_hist
   
model, train_hist = train_model(LSTM, dataloader, epochs=epochs,
                                lr=learning_rate, verbose=20, patience=10)

with torch.no_grad():
    pred = []
    for pr in range(len(testX_tensor)):
        model.reset_hidden_state()
       
        predicted = model(torch.unsqueeze(testX_tensor[pr], 0))
        predicted = torch.flatten(predicted).item()
        pred.append(predicted)
       
    pred_inverse = scaler_y.inverse_transform(np.array(pred).reshape(-1,1))
    testY_inverse = scaler_y.inverse_transform(testY_tensor)
def MAE(true, pred):
    return np.mean(np.abs(true-pred))
print('MAE SCORE: ',MAE(pred_inverse, testY_inverse))
 
length = len(test_set)
target = np.array(test_set)[length-seq_length:]
 
target = torch.LongTensor(target)
target = target.reshape([1,seq_length, data_dim])
 
out = model(target)
pre = torch.flattern(out).item()
 
pre = round(pre, 8)
pre_inverse = scaler_y.inverse_transform(np.array(pre).reshape(-1,1))
print(pre_inverse.reshape([3])[0])

List of Articles
번호 제목 글쓴이 날짜 조회 수 추천
공지 수용소닷컴 이용약관 file asuka 2020.05.16 1310 1
1108 대학생 때 세웠던 목표를 이뤘음 7 file 마루쉐 2021.09.14 188 10
1107 오늘 한 프로젝트: 그래픽 광량 표현 12 file 우지챠 2021.01.05 245 8
1106 키 마우스 매핑 프로그램 만들었음 10 file '`' 2022.08.30 206 6
1105 아두이노 공부 fnd 편 4 file 코르캐쉬 2022.05.05 122 6
1104 서버 3대 렌탈함 4 file 만년필 2021.07.18 110 6
1103 정보) 수용서의 기본소양 1편, 짤검색에 대해서 araboji. 8 file 하루각하 2021.01.06 233 6
1102 좆본 IT 취업 가이드 ~ 간략판 ~ 9 抱き枕 2020.07.22 243 6
1101 노트북 정보 모음 13 file 으ㅇ유ㅏ」 2021.12.14 155 5
1100 오늘자 리팩터링 9 file 마루쉐 2021.01.03 171 5
1099 올해 프로그래머로서 제 목표 1 마루쉐 2023.01.04 52 4
1098 이거 키트 절대 사지 마라 12 file 삼육두유 2022.10.10 109 4
1097 우흥 4 file 삼육두유 2021.09.23 108 4
1096 잡아도 잡아도 끊임없이 나오는 버그 2 file 머스크멜론 2021.09.11 96 4
1095 초간단 js 추첨기 4 하야한아이 2021.04.07 126 4
1094 개좆소 이벤트 추첨기 구상 6 스마일 2020.07.17 126 4
1093 UPS 2종 비교 (델타 N-1K, APC SMT750iC) 5 file 만년필 2021.08.29 158 3
1092 swift enum을 활용한 코드 수정 1 file 마루쉐 2021.03.10 69 3
1091 2024년도 기사, 산업기사 시험 일정 및 주요 변경사항 2 file 말랑이 2023.12.29 78 2
1090 그리드 2022.12.06 13 2
1089 이것저것 쓸만한 사이트 2 5 file 저능아 2022.11.22 32 2
목록
Board Pagination Prev 1 2 3 4 5 6 7 8 9 10 ... 56 Next
/ 56