Human Protein Atlas Image Classification(ResNet34)

2023. 9. 11. 23:02ResNet

♣ 대회

https://www.kaggle.com/polljjaks/human-protein2/edit

 

♣ GPU 환경 설정 및 데이터 확인

 

 

이미지에 비해 target의 수가 1/4 밖에 되지 않음을 알 수 있다.

 

 

 

test data 역시 이미지의 수의 1/4이 target(label)의 수

 

 

 

♣ 이미지 데이터 채널 확인하고 합치기

train data 이미지 파일들 중 0번째에 해당하는 이미지의 red, green, blue, yellow channel 채널 모아보기

 

 

 

 

 

 

 

 

 

 

♣ DataLoading

 

 

 

 

 

원래는 channel이 4개였지만 dls를 거치면서 yellow가 탈락해서 RGB, 즉 3개 채널만 남음

 

♣ 모델 생성(ResNet34를 customizing함)

pretrained된 ResNet34 가져오기

 

 

ResNet34의 아키텍쳐(하위 모듈과 레이어)

  1. 합성곱 레이어: 이것들은 ResNet 아키텍처의 주요 구성 요소로, 다양한 필터 크기를 갖는 여러 합성곱 레이어로 구성됩니다.
  2. 풀링 레이어: ResNet은 피처 맵을 다운샘플링하기 위해 최대 풀링 레이어를 사용합니다.
  3. 기본 블록: ResNet-34는 여러 개의 잔차 블록을 사용합니다. 각 잔차 블록은 두 개 이상의 합성곱 레이어와 바로가기 연결을 포함하며 이러한 블록은 두 가지 유형이 있습니다. 기본 블록과 병목 블록입니다.
    • 기본 블록: 이러한 블록에는 작은 필터 크기의 두 개의 합성곱 레이어가 포함되어 있습니다.
  4. 병목 블록: 병목 블록에는 서로 다른 필터 크기를 가진 세 개의 합성곱 레이어가 포함되며 ResNet의 더 깊은 변형(예: ResNet-50)에서 사용됩니다.
  5. 완전 연결 (선형) 레이어: ResNet은 일반적으로 최종 출력을 생성하는 하나 이상의 완전 연결 레이어로 끝납니다.
  6. 배치 정규화와 활성화 함수: 배치 정규화 레이어와 ReLU와 같은 활성화 함수는 훈련을 안정화하고 비선형성을 도입하는 데 사용됩니다.
  7. 전역 평균 풀링: 최종 분류 레이어 이전에 피처 맵을 일차원 벡터로 변환하기 위해 전역 평균 풀링을 적용하는 것이 일반적입니다.
  8. 소프트맥스 레이어: 분류 작업에서는 로우 로짓을 클래스 확률로 변환하기 위해 마지막에 소프트맥스 레이어가 사용됩니다.

 

 

 

커스터마이징 하는 부분

- 마지막 fc layer의 채널 수 얻기. 즉 fc layer의 in_channel의 수를 얻는 것
- resnet34.fc는 ResNet34 모델의 Fully Connected Layer임. 즉 모델의 최종 분류 layer를 가리킴
- in_features는 fc layer의 입력 채널의 개수를 나타냄. 즉 이전의 convolution layer의 ouput channel 개수와 같음. 

 

 

 

- children은 ResNet34 모델 안의 모든 layer와 module을 의미함(아키텍처들)
- list(resnet34.children())[:-2]는 마지막 두 개를 제외한 모든 자식 모듈로 이루어진 목록 생성.
- 마지막 2개 레이어는 일반적으로 Global Average Pooling later와 Fully connected layer임. 
- 이 레이어들을 제거함으로써 마지막 convolutional block이후 모델이 끝나도록 만듦
- 따라서 이 코드를 실행한 후에는 resnet34가 원래 모델의 일부 버전으로 유지
- (마지막 2개 레이어를 제외하고). 즉, 분류는 하지 않고 이미지의 특성을 추출하는 부분만 남는 것. 

 

 

 

