상세 컨텐츠

본문 제목

PointNet 코드 분석 - PointNetCls

AI/PyTorch

by 쑤야. 2024. 8. 24. 14:58

본문

먼저 PointNetCls 클래스의 전체 코드를 살펴보며 PointNetCls가 Figure 상에서 어떤 부분을 담당하는지 파악해 보았다. 

 

클래스 전체 코드는 아래와 같다. 

class PointNetCls(nn.Module):
    def __init__(self, k=2, feature_transform=False):
        super(PointNetCls, self).__init__()
        self.feature_transform = feature_transform
        self.feat = PointNetfeat(global_feat=True, feature_transform=feature_transform)
        self.fc1 = nn.Linear(1024, 512)
        self.fc2 = nn.Linear(512, 256)
        self.fc3 = nn.Linear(256, k)
        self.dropout = nn.Dropout(p=0.3)
        self.bn1 = nn.BatchNorm1d(512)
        self.bn2 = nn.BatchNorm1d(256)
        self.relu = nn.ReLU()

    def forward(self, x):
        x, trans, trans_feat = self.feat(x)
        x = F.relu(self.bn1(self.fc1(x)))
        x = F.relu(self.bn2(self.dropout(self.fc2(x))))
        x = self.fc3(x)
        return F.log_softmax(x, dim=1), trans, trans_feat

 

Figure에서 PointNetCls가 나타내는 부분은 Classification Network 전체로 볼 수 있다. 

 

하지만 PointNetfeat이라는 커스텀 클래스가 호출되어 사용되기 때문에 구분이 필요하다고 보았다. forward 함수를 기준으로 보았을 때 코드 첫 줄인 feat 함수를 호출한 코드가 파란색 영역이며 이후 두 번째 줄부터는 빨간색 영역이라고 파악했다. 

 

이 포스팅에서는 PointNetCls만 다룰 것이므로 feat 함수를 나타내는 PointNetfeat 클래스는 다음 포스팅에서 정리하겠다. 

 


1. pytorch 기능 정리

 

Dropout

  • 딥러닝 모델에서 과적합을 방지하고 일반화 성능을 향상시키기 위해 자주 사용되는 정규화 기법 중 하나
  • 학습 중 무작위로 뉴런을 드롭하여 일부 뉴런의 출력을 0으로 설정하는 방식으로 동작
  • 모델이 특정 뉴런이나 경로에 과도하게 의존하지 않도록 하여 모델의 일반화 성능을 높이는 데 도움을 준다

BatchNorm1d

  • PyTorch에서 1차원 데이터를 위한 배치 정규화(Batch Normalization)를 수행하는 레이어
  • 주로 1D 데이터를 다루는 Fully Connected Layer(전결합 층) 또는 1D Convolutional Layer(1차원 합성곱 층) 뒤에 사용

log_softmax

  • 소프트맥스(softmax) 함수의 출력을 로그(logarithm) 공간으로 변환하는 함수로 분류 문제에서 주로 사용

 


2. 사용된 개념 정리

 

배치 정규화(Batch Normalization)

  • 배치 정규화는 딥러닝 모델의 각 층에서 들어오는 입력의 분포를 평균 0, 분산 1로 정규화하는 기법
  • 학습의 안정성을 높이고, 과적합을 줄이는 등의 장점을 가지고 있다

Softmax

  • 주어진 입력 벡터의 요소들을 확률 분포로 변환하는 함수
  • 각 입력의 지수 연산을 수행한 후, 이 값을 모든 입력에 대한 지수 연산 결과의 합으로 나누어 확률을 계산


3. 로직 짚고 넘어가기 

 

F.relu(self.bn1(self.fc1(x)))
  1. self.fc1(x): → 선형 변환
    • 입력 데이터 x의 특성들을 선형 결합하여 새로운 표현으로 변환
    • 선형 변환은 데이터의 차원을 변경하거나 입력 데이터의 선형 결합을 학습하여 모델이 입력 데이터와 출력 데이터 사이의 선형 관계를 학습할 수 있도록 한다
  2. self.bn1(...): → 배치 정규화
    • 선형 변환의 출력을 정규화하여 학습 과정 중 입력 데이터의 분포 변화를 줄여준다
  3. F.relu(...): → 비선형 활성화 함수
    • 정규화된 출력을 비선형적으로 변환하여 모델이 복잡한 패턴을 학습할 수 있도록 해준다
    • ReLU 함수는 입력이 양수일 경우 그대로 출력하고, 음수일 경우 0을 반환하는 함수로 다른 활성화 함수들보다 계산이 간단하고 기울기 소실 문제가 상대적으로 덜 발생한다는 장점을 가지고 있다

'AI > PyTorch' 카테고리의 다른 글

PointNet 코드 분석 - PointNetfeat  (0) 2024.08.24
PointNet 코드 분석을 시작하기 전  (1) 2024.08.24
[PyTorch Tutorial] LeNet-5 코드 분석  (0) 2024.08.20

관련글 더보기