https://arxiv.org/pdf/1503.02531.pdf

 

- Knowledge distillation 은 미리 학습시킨 Teacher network 의 출력을 내가 실제로 사용하고자 하는 작은 모델인 Student network 가 모방하여 학습함으로써, 상대적으로 적은 Parameter 를 가지고 있더라도 모델의 성능을 높이는 방법론입니다.

 

- Knowledge-Distillation

Knowledge-Distillation은 Teacher Network로부터 Student Network를 학습시키는 모델로 Teacher-Student Network로 언급되기도 합니다. 학습하고자 하는 Dataset D가 있을 때 Teacher Network T가 Dataset D를 먼저 학습합니다. 그 후 Teacher Network보다 작은 규모의 Student Network S가 Teacher Network T를 활용하여 Dataset D를 학습합니다. 이 과정을 Distillation이라는 용어로 표현하는데, 이는 Teacher Network T가 Student Network S에게 Dataset D에 관한 지식을 응축하여 전달하는 것이라고 할 수 있습니다. 이렇게 학습된 Student Network S는 Teacher Network T 없이 Dataset D를 직접 학습한 S’보다 더 높은 성능을 보인다는 것이 여러 논문을 통해 확인되었습니다. 이것은 보다 큰 Neural Network인 Teacher Network T의 지식이 작은 Neural Network인 Student Network S로 Distillation 되었다고 하여 Knowledge-Distillation이라고 합니다. T의 지식을 S로 어떻게 전달할 것인가에 대해 2015년 Geoffrey Hinton 교수가 발표한 ‘Distilling the Knowledge in a Neural Network’을 비롯하여 다양한 연구가 진행되고 있습니다.

 

  • knowledge transfer, knowledge distillation, transfer learning 차이는?
    • Knowledge Transfer은 크게 Knowledge Distillation과 Transfer Learning으로 구분 가능
      • Transfer Learning은 서로 다른 도메인에서 지식을 전달하는 방식
      • Knowledge Distillation은 같은 도메인 내 모델 A에게 모델 B가 지식을 전달하는 방식 (Model Compression 효과)
  • KD는 Model Compression이라는 측면에서 다양하게 사용할 수 있음
    • BERT와 같은 무거운 모델을 경량화하기 위해 KD를 사용

https://light-tree.tistory.com/196

 

딥러닝 용어 정리, Knowledge distillation 설명과 이해

이 글은 제가 공부한 내용을 정리하는 글입니다. 따라서 잘못된 내용이 있을 수도 있습니다. 잘못된 내용을 발견하신다면 리플로 알려주시길 부탁드립니다. 감사합니다. Knowledge distillation 이란?

light-tree.tistory.com

https://baeseongsu.github.io/posts/knowledge-distillation/

 

딥러닝 모델 지식의 증류기법, Knowledge Distillation

A minimal, portfolio, sidebar, bootstrap Jekyll theme with responsive web design and focuses on text presentation.

baeseongsu.github.io

 

'딥러닝 이론' 카테고리의 다른 글

Loss landscape / Flat Minima & Sharp Minima  (1) 2022.10.04
AutoEncoder  (0) 2022.08.24
Meta Learning  (0) 2022.08.22
*NAS(neural architecture search)  (0) 2022.07.28
*Transformer  (0) 2022.07.06

Loss landscape?

loss landscape는 파라미터에 따른 손실 값(loss)의 변화를 나타냅니다. neural network를 훈련한다는 것은 loss landscape를 미끄러져 내려가면서 최소값을 찾는 과정이라고 해석할 수 있습니다. 따라서 loss landscape를 잘 보면 neural network 학습을 이해하는데 도움이 됩니다.

 

밑의 그림은 sam optimizer를 사용하지 않았을 때와 사용 했을 때의 loss landscape를 보여줍니다. sam을 사용하지 않았을때(middle)는 loss landscape가 굉장히 복잡한 모양으로, 학습 시작점(initialization)이 어디냐에 영향을 크게 받으며, local minima에 빠질 수 있다. 반면 sam을 사용했을때는 거의 볼록한 모양으로 최적점까지 쉽게 미끄러져 내려가 학습이 잘 될 것으로 추측할 수 있다. 이처럼 loss landscape는 neural network이해에 직관적인 도움을 줍니다.  

 

Generalization?

