Pytorch #1

갱갱·2025년 3월 1일

ZB_TensorFlow & pyTorch

목록 보기
4/7
post-thumbnail

2025.02.13

Chapter 5. Basic of Pytorch

  • 34. Pytorch 기초
  • 35. Pytorch 기초 2




Pytorch 기초

tensor 와 기울기

동일하게 import torch 하여 import 한다.

  • requires_grad는 기울기를 계산할 수 있는 옵션이다.


예를들어 아래의 그림과 같은 함수가 있다고 가정했을 때, x=3.5에 해당하는 y 값을 구하기 위해선...



여기서 x 가 tensor 이므로 y 또한 tensor 이다. 그리고 x 지점에서의 기울기를 알기 위해선 아래와 같다.




Chain rule

위는 간단하지만, 아래는 더 복잡한 식이면..

  • dz/dadz/da30a + 4 로 나온다.


torch로 진행해보면 아래와 같다.





Pytorch 기초 2

보스턴 집값 데이터

데이터 불러오기



필요한 모듈 IMPORT



데이터를 torch 객체로 생성

  • 이렇게 만들어도 데이터는 tensor로 저장된다.



특성과 라벨로 분리 진행




학습진행

하이퍼파라미터 설정



학습 시작




Breast Cancer 검출

데이터 불러오기

데이터 확인 및 df 변경

target_names(0 또는 1
'malignant' (악성), 'benign'(양성)

feature_names (30개)
'mean radius(반경)', 'mean texture(질감)', 'mean perimeter(둘레)', 'mean area',
'mean smoothness', 'mean compactness', 'mean concavity',
'mean concave points', 'mean symmetry', 'mean fractal dimension',
'radius error', 'texture error', 'perimeter error', 'area error',
'smoothness error', 'compactness error', 'concavity error',
'concave points error', 'symmetry error',
'fractal dimension error', 'worst radius', 'worst texture',
'worst perimeter', 'worst area', 'worst smoothness',
'worst compactness', 'worst concavity', 'worst concave points',
'worst symmetry', 'worst fractal dimension'




일부 관심있는 컬럼만 정리

  • 몇가지 컬럼에 대해서 그래프로 보면, 어느정도 선에서 양성인지 아닌지에 대해 나눠지는지 확인이 가능하다.


학습 진행

관련 라이브러리 (torch) import 진행



마찬가지로 라벨(y)과 특성(x)로 분리진행, 파라미터 설정

n_epochs = 200000
learning_rate = 1e-2
print_interval = 10000


모델생성 - 단, class로 만들기

class MyModel(nn.Module):  
    # nn.Module을 상속받아 PyTorch의 신경망 모델을 정의하는 클래스

    def __init__(self, input_dim, output_dim):  
        # 클래스 생성자 (__init__)에서 입력 차원(input_dim)과 출력 차원(output_dim)을 받아 모델을 초기화
        self.input_dim = input_dim  
        self.output_dim = output_dim  
        # 입력 차원과 출력 차원을 객체의 속성으로 저장
        
        super().__init__()  
        # nn.Module의 생성자를 호출하여 PyTorch의 기본 신경망 기능을 사용할 수 있도록 함

        self.linear = nn.Linear(input_dim, output_dim)  
        # 입력 차원에서 출력 차원으로 변환하는 선형(Linear) 계층을 정의
        # nn.Linear(input_dim, output_dim)은 가중치 행렬과 편향을 포함한 선형 변환을 수행

        self.act = nn.Sigmoid()  
        # 활성화 함수로 시그모이드(Sigmoid)를 정의
        # Sigmoid 함수는 출력 값을 0과 1 사이로 변환하는 비선형 함수

    def forward(self, x):  
        # 모델의 순전파(Forward) 연산을 정의하는 메서드
        # 입력 x를 받아 변환된 출력을 반환

        # |x| = (batch_size, input_dim)  
        # 입력 텐서 x의 크기를 설명하는 주석
        # batch_size: 한 번에 처리하는 데이터 샘플 개수

        y = self.act(self.linear(x))  
        # self.linear(x): 입력 x에 대해 선형 변환을 수행  
        # self.act(...): 선형 변환 결과에 Sigmoid 활성화 함수를 적용  
        # y의 크기는 (batch_size, output_dim)

        # |y| = (batch_size, output_dim)  
        # 출력 y의 크기를 설명하는 주석

        return y  
        # 변환된 출력 y를 반환

  • input_dim 차원의 입력을 받아 output_dim 차원의 출력으로 변환하는 단순한 신경망입니다.
  • nn.Linear()를 사용하여 선형 변환을 적용한 후, Sigmoid 활성화 함수를 통해 출력을 0~1 사이로 변환합니다.
  • 이 모델은 이진 분류(Binary Classification) 문제에서 출력 확률을 생성하는 데 적합합니다.


모델선언, loss, optim 선언

'''학습 시작'''

for i in range(n_epochs):
    y_hat = model(x)
    loss = crit(y_hat, y)

    optimizer.zero_grad()
    # PyTorch는 기본적으로 기울기를 누적하기 때문에, 새로운 기울기를 계산하기 전에 초기화해야 함
    loss.backward()
    # 손실을 모델의 모든 가중치에 대해 미분(Backpropagation)
    # 역전파(Backpropagation)를 수행하여 각 가중치의 기울기(gradient) 를 계산
    # 즉, 모델의 가중치를 얼마나 조정해야 하는지 정보 제공

    optimizer.step()

    if (i+1) % print_interval == 0 :
        print('Epoch %d : loss = %.4e' % (i+1, loss))

  • epoch 진행 시마다 loss(에러) 축소


결과확인

df = pd.DataFrame(torch.cat([y, y_hat], dim=1).detach().numpy(),
                  columns=['y', 'y_hat'])

sns.histplot(df, x='y_hat', hue='y', bins=50, stat='probability')
plt.show()

profile
(hellow. world)

0개의 댓글