label이 28개임

- 위에서 남겨둔 resnet34 레이어 이후의 레이어들 customize
- AdaptiveAvgPool2d: 입력 피처맵의 크기를 조정하여 고정된 크기로 만듦. 여기에서는 1x1 크기로 조정함. 출력은 후속 레이어로 전달됨. 이 기능은 주로 이미지 분류 작업에서 사용됨. 분류 레이어에 고정된 크기의 입력이 필요하기 때문임. 
- nn.AdaptiveAvgPool2d(1)은 입력을 1x1 크기의 특징 맵으로 변환합니다. 이것은 실제로 2D 형태의 데이터이지만 가로와 세로 차원이 각각 1로 축소되어 1차원의 데이터로 취급됩니다. 이는 최종적으로 Flatten 레이어를 사용하여 1D 벡터로 펼치는 것과 같은 효과를 갖습니다.


- nn.Flatten: 다차원 배열을 평면화된 1차원 배열로 변환. 즉 이전 레이어의 출력을 1차원 벡터로 펼처서 후속 레이어에 전달함
- nn.AdaptiveAvgPool2d(1)은 입력 데이터를 1x1 크기의 특징 맵으로 변환하지만 여전히 2D 형태를 유지합니다. 이 특징 맵은 가로와 세로 방향으로 1개의 값을 가지는 2D 배열입니다. 이를 1D로 평탄화(flatten)하는 이유는 일반적으로 완전 연결 레이어(FC 레이어)로 전달하기 위함입니다.


- nn.Linear: 바로 Fully connected layer임. num_features는 이전 레이어의 출력 크기. 이 경우에는 ResNet34의 특징 추출 부분에서 나오는 피처의 크기임. 이 입력피처를 512개의 출력 피처로 변환함. 
- nn.Linear는 모델이 추출한 feature map을 더 작은 차원의 고수준 표현으로 매핑하는 역할을 함. 이를 통해 이미지에서 핵심적인 정보를 추출하고 이 정보를 사용하여 이미지를 분류하는 작업을 수행함. 


- ReLU는 활성화함수 레이어. 비선형성을 도입하여 모델이 비선형 관계를 학습할 수 있게 함. inplace=True는 활성화 함수를 입력 자체에 적용하여 메모리를 절약함

 

- nn.Dropout: 드롭아웃은 훈련 중에 무작위로 일부 뉴런을 비활성화하여 과적합을 방지하도록 도움. 0.5는 드롭아웃의 비율을 나타냄. 즉 각 뉴런이 50%의 확률로 비활성화되는 것. 


- nn.Linear(512, num_classes): 마지막 출력 레이어. 최종 클래스(label) 수인 num_classes에 해당하는 출력 생성. 최종 분류 작업을 수행하는 레이어. 

 

 

 

 

 

파라미터 다루기

 

- 이 코드는 custom_resnet34 모델의 첫 번째 레이어 (ResNet-34의 첫 번째 레이어, 즉 합성곱 레이어)의 모든 파라미터를 "requires_grad"를 False로 설정하여 경사하강법(gradient descent)으로 업데이트되지 않도록 하는 역할을 함
- 주로 전이 학습(transfer learning) 시나리오에서 사용됨. 전이 학습에서는 사전 학습된(pre-trained) 모델을 가져와서 새로운 작업에 맞게 모델을 미세 조정(fine-tuning)하는 경우가 흔함. 그러나 때로는 모델의 일부 레이어를 동결하고, 다른 레이어의 파라미터만 업데이트하는 것이 유용할 수 있음
- 첫 번째 레이어를 동결하는 이유는 이미지의 기본적인 특징을 유지하면서, 이후의 레이어들을 훈련하여 특정 작업(예: 이미지 분류)에 적합하도록 모델을 조정하기 위함입니다. 다른 레이어들은 여전히 학습 가능하며, 이를 통해 모델은 새로운 작업에 맞게 조절됨

 

 

 

 

 

 

♣ Model Training