Generalizaiont이란 학습 데이터로 훈련했을 때 보지 못한 데이터(테스트 데이터)도 잘 맞추는 것을 말합니다. 보통 학습 데이터와 테스트 데이터는 분포가 다릅니다. 그ㅐ서 학습데이터로 훈련했을때 테스트 데이터를 잘 못 맞추는 경우가 발생합니다. 모델의 구조나 학습 방법등에 영향을 받습니다. 모델의 generalization 성능을 평가 할때는 generalization gap이라는 용어를 사용합니다. 같은 분포에서 추출된 학습 데이터와 테스트 데이터 사이의 성능 차이를 generalization gap이라고 합니다. 특히 학습 데이터가 적으면 generalization gap이 커지는 문제가 종종 발생합니다.

 

 

Flat Minima & Sharp Minima

Generalization gap은 loss landscape와도 깊은 연관이 있습니다.

x축은 파라미터, y축은 loss를 나타내고, 검정 선은 학습 데이터에 대한 loss landscape function을 빨간 점선은 테스트 데이터에 대한 loss landscape function을 나타냅니다. 훈련 데이터와 테스트 데이터의 분포가 다르기 때문에 조금 이동한 모양입니다. 학습을 통해 training function의 minimum point까지 파라미터를 업데이터했다고 가정했을때, trainingfunction은 minimum loss 값을 가지게 되지만, testing function은 오른쪽으로 약간 이동하여 존재하므로 학습데이터로 훈련하여 얻은 파라미터로는 최적의 loss를 갖지 못합니다. 이 차이는 minima의 모양(flat vs sharp)에 따라 커지거나 작아질 수 있습니다.

flat minima일때 testing function의 y값은 training function의 y값과 크게 차이가 나지않음을 확인할 수 있습니다. 반면 sharp minima일때 testing function의 y값은 training function의 y값과 차이가 많이 나는 거승ㄹ 확인할 수 있습니다.

따라서 Sharp Minimum은 loss function의 작은 변화에도 민감하게 반응하기 때문에 Flat Minimum에 비해 generalization 측면에서 훨씬 불리하다고 볼 수 있습니다.

 

 

'딥러닝 이론' 카테고리의 다른 글

Knowledge Distillation  (0) 2022.11.16
AutoEncoder  (0) 2022.08.24
Meta Learning  (0) 2022.08.22
*NAS(neural architecture search)  (0) 2022.07.28
*Transformer  (0) 2022.07.06

https://arxiv.org/pdf/2201.09792.pdf

 

Abstract

- Vision task에서 CNN모델이 수년동안 주류였지만, 최근에 transformer based model(ViT)이 CNN의 성능을 뛰어넘고있다.

- ViT의 높은 성능은 transformer architecture때문일까? 아니면 patch embedding때문일까?

- 이 논문은 후자에 대한 증거를 제시한다.

- 여기서 제안하는 ConvMixer은 patch를 input으로 받고, network내에서 동일한 size, resolution을 유지하며, spatial, channel dimension을 separate한다.

- Mixing step에서 CNN만을 사용

- 비슷한 파라미터 수, 데이터셋에서 Convmixer은 resnet, ViT, MLP-Mixer보다 더 좋은 성능을 보였다.

 

Introduction

- CNN이 수년동안 computer vision task에서 지배적인 아키텍쳐였지만 최근에 Vision transformer 아키텍쳐가 고전적인 CNN을 뛰어넘는 성능을 보여주고있다.(특히 큰 데이터 셋에서)

- NLP에서 처럼 Vision task에서도 transformer based architecture가 주류가 되는 것은 시간 문제처럼 보이지만, NLP와는 달리 vision task에서는 이미지를 입력으로 넣을때 representation 변화가 필요하다.

- Attention layer의 time complexity는 O(N^2)으로 이미지를 pixel로 그대로 넣으면 연산량이 너무 커서, patch 단위로 나눈 후 linearly embedding해 입력으로 넣어야한다.

- 이번 연구에서, 우리는 근본적으로 Vision transformer의 강력한 성능이 transformer architecture 보다는 patch based representation에서 나오는 것인지 확인해보고자한다.

- MLP-Mixer와 비슷한 간단한 CNN 기반의 ConvMixer을 개발한다.

  • patches representation
  • 모든 layer에서 equal resolution and size representation 유지
  • does no downsampling of the representation at successive layers
  • channel-mixing, spatial-mixing
  • Vit, MLP-mixer와는 다르게 standard convolution만을 사용

