IRIS 데이터 셋 활용 - 딥러닝 모델 개선시키기(2) - 더 깊은 신경망 사용
# 01. 라이브러리 불러오기 import seaborn as sns import torch import torch.nn as nn import torch.optim as optim from sklearn.model_selection import train_test_split from torch.utils.data import DataLoader, TensorDataset # 02. 데이터 로드하기 # IRIS 데이터셋 로드 iris = sns.load_dataset('iris') # 선택한 두 가지 특징과 라벨 추출 features = iris[['sepal_length', 'petal_length']].values labels = iris['species'].astype('category').cat.codes.values # 데이터를 훈련 세트와 테스트 세트로 분할 X_train, X_test, y_train, y_test = train_test_split(features, labels, test_size=0.2, random_state=42) # PyTorch 텐서로 변환 X_train = torch.FloatTensor(X_train) X_test = torch.FloatTensor(X_test) y_train = torch.LongTensor(y_train) y_test = torch.LongTensor(y_test) # DataLoader 생성 train_loader = DataLoader(TensorDataset(X_train, y_train), batch_size=16, shuffle=True) test_loader = DataLoader(TensorDataset(X_test, y_test), batch_size=16) print(type(train_loader), type(test_loader)) ### 03. 모델 정의하기 class DeeperNN(nn.Module): def __init__(self): super(DeeperNN, self).__init__() self.fc1 = nn.Linear(2, 16) # 입력 차원이 2, 첫 번째 은닉층의 노드 수가 64 self.fc2 = nn.Linear(16, 32) # 두 번째 은닉층의 노드 수가 32 self.fc3 = nn.Linear(32, 16) # 추가된 세 번째 은닉층의 노드 수가 16 self.fc4 = nn.Linear(16, 3) # 출력층의 노드 수가 3 (IRIS 클래스 수) def forward(self, x): x = torch.relu(self.fc1(x)) x = torch.relu(self.fc2(x)) x = torch.relu(self.fc3(x)) x = self.fc4(x) return x # 모델 인스턴스 생성 model = DeeperNN() ### 04. 모델 학습하기 criterion = nn.CrossEntropyLoss() optimizer = optim.Adam(model.parameters(), lr=0.01) def train(model, train_loader, criterion, optimizer, epochs=100): model.train() for epoch in range(epochs): for data, target in train_loader: optimizer.zero_grad() output = model(data) loss = criterion(output, target) loss.backward() optimizer.step() if (epoch+1) % 10 == 0: print(f'Epoch {epoch+1}, Loss: {loss.item():.4f}') train(model, train_loader, criterion, optimizer) ### 05. 모델 평가하기 def test(model, test_loader, criterion): model.eval() test_loss = 0 correct = 0 with torch.no_grad(): for data, target in test_loader: output = model(data) test_loss += criterion(output, target).item() pred = output.argmax(dim=1, keepdim=True) correct += pred.eq(target.view_as(pred)).sum().item() test_loss /= len(test_loader.dataset) print(f'\nTest set: Average loss: {test_loss:.4f}, Accuracy: {correct}/{len(test_loader.dataset)} ({100. * correct / len(test_loader.dataset):.0f}%)') test(model, test_loader, criterion) # 기타 개선 아이디어 # 최적화 알고리즘과 학습률 조정 - PyTorch에서는 torch.optim.lr_scheduler를 사용 # 데이터 전처리 - 정규화 또는 표준화, 데이터 증강 # 교차 검증 사용 - 모델의 일반화 능력을 더 잘 평가하기 위해 k-겹 교차 검증을 사용
기본 미션
레벨업 미션
* 성실한 태도, 작은 나의 땀과 노력이 모여 미래를 만듭니다. 정직, 성실 소중한 가치