메뉴 건너뛰기

목록
2022.11.23 20:59

확인용

profile
조회 수 130 댓글 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 4479 1
288 쿠르스칼 알고리즘 1 그리드 2022.11.15 74 0
287 HTTP 2.0과 3.0의 차이 2 그리드 2022.11.16 83 0
286 시밫 캡스톤 못하겟다 7 그리드 2022.11.17 41 0
285 그... 그... 그... 3 그리드 2022.11.18 52 0
284 딱 한잔 마시고 그리드 2022.11.19 44 0
283 긴급하게 패스트캠퍼스 CV활용과 2 file 그리드 2022.11.19 87 0
282 항공사진에서 적용할 효과 2 그리드 2022.11.21 113 0
281 수요일엔 이거나 들어보는데수 1 그리드 2022.11.21 47 0
280 아두이노 코스 그리드 2022.11.21 45 0
279 그냥 막 적어봄 1 그리드 2022.11.21 49 0
278 도트연산자, 화살표연산자를 3 그리드 2022.11.22 61 0
277 이것저것 쓸만한 사이트 2 5 file 저능아 2022.11.22 99 2
276 UV-C LED 그리드 2022.11.23 65 0
275 항공지도 이미지 처리방법의 예상순서 그리드 2022.11.23 122 0
274 이더리움 일간 가격 데이터셋 만들기 그리드 2022.11.23 69 0
273 그리드 2022.11.23 45 0
» 확인용 2 그리드 2022.11.23 130 0
271 일요일까지는 딥러닝 논문보다가 2 그리드 2022.11.26 88 0
270 소프트웨어 공학 책 그리드 2022.11.28 45 0
269 또 파이썬 공부 1 file 그리드 2022.11.28 61 0
목록
Board Pagination Prev 1 ... 41 42 43 44 45 46 47 48 49 50 ... 60 Next
/ 60

Sketchbook5, 스케치북5

Sketchbook5, 스케치북5