- ConvMixer은 성능이나 속도를 maximize하기 위한 모델 디자인은 아니며, patch representation 자체가 ViT, MLP-Mixer등 모델의 성능에 영향을 미치는 중요한 요인이라는 것을 제시하는 모델

- 다른 요소들로부터 patch embedding의 효과를 정확하게 구별하기 위해서는 더 많은 실험이 필요하지만, 우리는 이 ConvMixer가 미래에 더 advaned architectures들과 비교할 수 있는 강력한 convolutional-but-patch-based baseline 될거라 믿는다.

 

A Simple Model : ConvMixer

- ConvMixer은 patch embedding layer 이어 단순 반복되는 convolutional block으로 구성된 구조

1. (Patch Embedding) image를 patches로 나눈다 

  • Patch size P와 embedding 차원 h를 가진 패치 임베딩은  입력 채널, 출력 채널 h, kernel size P, stride P를 가진 컨볼루션으로 구현

2. (ConvMixer Layer)

  • depth번 만큼, Depthwise Convolution(residual connection) + Pointwise Convolution을 반복
  • Depthwise Convolution은 spatial location의 mix(공간 방향의 convolution 진행), Pointwise Convolution은 channel location의 mix를 하기 위해 시행(채널 방향의 convolution 진행), 중간에 activation + batch norm 넣어줌

3. Global Average Pooling 후 (1,1,h) 벡터를 linear transform해 classifiacation 값을 얻음

 

EXPERIMENTS

- Training step

  • pretraining이나 데이터 추가 없이 ImageNet classification에서 ConvMixer을 평가
  • RandomAugment, mixup, Cutmix, random erasing 사용
  • AdamW optimizer, simple triangul learning rate schedule 사용
  • 컴퓨팅 파워때문에 하이퍼파라미터 튜닝을 하지 못했고, competitors보다 적은 에폭으로 학습
  • ConvMIxer은 아직 성능 향상의 여지가 많음.

- Results

  • ConvMixer-1536/20 with 52M parameters은 imagenet에서 81.4% 정확도 기록
  • ConvMixer-768/42 with 21M parameters은 80.2% 기록
  • 더 큰 kernel size에서 더 작은 patch size에서 높은 성능을 보임
  • ConvMixer-1536/20 patch size를 7에서 14로 늘렸을때 정확도는 78.9%기록했지만, 속도는 4배 빨라짐

- Comparisons

  • Parameter 수를 비슷하게 해서 훈련시켰을 때, DeiT와 ResMLP는 ConvMixer와 다르게 hyperparameter tuning이 되어 있음에도(특히 ResNet은 tuning하는데 지금까지 엄청난 자원이 소모되었음에도), epoch도 2배임에도 ConvMixer을 0.2%밖에 outperform하지 못했다.
  • 하지만 ConvMixer은 patch size가 더 작기 때문에 다른 모델들에 비해 inference 속도가 느리다. 하이퍼파라미터 튜닝과 최적화를 통해 이 gap을 줄일수있다.

 

RELATED WORK

- Isotropic architectures

  • Vision transformer은 첫번째 layer에 patch embedding을 사용하고, 네트워크 전체에서 똑같은 size와 shape 가진  "isotropic"아키텍처의 패러다임을 열었다.
  • 이러한 모델은 반복되는 transformer-encoder blocks과 유사하고, self attention과 MLP를 대체하는 다른 operation이 있다.

glob() 기능

  • glob() 함수는 파라미터에 명시된 저장 경로와 패턴에 해당하는 파일명을 리스트 형식으로 반환한다.
  • 단, 조건에 정규식을 사용할 수 없으며 *와 ? 같은 와일드카드만 지원한다.

 

'*' 사용하기

'*'는 임의의 길이의 모든 문자열을 의미한다.

file_path = glob.glob('dir/*.csv')

: dir폴더에 csv 파일들의 이름만 file_path에 리스트에 저장된다.

 

'?' 사용하기

'?'는 한자리의 문자열을 의미한다.

file_path = glob.glob('dir/file?.csv')

: dir폴더에 file_.csv 파일들의 이름만 file_path에 리스트에 저장된다.

 

하위 디렉토리 파일까지 전부 다 찾기

recursive=True로 설정하고 '**'를 사용하면 모든 하위 디렉토리까지 탐색한다.
기본값은 False이며, 파일이 너무 많을 경우에 사용하면 과도한 cost가 소모된다고 한다.

