본문 바로가기

개발/딥러닝

[논문 구현] ImageNet Classification with Deep Convolutional Neural Networks

드디어 모든 빌드업이 끝났습니다. 논문 구현을 위해 컴퓨터를 사고(https://codestudycafe.tistory.com/29) GPU를 통해 학습하는 방법도 배웠습니다(https://codestudycafe.tistory.com/34). 이제 이 논문을 구현해 봅시다.

 

이 페이지의 목적은 해당 논문에 있는 모델을 구현하는 것입니다. 실제로 성능이 잘 나오면 좋겠지만 그것이 목적은 아니라는 거죠. 그러니 이전에 사용한 MNIST(https://codestudycafe.tistory.com/31)데이터를 그대로 사용해 봅시다.

 

전처리는 이 전 페이지를 그대로 따라 했다고 하고 바로 모델 구현으로 가봅시다.

 

하나의 이미지에서 두개의 CNN이 나옵니다. 그리고 각각의 CNN에 대해 MaxPool과 local_response_normalization를 적용합니다.

 

 

MNIST이미지가 너무 작아서 수치는 적당히 줄였습니다. 모델을 쪼개고 붙이는 것에 집중해 주세요. 그리고 GPU 역시 1개밖에 없어서 한 곳에서 학습했습니다.

레이어 2에서 3으로 가는 부분을 구현해 봅시다. 이 전 레이어를 합한 다음 다시 2개로 분리해 주었습니다.

 

 

레이어 3에서 4로 가는 부분을 구현해 봅시다. 이 전 레이어를 합하지 않기 때문에 Concatenate만 빼면 됩니다.

 

Conv에서 Dense로 가는 부분을 구현해 봅시다. 평평하게 편 다음 Dense를 적용해 주었습니다.

 

 

마지막 출력 부분입니다. Concate로 합하고 softmax를 넣어줍니다.

 

이제 모델의 입력과 출력을 알려줍니다.

 

이제 이 전과 똑같이 컴파일을 하고 실행시켜 줍니다.

 

성능은 이 전 CNN만 사용한 것보다 잘 나오는 것을 볼 수 있습니다. 하지만 여기서 중요한 것은 성능이 아닙니다. AlexNet의 논문에서는 첫 번째 CNN에서 GPU1에서 학습한 것은 색에 구애받지 않고 GPU2에서 학습한 것은 색을 위주로 학습했다고 합니다. 이 학습에서 위쪽 CNN과 아래쪽 CNN에서 어떤 차이가 있는지 확인해 봅시다.

 

지금 만든 모델은 총 19개의 레이어로 되어 있습니다. 이 중 2, 3번째 레이어가 논문의 첫번째 CNN에 해당합니다. 각 레이어마다 결과를 출력해 봅시다.

 

 

첫 번째 레이어의 파라미터 일부를 뽑아냈습니다.

 

마찬가지로 두 번째 레이어의 파라미터를 뽑아냈습니다.

 

뭔가 더 어두운 값이 많은 것 같은데 사실 이걸로는 잘 모르겠네요. 한번 분포를 그려봅시다.

 

아주 살짝 음수가 많은 것 같습니다. 하지만 유의미하진 않아 보이네요. 데이터가 작아서 그렇거나 색이 없는 데이터라서 그럴 가능성이 있어 보입니다.

 

AlexNet을 직접 구현하고 실행해 봤습니다. 혹시 논문에 있는 것처럼 뭔가 유의미한 관찰이 있을까 했지만 아쉽게도 그런 건 없네요. 이런 실패도 언젠간 도움이 되겠지라는 마음으로 다음에는 또 새로운 논문을 구현해 보겠습니다.