공부 정리 블로그

1019_논문 일기 본문

논문

1019_논문 일기

따옹 2023. 10. 20. 12:10

오늘 공부한 내용

1)전이학습 2)MAP 구현

 

https://junstar92.tistory.com/152#recentEntries

 

Class Activation Map(CAM)

(tensorflow v2.4.0) 오래전부터 CNN Model을 해석하기 위한 방법을 찾아왔습니다. 이전에는 주로 filter들을 시각화하거나 filter가 최대로 활성화하는 입력을 찾는 등의 filter 단위의 해석이 많았고, 실제

junstar92.tistory.com

 

MAP구현 부분은 이 블로그를 참고했다.

코딩할 줄 모르니까, GPT한테 울며 매달릴 수 밖에 없었다.

 

GPT_한테_질척거린_인간_대화_유출

 

GPT선생님의 가르침을 받아 오늘 공부한 내용은 아래와 같다

(위의 링크에서 코드를 같이 보며 지센세 답변을 같이 보면 아무래도 이해가 빠르겠다)

 

주어진 코드는 TensorFlow와 Keras를 사용하여 딥러닝 모델을 구축하는 함수 build_model()과 해당 함수를 호출하여 모델을 생성하는 코드입니다.

  1. build_model() 함수:
    • 이 함수는 먼저 VGG16 모델의 사전 훈련된 가중치를 사용하여 전이학습(transfer learning)을 수행합니다.
    • tf.keras.applications.VGG16을 사용하여 VGG16 모델을 로드하고, 입력 이미지의 크기를 (224, 224, 3)로 설정합니다.
    • include_top=False를 설정하여 VGG16 모델의 최상위 레이어를 제외하고 모델을 로드합니다.
    • 그런 다음, 모델의 출력을 글로벌 평균 풀링(Global Average Pooling) 레이어로 변환하고, 이어서 두 개의 뉴런을 가진 밀집(Dense) 레이어를 추가합니다. 이 두 뉴런은 'dogs'와 'cats'와 같은 2개의 클래스에 대한 확률을 출력할 것입니다.
    • 마지막으로, 모델의 입력과 출력을 설정하고 VGG16의 일부 레이어를 고정하며, 손실 함수, 옵티마이저 및 평가 메트릭을 설정합니다.
  2. 모델 생성:
    • model = build_model()을 호출하여 build_model() 함수로부터 모델을 생성합니다.

이 코드는 VGG16를 기반으로한 간단한 분류 모델을 생성하는데 사용되며, 주어진 입력 이미지에 대해 'dogs' 또는 'cats'와 같은 2개의 클래스 중 하나로 분류하는 작업을 수행할 것입니다. 이 모델은 전이학습을 사용하여 사전 훈련된 가중치를 활용하므로, 적은 데이터에서도 좋은 성능을 기대할 수 있습니다.

 

 

근데 왜 최상위 레이어를 제외하고 모델을 로드해?
 

VGG16 모델을 최상위 레이어를 제외하고 로드하는 이유는 전이 학습(Transfer Learning)의 일환입니다. VGG16 모델은 이미지 분류 작업에 효과적으로 훈련된 사전 훈련된 모델로, 주로 대규모 이미지 데이터셋인 ImageNet에서 훈련되었습니다. 따라서 VGG16의 하위 레이어들은 이미지 특징 추출기로서의 역할을 잘 수행할 수 있습니다.

최상위 레이어를 제외하고 모델을 로드하는 이점과 이유는 다음과 같습니다:

  1. 사전 훈련된 특성 추출기 활용: VGG16의 하위 레이어들은 이미지의 저수준 특성을 추출하는 데 유용하며, 이러한 특성은 다양한 이미지 분류 작업에서 재사용할 수 있습니다. 최상위 레이어를 제외하면 이미지의 저수준 특성을 유지하면서 새로운 분류 레이어를 추가하여 다른 분류 작업에 맞게 모델을 조정할 수 있습니다.
  2. 데이터 효율성: 최상위 레이어는 일반적으로 특정 작업에 특화된 특징을 학습하므로, 새로운 작업에 모델 전체를 훈련하는 것보다 데이터셋이 적어도 더 효율적으로 모델을 훈련할 수 있습니다.
  3. 속도와 메모리 효율성: 최상위 레이어를 제외한 모델은 훨씬 가벼우며, 모델을 훈련하거나 추론할 때 더 적은 계산 리소스와 메모리를 요구합니다.