file_path = glob.glob('dir/**', recursive=True)

: dir와 하위 폴더의 모든 파일들의 이름이 file_path에 리스트에 저장된다.

 

 

[Python] glob.glob() 사용법

1. 개요 많은 파일들을 다뤄야 하는 파이썬 프로그램을 작성할 때, 특정한 패턴이나 확장자를 가진 파일들...

blog.naver.com

 

branch

우리가  큰 개발 프로젝트를 진행한다고 가정해봅시다. 큰 개발 프로젝트를 진행할 땐 여러 개발 팀 혹은 팀원으로 나뉘어 동시에 개발을 합니다. 예를 들어, 머신러닝 개발 프로젝트를 하는 팀에서는 데이터를 전처리하고 저장을 하는 팀, 모델을 개발하는팀, 모델을 서빙하는 팀이 있을 수 있겠죠. 각 팀 안에서는 버그를 수정하거나 새로운 기능을 개발을 해야하는 일이 많을 것입니다.  각 팀별로 버전을 관리할 필요성이 있습니다. 이럴 때, 각 팀에서는 개발 프로젝트의 소스코드를 바탕으로 개발을 해나가야할 것입니다.  이후 개발이 완성되면 프로젝트에 병합을 시켜 새로운 버전울 생성하여 다른 팀원들과 충돌 나지 않으면서 프로젝트를 진행할 수 있겠죠.

브랜치(branch)는 프로젝트을 바탕으로 독립적으로 개발을 할 수 있을 수 있는 저장소(작업영역)입니다. 저장소를 처음 만들 때, 동시에 만들어지며 프로젝트 version을 관리하는 branch를 master branch라 합니다. 이후 기능 개발 시 master branch를 바탕으로 하거나 혹은 다른 branch를 바탕으로 또 다른 branch를 생성해 독립적으로 개발을 진행할 수 있습니다.

 

Git - 브랜치란 무엇인가

3.1 Git 브랜치 - 브랜치란 무엇인가 모든 버전 관리 시스템은 브랜치를 지원한다. 개발을 하다 보면 코드를 여러 개로 복사해야 하는 일이 자주 생긴다. 코드를 통째로 복사하고 나서 원래 코드와

git-scm.com

 

Merge into current branch

master branch를 바탕으로 새로운 기능 개발 혹은 버그를 고친다고 할 때 새로운 branch를 만들어 진행합니다. 이후 개발을 다 마치고 이를 master branch에 병합하여 새로운 버전을 만들고자 합니다. 이 때 우리는 Merge into current branch를 활용합니다. Merge into current branch를 통해 master branch에 해당 기능 branch을 병합합니다. 이후 필요하지 않은 branch는 delete를 할 수 있습니다. 

 

Git - 브랜치와 Merge 의 기초

Merge 시에 발생한 충돌을 다루는 더 어렵고 요상한 내용은 뒤에 고급 Merge 에서 다루기로 한다.

git-scm.com

 

Conflict

앞서 살펴본 협업을 진행하다 보면, 완벽하게 중복을 피할 수 있을까요?! 곰곰히 생각해보면 앞서서 했던 방식들이 중복을 근본적으로 피하게 해주진 않는 것 같아요. 결국 같은 파일의 같은 줄을 수정했다면 충돌은 피할 수 없습니다. 이 때, 어떻게 하면 충돌을 해결 할 수 있을까요? 원격 저장소의 내용을 내려 받았을 때, 충돌이 발생 한 경우 세 가지 경우 중 하나를 선택 하여 다시 commit해서 통합된 버전을 만드는 것인데요. 선택지는 다음과 같습니다.

  1. 원격 저장소의 코드를 수용하는 경우 (남이 만든 코드를 반영)
  2. 지역 저장소의 코드를 반영하는 경우 (내가 만든 코드를 반영)
  3. 두 가지를 모두 반영하는 경우 (두 가지를 다 고려하여 수정)

다음 강의에서는 VScode의 기능을 통해 편리하게 위와 같은 방식의 해결책을 보여줍니다.

 

GIT CLI - Branch & Conflict - 생활코딩

수업소개 지금까지 만들던 버전에 이어서 서로 다른 여러 작업을 진행해야 하는 경우가 있습니다. 이런 경우 저장소를 복제하고 싶을 때가 있죠? 저장소를 복제하지 않고 동일한 효과를 낼 수

opentutorials.org

 

