딥러닝 코드 구조에 대해 설명을 하고자 합니다.
먼저, 인기 있는 딥러닝 Framework에 대해 설명을 드리면 아래 3개를 들 수 있겠네요.
1. Tensorflow : My favorite
2. Pytorch
3. 🤗Huggingface
저는, 2018년도 부터 Tensorflow 1 버전대로 딥러닝을 공부해왔으며 Tensorflow 2 버전대로 올라오면서 Keras와의 결합과 좀 더 Pythonic한 코드로 변경되어 지금까지 쭉 사용하고 있습니다. (틀틀..🥲)
Pytorch는 딥러닝 코드구성이 Network를 아주 세세하게 변경하여 만들 수 있는 Low-Level로 만들어 졌기 때문에, 딥모델 연구에 많이 사용되었지만 최근에는 Pytorch 인기가 더 많아져 모델개발에도 많이 사용되고, 또한 2.0이 Release 되면서 속도도 빨라지고 코드도 더욱 더 Pythonic하게 되어 인기가 더 높아지고 있는게 보입니다.
Huggingface는 Transformer모델을 전문적으로 다루는 업체에서 출시한 Framework로써, 최근 NLP 뿐만아니라 Vision에서도 Transformer 모델이 높은 성능을 내기 때문에 많이 사랑받는 Framework 이며, Pytorch와 결합도 더욱 강화되어 인기가 많습니다.
앞으로 모든 설명은 Tensorflw Vision Task 기준으로 작성이 될 것입니다. 사실 Pytorch로 넘어가려고 열심히 공부중입니다
Tensorflow의 딥러닝 코드 구조는 크게 4개 Block으로 구성되어 있습니다.
# 1. DataLoader 정의
# 2. Model 정의
# 3. Model 학습
# 4. Model Test
일반적인 딥러닝 Task는 방대한 양의 이미지를 GPU 가속 연산을 통해 처리하고 가중치(wights) 및 편향(bias)를 최적화 함으로써, Loss를 최소화 하는 최적화 문제 해결 기법입니다.
여기서 방대한 양의 이미지를 어떻게 GPU 메모리에 올려 연산할까요?
이를 이해하기 위해서는 반복문(순환문)을 수행하는 객체로써 iterator | generator 개념에 대해 이해를 해야 합니다.
간단히 설명하면, iterator는 메모리에 데이터를 올려놓고 그 값을 순환하는 방식이라면 generator는 순환하는 위치를 기억해서 매순간 메모리에 데이터를 올리는 방식이죠.
방대한 양의 이미지를 처리하기 위해서는 iterator 객체를 사용하면 쉽게 RAM OOM(Out Of Memory)이 발생하기에, generator를 사용하게 됩니다.
각 Framework에서 딥러닝 Model Input으로 넣을 수 있는 generator 객체를 제공해 주는데요, 양대산맥인 tensorflow와 pytorch의 generator 객체는 아래와 같습니다.
상세히 구현하는 방법에 대해서는 다음 velog에서 알려드릴게요~
딥러닝 모델을 정의하는 일입니다. 딥러닝 모델에 대한 연구 지원이 세계적으로 엄청 일어나면서, 정말 다양한 논문을 통해 여러 성능 좋은 모델들이 공개가 되었는데요.
내가 해결하려는 문제에 적합한 모델을 잘 채택한 후 라이브러리를 활용 하여 정의하여 쓰거나, 본인이 스스로 모델을 정의할 수 있겠네요.
개인적으로, 세계적으로 똑똑한 사람들이 모인 초거대 AI기업에서 공개한 검증된 성능의 모델을 사용하지 않을 이유는 없을 것 같습니다. 시간날때마다 딥러닝 모델에 대한 논문을 꾸준히 읽으면서 어떤 모델이 있고, 어떤 특징과 어떤 데이터에 좋은성능을 낼 지 끊임없이 공부해야겠죠? 🥲
모델 학습의 경우, 2. Model 정의에서 만든 모델에 1. DataLoader 정의의 generator를 입력으로 넣어 Epoch만큼 반복하면서 학습(가중치와 편향 최적화)을 하는 코드입니다.
Loss, Optimizer, Metrics 정의와 학습을 하는데 필요한 Hyper-parameters, 그리고 Callbacks등이 정의 되어 학습이 수행되겠네요.
3. Model 학습에서 Train-set을 통해 학습을 하면서 Validation-set을 통해 성능을 확인을 했을 텐데요,
여기서 Validation-set은 직접적으로 모델의 학습(가중치와 편향 최적화)에는 영향을 전혀 주지 않았지만, 여러분이 선택한 모델은 val-loss 와 val-metrics를 보고 가장 좋은 성능을 냈던 epoch의 모델을 선택했을 겁니다.
따라서, Validation-set은 궁극적으로 unseen-data 가 아닙니다. 따라서, 최종적으로 전혀 본적이 없는 test-set을 통해 Model Test를 해서 최종적인 모델 성능에 대해 결론을 내리게 됩니다.
첫 게시글이라 글이 너무많네요. 다음부터는 그림을 잘 써서 설명해보도록 하겠습니다!
딥러닝 코드 구조는 위와 같이 크게 '4개 구조로 이루어 져 있다' 정도만 이해하시고, 다음 velog부터 하나하나 자세히 들어가 보도록 합시다.