전이 학습은 데이터셋이 작거나 훈련에 필요한 컴퓨팅 리소스가 제한된 경우 특히 유용하며, 사전 훈련된 모델의 기존 특성을 활용하여 새로운 작업에 대한 모델을 빠르게 구축할 수 있습니다.

그러하다 ㅇㅇ

선생님께서는 모르는 게 없으시다

팩트 체크를 위해 비전시스템을 위한 딥러닝 책에서 '전이 학습' 부분을 들여다봤는데

GPT선생님 말씀이 옳은 말씀이셨다.

 

그리고 난 아무것도 모르는 신생아니까

build_model()이 전이학습을 하겠단 소리야?

이런 질문을 했는데

 

GPT 선생님 우문현답 폼미쳐따

네, "build_model()" 함수는 전이 학습(Transfer Learning)을 수행하도록 디자인되었습니다. 이 함수 내에서 다음과 같은 전이 학습 관련 단계가 포함되어 있습니다:

  1. base_model에 VGG16 모델을 로드하고 사전 훈련된 가중치를 가져옵니다. 이 VGG16 모델은 이미지넷(ImageNet)과 같은 대규모 데이터셋에서 훈련되었습니다.
  2. VGG16 모델의 최상위 레이어를 제외하고, 이후에 추가할 사용자 지정 레이어를 구성합니다.
  3. 전이 학습을 위해 VGG16 모델의 기존 특성 추출 능력을 활용하고, 새로운 분류 레이어를 추가하여 모델을 개인화합니다.
  4. 마지막으로, model.compile()을 통해 모델을 컴파일하고, 손실 함수(loss function), 옵티마이저(optimizer), 평가 메트릭(metrics) 등을 설정합니다.

전이 학습의 핵심 아이디어는 사전 훈련된 모델의 일부 레이어와 가중치를 재사용하여 새로운 작업에 맞게 모델을 조정하는 것입니다. 이 경우 VGG16 모델의 하위 레이어들은 이미지의 기본적인 특성을 감지하는 데 사용되며, 그 위에 새로운 분류 레이어가 추가되어 'dogs'와 'cats'와 같은 2개의 클래스에 대한 분류를 수행합니다.

따라서 "build_model()" 함수는 전이 학습을 통해 이미지 분류 작업에 맞는 모델을 구축하고, VGG16 모델의 특성을 활용하여 적은 데이터에서도 효과적인 성능을 얻을 수 있도록 합니다.

 

 

그리고 거슬렸던

for layer in base_model.layers[:-4]: layer.trainable = False 이거 무슨 말이야

이부분에 대한 질문을 하니,

for layer in base_model.layers[:-4]: layer.trainable = False 코드는 VGG16 모델의 하위 레이어 중 마지막 4개 레이어를 제외한 모든 레이어를 "trainable" (훈련 가능)하지 않도록 설정하는 부분입니다.

VGG16 모델은 이미지의 다양한 특징을 추출하기 위해 여러 개의 합성곱 레이어(Convolutional Layer)와 풀링 레이어(Pooling Layer)로 구성되어 있습니다. 이 코드는 VGG16 모델의 하위 레이어 중에서 마지막 4개 레이어를 제외한 모든 레이어를 고정(또는 "trainable=False")하는 것을 의미합니다.

레이어를 "trainable=False"로 설정하면 해당 레이어의 가중치가 훈련 중 업데이트되지 않습니다. 이것은 전이 학습의 일환으로 사용됩니다. 왜냐하면 VGG16 모델의 하위 레이어들은 이미지의 저수준 특징을 잘 캡처하고 있으며, 대상 작업에 맞게 재사용하려는 것이므로, 이러한 레이어들의 가중치를 고정하여 그 특징들을 보존하고 새로운 분류 레이어만 훈련합니다.