Pull request

프로그램을 개발하고 반영하는 일련의 과정들을 겪으면서, 이제 정말 개발할 준비가 된 것 같습니다. master 브랜치에 질서 정연하게 push만 하면 되는 거잖아요? 됐습니다! 어.. 하지만 제가 만든 내용들이 잘 작동하지 않거나 한번 검토가 필요할 때 바로 반영하기는 겁이나네요, 어떻게 하는 것이 좋을까요?? 바로 Pull request(줄여서 PR)을 활용하시면 됩니다. Pull request란 직접 master 브랜치에 push하는 것이 아닌 master 브랜치로 부터 새로운 브랜치를 만든 다음 개발 내역을 해당 브랜치에 적용하고, 그 내용이 master에 반영되기 전 검토를 해달라는 요청을 보내어 팀원들과 리뷰를 마친 후 반영 하는 방식입니다. 그 과정이 아주 엄격하게 관리 될 수도 있고, 아니면 간단한 리뷰를 통해서도 가능합니다. 

 

수업소개 - 생활코딩

수업소개 pull request에 대한 전체적인 설명을 합니다. 또 우리 수업에서 다루는 것과 다루지 않는 것에 대해서도 설명합니다.  강의

opentutorials.org

 

'Git' 카테고리의 다른 글

Git과 Github  (0) 2022.08.26

Git이란?

Git은 형상 관리 도구 중 하나로, 컴퓨터 파일의 변경사항을 추적하고 여러 명의 사용자들 간에 해당 파일들의 작업을 조율하기 위한 분산 버전 관리 시스템이다.

출처 : 위키백과

  • Git은 소프트웨어 개발에서 소스 코드를 효과적으로 관리할 수 있도록 하는 무료, 공개 소프트웨어입니다.
  • Git은 프로젝트 폴더 내에서 작업을 기록하고, 버전 관리를 통해 체계적인 개발이 가능하도록 합니다.

 

Github란?

깃허브(Github)는 분산 버전 관리 툴인 깃(Git)를 사용하는 프로젝트를 지원하는 웹호스팅 서비스이다.

출처 : 위키백과

github는 버전 관리와 협업을 위한 코드 웹 호스팅 플랫폼으로, 언제, 어디서나 협업 프로젝트를 쉽게 진행할 수 있도록 돕는 역할을 합니다!

 

 

Git server & Git client

git은 여러가지 버전 관리 시스템 중에서도, 분산된 환경을 통해 소스코드를 관리합니다. 분산 환경 시스템에는 중앙서버와 클라이언트가 존재하게 됩니다. 이때 코드를 모아놓게되는 원격 컴퓨터를 remote server 그 코드들의 사본을 받아 개발하는 개인/지역 컴퓨터를 local client라고 해봅시다. Git에서도 git server와 git client가 존재합니다. git client는 git server의 사본을 가지고 각자의 로컬 환경에서 개발을 할 수 있습니다. git client와 git server의 종류는 아래와 같습니다.

 

git client

ex) git CLI(Command-line interface), Visual Studio Code에 내장되어 있는 git

 

git server 

ex) github.com, gitlab등등

 

Repository

github상에서 우리의 프로그램을 담는 저장소를 말합니다. Repository에서는 우리 코드를 저장할 수 있을 뿐 아니라 커밋 히스토리, pull request등 협업을 위한 여러 작업을 할 수 있습니다. 개발하는 프로젝트를 담는 폴더라고 생각하시면 됩니다.

 

Commit

제출하다는 뜻을 갖고 있는 commit은 git 에서는 버전을 저장하는 것을 의미합니다. 이번 강의에서는 빈 repository에 file을 여러번 업로드를 하고 이를 각각 commit 해봅니다. 우리는 commit history을 통해 이를 확인할 수 있고 어떻게 바뀌었는지도 알 수가 있습니다.

 

Git issues

우리는 개발을 하면서 여러 소통을 해야할 때가 많죠. 여기에는 bug가 발생해 debug을 해야하거나 새로운 기능을 만들어야하는 것도 포함될 것입니다. 이런 상황의 대부분은 코드를 보고 의견을 교환하며 해결해야하는 경우가 많습니다. issues는 repository에서 이러한 기능을 수행합니다. issues에서는 'issue 생성'을 통해 해결하고 싶은 문제를 업로드하고 의견을 달 수 있습니다. 이 때 해당 이슈가 어떤 것인지 알려주는 labels, 해당 이슈를 처리할 사람이 누구인지 Assignee으로 지정할 수 있습니다. 

 

