keras 버젼은 아래를 참조
[deep learning] 1. Combined Cycle Power Plant (keras 버젼)
목적과거 발전소에서의 조건 [AT: 시간당 평균 온도] [V: 배기진공] [AP: 주위 압력] [RH: 습도] 에 따라 출력 [PE] 데이터를 학습하므로써 새로운 조건에 따라서 예상 출력을 예측하는 모델의 구축.데
eldercoder.tistory.com
1. 라이브러리 인스톨
|
pip install torch
pip install openpyxl
pip install scikit-learn pip install pandas pip install numpy |
2. 임포트
|
import numpy as np
import pandas as pd
from sklearn.preprocessing import MinMaxScaler
from sklearn.model_selection import train_test_split
import torch
import torch.nn as nn
import torch.optim as optim
from torch.utils.data import DataLoader, TensorDataset
import matplotlib.pyplot as plt
|
3. 데이터 조작 (keras와 동일)
|
file_path = 'https://raw.githubusercontent.com/billcary/uci_combined_cycle_power_plant/master/data/Folds5x2_pp.xlsx'
df = pd.read_excel(file_path, sheet_name='Sheet1')
# 학습데이터와 정답을 분리 X, Y = df[ ["AT", "V", "AP", "RH"] ], df["PE"] Y = Y.values.reshape(-1,1) # 정규화 scaler = MinMaxScaler() X_new = scaler.fit_transform(X) target_scaler = MinMaxScaler() Y_new = target_scaler.fit_transform(Y) # 훈련용과 테스트용을 분리 X_train, X_test, Y_train, y_test = train_test_split(X_new, Y_new, test_size=0.4, random_state=333) |
4. PyTorch Tensor로 변환 (핵심 단계)
numpy array를 torch tensor로 바꾸고, 연산을 위해 float32 타입으로 지정합니다.
|
X_train_tensor = torch.tensor(X_train, dtype=torch.float32)
Y_train_tensor = torch.tensor(Y_train, dtype=torch.float32)
X_test_tensor = torch.tensor(X_test, dtype=torch.float32)
Y_test_tensor = torch.tensor(Y_test, dtype=torch.float32)
|
5. DataLoader 생성 (Keras의 batch_size 역할)
| dataset = TensorDataset( X_train_tensor, Y_train_tensor) loader = DataLoader(dataset, batch_size=32, shuffle=True) |
6. 모델 정의
pytorch에서는 nn.Module 을 상속받아서
def __init__(self, input_dim) 에서 부모클래스의 초기화를 호출 한 후 모델을 정의
def forward(self, x) 를 반드시 정의하여 자동으로 호출 되는 형태이다.
|
class Regressor(nn.Module):
def __init__(self, input_dim):
super(Regressor, self).__init__()
self.model = nn.Sequential(
nn.Linear(input_dim, 3), # 첫 번째 Dense(3)
nn.Linear(3, 1) # 두 번째 Dense(1)
)
def forward(self, x):
return self.model(x)
|
7. 모델의 인스턴스화와 input_dim 의 정의
|
input_dim = X_train.shape[1]
model = Regressor(input_dim)
|
8. 최적화방법(optimizer) 와 로스함수(loss) 정의 (※ keras 버젼의 10 번)
|
criterion = nn.MSELoss()
optimizer = optim.SGD(model.parameters(), lr=0.01)
|
9. 학습 (※ keras 버젼의 11 번)
pytorch의 경우는 epoch 로직을 직접 정의
|
# 학습 루프 (Keras의 model.fit 역할)
loss_history = [] # keras 의 history 역할
epochs = 50
for epoch in range(epochs):
epoch_loss = 0.0
for batch_x, batch_y in loader:
# 경사소멸 초기화
optimizer.zero_grad()
# 순전파 (Forward)
outputs = model(batch_x)
loss = criterion(outputs, batch_y)
# 역전파 (Backward) 및 가중치 업데이트
loss.backward()
optimizer.step()
epoch_loss += loss.item()
avg_loss = epoch_loss / len(loader)
loss_history.append(avg_loss)
if (epoch+1) % 10 == 0:
print(f'Epoch [{epoch+1}/{epochs}], Loss: {avg_loss:.4f}')
|
10. 학습결과 분석
|
plt.figure(figsize=(10, 6))
plt.plot(range(1, epochs + 1), loss_history, 'b-', label='Training Loss')
plt.title('Training Loss (PyTorch)')
plt.xlabel('Epochs')
plt.ylabel('Loss')
plt.legend()
plt.show()
|