마지막 4개의 레이어는 대상 작업과 관련이 있는 고수준의 특징을 포함하고 있을 수 있으므로, 이러한 레이어만 훈련 가능하게 설정합니다. 이렇게 하면 모델은 저수준 및 고수준 특징을 모두 활용하여 분류 작업을 수행하게 됩니다.

 
도대체 왜 나 공부하고 있누
GPT 현질하면 내 논문도 써주는 거 아닐까
 
그렇게 top classifier를 제외한 VGG16 모델을 가져오고, classifier는 GAP와 Dense layer로 구성한다.
 
에폭 열심히 돌리고 (중간에 시스템 RAM 부족으로 세션 멈춰서 저 블로그에 추천한대로 에폭 5만 돌렸고 잘 되더라)
 
 
cam_model = tf.keras.Model(model.input, outputs=(model.layers[-3].output, model.layers[-1].output))
 
이 코드로 새로운 cam_model을 정의해줌
이 모델은 입력으로 모델 'model'의 입력(input)을 사용하고, 출력으로 2개의 값을 가짐
 
model.layers[-3].output 
이 부분은 'model' 의 뒤에서 세 번째 레이어의 출력을 의마함 일반적인 Global Average pooling 레이어로
CAM을 생성하기 위한 특징 맵(feature map)
 
 
model.layers[-1].output
model 의 마지막 레이어인 출력 레이어의 출력을 의미. 모델의 분류 결과 또는 확률
 
 
그리고 궁금했던 이 코드
gap_weights = model.layers[-1].get_weights()[0]
gap_weights.shape
 

주어진 코드는 model에서 마지막 레이어의 가중치를 추출하고 그 가중치의 형태(shape)를 확인하는 부분입니다.

  1. model.layers[-1].get_weights(): model의 마지막 레이어(보통 분류 레이어)에 대한 가중치(weight) 정보를 가져오는 메서드입니다. 이 메서드를 호출하면 해당 레이어의 가중치와 편향(bias)가 반환됩니다.
  2. [0]: 반환된 가중치 리스트에서 첫 번째 요소를 선택합니다. 이것은 가중치 텐서(tensor)에 해당합니다.
  3. gap_weights.shape: 선택한 가중치 텐서의 모양(shape)을 확인합니다. 가중치 텐서의 모양은 가중치 행렬의 행과 열의 크기를 나타냅니다.

가중치는 모델이 훈련 중에 학습하게 되는 파라미터입니다. 모델이 이미지를 분류할 때, 마지막 레이어의 가중치는 클래스별 확률을 예측하는 데 사용됩니다. 따라서 이 코드는 모델의 출력 레이어의 가중치를 추출하고 그 형태를 확인하여 모델이 어떻게 예측을 수행하는지에 대한 정보를 제공합니다.

 
왜 반환된 가중치 리스트에서 첫 번째 요소를 선택하는 거야?
 

model.layers[-1].get_weights() 메서드는 해당 레이어의 가중치와 편향을 반환하는데, 이러한 정보는 리스트 형태로 반환됩니다. 리스트의 첫 번째 요소에는 가중치 텐서가 저장되고, 두 번째 요소에는 편향 텐서가 저장됩니다.

첫 번째 요소를 선택하는 이유는 일반적으로 분류 문제에서는 가중치 텐서가 모델의 예측과 관련이 있고, 편향 텐서는 예측과 관련이 적은 경우가 많기 때문입니다. 따라서 보통 분류 문제에서는 주로 가중치를 확인하고 분석하게 됩니다.

따라서 model.layers[-1].get_weights()[0] 코드를 사용하여 가중치 텐서에 접근하고 해당 가중치 텐서의 모양(shape)을 확인하는 것이 일반적인 가중치 분석 및 시각화의 첫 번째 단계입니다.

 
 
from tensorflow.keras.utils import plot_model
plot_model(model, to_file='model.png', show_shapes=True)

오 대박

'논문' 카테고리의 다른 글

1020_논문 일기  (0) 2023.10.21
논문을 쓰기 위한 첫걸음  (0) 2023.09.23
NVAE: A Deep Hierarchical Variational Autoencoder 리뷰  (0) 2023.09.10
Grad-CAM 리뷰  (0) 2023.09.09