[git, github] git issue 생성 및 작성 방법 (1)

Issue 이슈는 프로젝트의 작업, 개산 사항 및 버그를 추적하는 좋은 방법으로 사용된다. 프로젝트 기획, 새롭게 추가될 기능, 버그와 수정사항 모든 것을이 이슈라고 할 수 있다. 모든 활동 내역에

hyeonic.tistory.com

 

Git clone

github의 repository의 내용을 내 컴퓨터(로컬) 환경에 복제하는 것을 말합니다. 이를 통해 로컬환경에서 github의 파일들을 받아서 개발을 할 수 있습니다.

 

Git config

로컬 환경에서 작업 후 commit을 진행할 때, 누가 해당 커밋을 했는지 기록하고 확인할 필요가 있겠죠? 해당 작업을 수행하는 git 명령어가 git config 입니다. 수업에서 알려주신 명령어는 아래와 같습니다.

git config -- global user.name egoing
git config -- global user.email egoing@gmail.com

이는 git config에 global 옵션을 더해 해당 값을 기본값으로 활용하며 사용자의 이름, 사용자 이메일을 등록합니다. 

Git push

열심히 로컬 환경에서 개발을 하며 중간중간 commit을 진행하고 난 이후 우리는 원격 저장소인 github에 업로드 할려고 합니다. 이때 활용하는 git 명령어가 git push입니다. push가 되면 로컬 환경에서 개발한 코드 뿐 아니라 그동안 개발하면 중간중간 commit했던 이력들 또한 업로드 됩니다. 

 

Git pull

우리가 로컬에서 개발을 하던 와중 다른 팀원이 본인의 작업물을 push 함으로 원격저장소에 변화가 생겼습니다. 이때 원격저장소의 내용을 현재 내 로컬환경에 반영하고 합쳐 개발을 계속하고자 합니다. 이때 활용하는 명령어가 git pull입니다. git pull은 fetch와 merge가 동시에 진행이 됩니다.

 

Git fetch & merge

git pull에서 했던 얘기를 다시 해볼게요. 우리가 로컬 환경에서 작업하던중 원격저장소의 내용을 팀원이 수정했습니다. 이때 우리가 개발한 내용을 원격저장소에 push를 할려고 하면 거절됩니다. 그 이유는 원격저장소에는 팀원의 수정사항이 반영이 되어 있고, 이때 우리의 push를 받는 다면 팀원의 수정사항이 overwrite이 되는 상황이기 때문이죠. 이럴 땐 어떻게 해야할까요? 앞서 배운 것 처럼 pull을 통해 해결 할 수 있지만 fetch와 merge라는 과정으로 나눠서 진행할 수 있습니다.

fetch는 원격저장소에 있는 내용을 로컬 저장소로 가져옵니다. 이를 통해 로컬 저장소와 원격 저장소와의 차이를 비교할 수 있습니다. 이를 통해 충돌되는 상황은 발생하지 않는 지, 충돌한다면 이를 어떻게 해결하면 좋을지를 확인 한 후 merge를 통해 두 브랜치를 병합합니다. 브랜치와 merge의 경우, 이후 강의를 통해 조금 더 배워보실 수 있습니다.

 

Git init

지난 수업까지는 github의 repository를 먼저 만들고 clone하는 과정을 거쳐 원격저장소로부터 로컬 저장소를 구성할 수 있었습니다. 그렇다면 반대로 로컬에서 개발하고 git을 이용해 형상관리를 하고 원격저장소에 업로드 할 수 있지는 않을까요? 이때 로컬저장소에 필요한 명령어가 git init입니다. git init을 통해 로컬 저장소를 git을 통해 관리할 수 있게 됩니다. 

 

Git add

commit은 버전을 기록할 때 활용합니다. commit을 할 때 여러 파일의 수정사항을 기록해도 좋지만, 한 commit에 한 개의 파일의 수정사항만 저장할 수 있다면 다른 팀원들이 commit history를 볼 때 조금 더 수월하게 볼 수 있을 것 입니다. 이때 활용하는 명령어가 git add입니다. git add는 git commit에 포함될 파일을 지정합니다. git add를 통해 하나의 파일을 지정하면 해당 파일을 stage에 올린다 합니다. 

 

Git checkout

