Pytorch

[파이토치] 모델 만들기

왕초보코딩러 2024. 12. 15. 20:03
728x90

Pytorch 라이브러리 임포트

import torch

# 모델을 만들기 위해
import torch.nn as nn

 

gpu 확인

torch.cuda.is_available()

모델 만들기

1. nn.Sequential 이용

2. nn.Module을 상속받는 클래스 이용

 

 

두 가지 방법을 사용하여

이진분류 모델을 만들어보겠습니다(이진분류는 아웃풋이 1개)

인풋은 4개, 활성화 함수는 ReLU를 사용하겠습니다.

nn.Linear(), nn.ReLU() 사용

 

모델 구조

4 -> 128 -> 64 -> 1


1. nn.Sequential 이용

순차적으로 쌓아서 만드는 방법

간단한 신경망 아키텍처 만들 때 사용한다

 

# 선형으로 = fully connected
model = nn.Sequential(
    nn.Linear(4,128),     # 인풋은 4개(데이터의 피처가 4개) 아웃풋은 128개
    nn.ReLU(),            # 128개 모두에 활성화 함수 거침
    nn.Linear(128,64),    # 인풋은 128개 아웃풋은 64
    nn.ReLU(),            # 64개 모두에 활성화 함수 거침
    nn.Linear(64,1)       # 인풋은 64개 아웃풋은 1개        
)

 

 

만들어진 모델 아키텍처 확인

model

 

모델의 각 층 보기

model[0]

 


2. nn.Module을 상속받는 클래스 이용

nn.Sequential보다 더 복잡한 모델을 만들 때 사용

커스텀 레이어나 복잡한 순전파 과정이 필요할 경우에 사용

 

 

nn.Module을 상속받는 클래스를 생성한다

__init__ 생성자와

forward 순전파를 위한 메소드를 만든다.

# nn.Module 상속 받음. nn.Module의 기능을 내 것처럼 사용하겠다

class Net(nn.Module):
    # 생성자 만들기
    def __init__(self):
        # 부모 클래스(nn.Module)의 생성자를 호출
        # (Net: 다중 상속에서 올바른 초기화를 보장)
        # (self: 현재 인스턴스를 부모 클래스에 전달)
        super(Net, self).__init__()

        # 변수 쓸 거라고 선언만 한 상태
        self.fc1 = nn.Linear(4, 128)
        self.fc1_act = nn.ReLU()
        self.fc2 = nn.Linear(128, 64)
        self.fc2_act = nn.ReLU()
        self.fc3 = nn.Linear(64, 1)

    # 순전파
    def forward(self, x): # input 값 (배치 수, 인풋 레이어 퍼셉트론 수)
        x = self.fc1(x)
        x = self.fc1_act(x)
        x = self.fc2(x)
        x = self.fc2_act(x)
        x = self.fc3(x)
        return x # 에측된 값

 

인스턴스 생성

model = Net()
model

 

 

모델의 각 층 보기

model.이름


nn.Module로 만든 model을 통해 확인해보겠습니다.

 

 

모델이 가진 파라미터 뽑기

model.parameters()

 

리스트로 바꿔서 보기

list(model.parameters())

각 층의 파라미터 값(weight, bias)들이 쭉 나온다

 

 

model.named_parameters 사용

named_parameters(): 모델의 이름파라미터를 반환

# fc1, fc2, fc3의 가중치와 편향 활성화함수는 가중치 필요 X
for name, parm in model.named_parameters():
    print(name)

 

 

파라미터 보기

# 64 -> 1
model.fc3.weight.shape

model.fc3.bias.shape

 

weight shape이 (64,1)이 아닌 이유

: nn.Linear의 공식이 

이기 때문에

 

  • Input: (batch_size,in_features)
  • Weight: (out_features,in_features)
  • Bias: (out_features)
  • Output: (batch_size,out_features)

weight가 transpose되어 저장된다


피처(인풋)가 4개인 데이터 100개 만들기

data = torch.rand(100,4)
data

 

100행 4열

이 데이터를 model에 넣는다

model(data).shape

model의 아웃풋은 1개이기 때문에 (100,1)의 shape이 나온다