우리가 프로젝트를 진행하던 중 코드 상에 버그가 있어 코드가 실행이 되지 않는 다는 것을 알게 되었습니다. 이때, 우리가 할 수 있는 것은 무엇일까요? 우리가 commit을 잘해왔다면 해당 commit hisoty로 돌아갈 수 있습니다. 그렇게 된다면 commit history에 있는 버전들을 활용해 조금 더 빠르게 debug를 할 수도 있습니다. 이때 활용하는 명령어가 git checkout입니다. git checkout을 활용해 기존의 commit hisotry로 저장소를 변경한 후 오류를 수정한 다음 다시 commit을 통해 버전을 업데이트 합니다. (checkout은 head를 바꾼다.)

 

Git remote

로컬 저장소에서 시작한 프로젝트를 원격저장소와 연결과 관련된 명령어입니다. 강의에서 나온 내용은 로컬 저장소에서 작업한 프로젝트를 새로운 원격저장소에 push를 하기 위해 git remote를 씁니다. 이때 사용하는 명령어는 git remote add 입니다.

'Git' 카테고리의 다른 글

Git과 Github 2  (0) 2022.08.30

파이썬 머신러닝, 딥러닝 모델을 개발할 때, 호출 당시 인자값을 줘서 동작을 다르게 하고 싶은 경우가 있습니다.(하이퍼 파라미터 관리)

이때, 파이썬 내장함수인 argparse 모듈을 사용하여 원하는 기능을 개발할 수 있습니다.

 

사용법

먼저, 다음과 같은 python file 을 만든다.

import argparse

# 인자값을 받을 수 있는 인스턴스 생성
parser = argparse.ArgumentParser(description='Argparse Tutorial')

# 입력받을 인자값 설정 (default 값 설정가능)
parser.add_argument('--epoch',          type=int,   default=150)
parser.add_argument('--batch_size',     type=int,   default=128)
parser.add_argument('--lr_initial',     type=float, default=0.1)

# args 에 위의 내용 저장
args    = parser.parse_args()

# 입력받은 인자값 출력
print(args.epoch)
print(args.batch_size)
print(args.lr_initial)

이후, 터미널에서 파이썬 파일을 실행 시키면 아래와 같은 결과를 보여준다.

 

파이썬 파일 실행 방법은 python 파일이름.py 로 실행할 수 있다.

# python 파일을 터미널에서 실행 시킨다.

$ python argparse_example.py 

  150  # default epoch
  128  # default batch size
  0.1  # default learning rate


# 뒤쪽에 -h 또는 --help 를 붙이면 내용에 대해서 보여준다.

$ python argparse_example.py -h 

  usage: argparse_example.py [-h] [--epoch EPOCH] [--batch_size BATCH_SIZE]
                             [--lr_initial LR_INITIAL]

  Argparse Tutorial

  optional arguments:
    -h, --help            show this help message and exit
    --epoch EPOCH
    --batch_size BATCH_SIZE
    --lr_initial LR_INITIAL


# 다음과 같이 명령시에 직접 값을 설정해 적용할 수 있다.

$ python argparse_example.py --epoch=256 --batch_size 64 --lr_initial 0.1111

  256    # epoch
  64     # batch_size
  0.1111 # learning rate 
  

 

일반적인 머신러닝에서 위의 모듈을 사용하는 방법은 다음과 같다.

 

  •   main.py  :  모델 학습/평가가 수행되는 파이썬 코드                             ( run in python)
  •   main.sh  :  main.py 에 특정한 하이퍼 파라미터를 부여하는 코드    ( run in shell )
# main.py

import argparse

# 인자값을 받을 수 있는 인스턴스 생성
parser = argparse.ArgumentParser(description='Argparse Tutorial')

# 입력받을 인자값 설정 (default 값 설정가능)
parser.add_argument('--epoch',          type=int,   default=150)
parser.add_argument('--batch_size',     type=int,   default=128)
parser.add_argument('--lr_initial',     type=float, default=0.1)

# args 에 위의 내용 저장
args    = parser.parse_args()

# 입력받은 인자값 출력
print(args.epoch)
print(args.batch_size)
print(args.lr_initial)
# main.sh

# 본인이 원하는대로 값을 설정해줄 수 있다.

python argparse_example.py  # default value
python argparse_example.py --epoch=200 --batch_size=256 --lr_initial=0.3
python argparse_example.py --epoch=300 --batch_size=64 --lr_initial=0.03
python argparse_example.py --epoch=400 --batch_size=32 --lr_initial=0.003

 

위와 같은 .py .sh 파일을 만든 후 터미널에서 다음과 같이 sh 파일을 실행 시켜준다.

 

$ sh main.sh

  # 결과
  150    # default epoch
  128    # default batch size
  0.1    # default learning rate

  200    # epoch
  256    # batch size
  0.3    # learning rate

  300    # epoch
  64     # batch size
  0.03   # learning rate

  400    # epoch
  32     # batch size
  0.003  # learning rate

 

ArgumentParser()

해당 객체에는 아래와 같이 입력받고 있습니다.

  • prog: 프로그램의 이름 (기본값: sys.argv[0])
    • 기본값으로 실행한 스크립트파일명을 노출. 작성 시 스크립트 파일 대신 입력한 값이 노출
  • usage: 프로그램 사용법을 설명하는 문자열 (기본값: 파서에 추가된 인자로부터 만들어지는 값)
    • 사용방법을 노출.  기본값으로 실행한 파일 + 입력한 인자값들을 노출
  • description: 인자 도움말 전에 표시할 텍스트 (기본값: none)
    • 스크립트에 -h 옵션을 주어 실행 시, usage 아래에 노출
  • epilog: 인자 도움말 후에 표시할 텍스트 (기본값: none)
  • parents: ArgumentParser 객체들의 리스트이고, 이 들의 인자들도 포함
  • formatter_class: 도움말 출력을 사용자 정의하기 위한 클래스
  • prefix_chars: 선택 인자 앞에 붙는 문자 집합 (기본값: '-').
  • fromfile_prefix_chars: 추가 인자를 읽어야 하는 파일 앞에 붙는 문자 집합 (기본값: None).
  • argument_default: 인자의 전역 기본값 (기본값: None)
  • conflict_handler: 충돌하는 선택 사항을 해결하기 위한 전략 (일반적으로 불필요함)
  • add_help: 파서에 -h/--help 옵션을 추가 (기본값: True)
  • allow_abbrev: 약어가 모호하지 않으면 긴 옵션을 축약할 수 있도록 함. (기본값: True)

 

add_argument()

해당 메서드는 아래와 같이 입력받고 있습니다.

  • name or flags: 옵션 문자열의 이름이나 리스트, 예를 들어 foo 또는 -f, --foo.
  • action: 명령행에서 이 인자가 발견될 때 수행 할 액션의 기본형.
  • nargs: 소비되어야 하는 명령행 인자의 수.
  • const: 일부 action 및 nargs 를 선택할 때 필요한 상숫값.
  • default: 인자가 명령행에 없는 경우 생성되는 값.
  • type: 명령행 인자가 변환되어야 할 형.
  • choices: 인자로 허용되는 값의 컨테이너.
  • required: 명령행 옵션을 생략 할 수 있는지 아닌지 (선택적일 때만).
  • help: 인자가 하는 일에 대한 간단한 설명.
  • metavar: 사용 메시지에 사용되는 인자의 이름.
  • dest: parse_args() 가 반환하는 객체에 추가될 어트리뷰트의 이름.

파이썬 함수 선언부에 보면 args, kwargs를 가끔 볼 수 있다.

args는 정해지지 않은 수의 (일반)파라미터를 받고

kwargs는 정해지지 않은 수의 키워드파라미터를 받는다.

예를들어 myFunc를 선언하고 호출해보자.

먼저 args에 대해서 알아보자. 별표(*)1개와 함께 입력한다.

파라미터수를 정하지 않았으므로 없거나, 1개, 2개, 3개 등 모두 가능하다.

그러면 리스트도 전달 가능할까? 아래처럼 호출하면 가능하다.

 

다음으로 kwargs에 대해서 알아보자. 별표 2개(**)와 함께 입력한다.

키워드파라미터에 없거나, 여러 개를 입력할 수 있다.

만약 (일반)파라미터와 키워드파라미터를 둘다 받고 싶다면 아래와 같이 선언한다.

리스트를 사용하여 전달하고자 한다면 아래와 같이 할 수 있다.

마지막으로 위에서 사용했던 args와 kwags는 다른 변수명으로 바꿀 수 있다.

그러나 가독성을 위해 args(=arguments), kwargs(=keyword arguments)를 위해

그대로 사용하는 것을 권장한다.

+ Recent posts