Pytorch 기초
아나콘다란?
Anaconda는 대규모 패키지와 툴을 제공하는 플랫폼으로, 데이터 과학, 머신러닝, 인공지능, 빅데이터 분석 등 다양한 분야의 개발자와 연구자를 위해 설계되었다.
Anaconda는 파이썬과 R 언어를 지원하며, 과학적 계산, 데이터 분석, 데이터 시각화, 머신러닝 등을 위한 패키지를 쉽게 설치하고 관리할 수 있게 해준다.
프로그래밍 언어의 패키지 및 환경 관리를 위한 패키지 관리자와 환경 관리자를 제공하여 요즘 파이썬 개발자에게는 파이썬의 프로젝트 관리를 위해 사용이 필수적이다!
아나콘다 설치
아래 처럼 체크해준다.
설치 완료후 anaconda prompt 열기
가상환경 만들기
conda create -n torch_book python=3.9.0
위 명령어를 사용하여 torch_book이라는 이름의 가상 환경을 만든다. (파이썬 3.10 이상을 설치하면 pytorch와 호환성 문제가 있기 때문에 3.9 버전을 설치)
가상환경을 활성화한다.
conda activate torch_book
가상환경 확인
conda env list
위 명령어로 아나콘다의 가상 환경 목록을 확인할 수 있다. *되어있는게 activation되어있는것이다.
잘못된 가상 환경을 삭제하고 싶다면?
conda env remove -n torch_book
위 명령어를 이용하면 된다.
파이토치 설치하기
파이토치란?
GPU에서 텐서 조작 및 동적 신경망 구축이 가능한 프레임워크
GPU(Graphics Processing Unit)- 연산 속도를 빠르게 하는 역할
내부적으로CUDA, cuDNN이라는 API를 통해 GPU를 연산에 사용
병렬연산에서GPU의속도는CPU의속도보다훨씬빠르므로딥러닝학습에서GPU 사용은 필수라고할수있음
텐서(Tensor)- 파이토치의 데이터 형태
텐서는 단일데이터형식으로 된 자료들의 다차원행렬
동적신경망-훈련을 반복할때마다 네트워크변경이 가능한 신경망을 의미
정적 신경망은 디버깅이 안된다!
동적 신경망의 예시:
학습중에 은닉층을 추가하거나 제거하는등 모델의 네트워크 조작 가능
연산그래프를 정의하는 것과 동시에 값도 초기화되는 ‘Define by Run’ 방식을 사용
연산그래프와 연산을 분리해서 생각 할 필요가 없기 때문에 코드를 이해하기 쉬움
Facebook의 인공지능 연구팀이 개발한 오픈소스 머신러닝 라이브러리로, 딥러닝 및 인공지능 모델을 구축하고 훈련하는 데 사용된다. 2017년초에 공개된 딥러닝프레임워크로 루아(Lua) 언어로개발되었던 토치(Torch)를 페이스북에서 파이썬버전으로내놓은것이다.
토치는 파이썬의 넘파이(NumPy) 라이브러리처럼 과학 연산을 위한 라이브러리로 공개되었지만 이후 발전을 거듭하면서딥러닝프레임워크로 발전했다.
파이토치 특징 및 장점
1. 벡터, 행렬, 텐서를 다루기 쉬움
1차원 축(행)=axis 0=벡터
• 2차원 축(열)=axis 1=행렬
• 3차원 축(채널)=axis 2=텐서
2. 연산그래프처리를 잘 한다(backpropagation)
3. 직관적인 인터페이스
텐서플로우처럼 잦은 API변경이 없어 배우기 쉽다.
파이토치 아키텍처
속도를 위해 내부는 Cpp로 구현되어있다.
파이토치API
파이토치API 계층에서는 사용자가이해하기 쉬운API를 제공하여 텐서에 대한 처리와신경망을구축하고 훈련할 수 있도록 도움
이 계층에서는사용자 인터페이스를 제공하지만 실제 계산은 수행하지않음
그대신 C++로 작성된 파이토치엔진으로 그 작업을 전달하는 역할만 함
파이토치API 계층에서는 사용자의 편의성을 위해 다음패키지들이 제공
torch.nn: 신경망 구축 및 훈련 패키지
torch.nn을 사용할 경우 신경망을 쉽게 구축하고사용할 수 있음
합성곱신경망, 순환신경망, 정규화등이포함되어 손쉽게 신경망을 구축하고 학습시킬수있음
torch.multiprocessing: 파이썬 멀티프로세싱 패키지
파이토치에서 사용하는 프로세스전반에 걸쳐 텐서의 메모리 공유가 가능
서로 다른 프로세스에서 동일한데이터(텐서)에 대한 접근 및 사용이 가능
torch.utils: DataLoader 및 기타 유틸리티를 제공하는 패키지
모델에 데이터를 제공하기 위한 torch.utils.data.DataLoader 모듈을 주로 사용
병목현상을 디버깅하기위한 torch.utils.bottleneck, 모델 또는 모델의 일부를 검사하기위한 torch.utils.checkpoint 등의 모듈도 있음
파이토치 기초 문법
데이터 셋 준비
CustomDataset : 반드시 3개의 함수가 오버라이딩되어야한다.
torch.utils.data.DataLoader
데이터로더(DataLoader) 객체는 학습에 사용될 데이터 전체를 보관했다가 모델 학습을 할때 배치크기만큼 데이터를 꺼내서 사용
( ⚠️데이터를 미리잘라놓는 것이 아니라 내부적으로 반복자(iterator)에 포함된 인덱스(index)를 이용하여 배치 크기만큼 데이터를 반환한다)
getitem은 데이터로더에서 불러서 사용한다.
토치비전(torchvision)은 파이토치에서 제공하는 데이터셋들이 모여 있는 패키지
모델 정의
init과 forward함수를 포함해야함
init에는 어떤 레이어를 사용할건지 , forward에서는 레이어를 사용함(순전파)
Sequential 신경망을 정의하는 방법
nn.Sequential을 사용하면 _ _init_ _()에서 사용할 네트워크 모델들을 정의해 줄 뿐만아니라, forward() 함수에서는 모델에서 실행되어야 할 계산을좀더 가독성이 뛰어나게 코드로 작성할 수 있음
Sequential 객체는 그 안에 포함된 각 모듈을 순차적으로 실행해주는데 다음과 같이코드를 작성할수 있다!
❗x.shape[0]은 배치사이즈를 의미한다.
모델의파라미터정의
모델을학습하기전에필요한파라미터들을정의한다.
사전에정의할파라미터는다음과같음
손실함수(loss function): 학습하는 동안 출력과 실제 값(정답) 사이의 오차를 측정 (즉, wx + b를 계산한 값과 실제값인y의오차를구해서모델의정확성을측정)
손실함수로많이사용되는것은다음과같음
- BCELoss: 이진 분류를 위해 사용
- CrossEntropyLoss: 다중 클래스 분류를 위해 사용
- MSELoss: 회귀 모델에서 사용
옵티마이저(optimizer): 데이터와 손실 함수를 바탕으로 모델의 업데이트 방법을 결정 (업데이터 정략짜기, 실제로 가중치를 업데이트 해주는 애다)
옵티마이저의 주요 특성
- optimizer는 step() 메서드를 통해 전달받은 파라미터를 업데이트 /모델의파라미터별로 다른기준( 학습률)을적용시킬수있음
- torch.optim.Optimizer(params, defaults)는 모든 옵티마이저의 기본이 되는 클래스
- zero_grad() 메서드는 옵티마이저에 사용된 파라미터들의 기울기(gradient)를 0으로 만듦
- torch.optim.lr_scheduler는 에포크에 따라 학습률을 조절할 수 있음
옵티마이저에 사용되는종류는 다음과 같다.
optim.Adadelta, optim.Adagrad, optim.Adam, optim.SparseAdam, optim.Adamax, optim.ASGD, optim.LBFGS, optim.RMSProp, optim.Rprop, optim.SGD
학습률스케줄러(learning rate scheduler): 미리 지정한 횟수의 에포크를 지날 때마다학습률을감소(decay)시켜 줌
학습률스케줄러를이용하면 학습초기에는 빠른학습을 진행하다가 전역최소점(global minimum) 근처에 다다르면 학습률을 줄여서최적점을 찾아갈 수 있도록 해준다.
학습률스케줄러의종류는다음과같다.
- optim.lr_scheduler.LambdaLR: 람다(lambda) 함수를 이용하여 그 함수의 결과를 학습률로 설정
- optim.lr_scheduler.StepLR: 특정 단계(step)마다 학습률을 감마(gamma) 비율만큼 감소시킴
- optim.lr_scheduler.MultiStepLR: StepLR과 비슷하지만 특정 단계가 아닌 지정된 에포크에만 감마 비율로감소시킴
- optim.lr_scheduler.ExponentialLR: 에포크마다 이전 학습률에 감마만큼 곱함
- optim.lr_scheduler.CosineAnnealingLR: 학습률을 코사인(cosine) 함수의 형태처럼 변화시킴, 학습률이커지기도작아지기도함
- optim.lr_scheduler.ReduceLROnPlateau: 학습이 잘되고 있는지 아닌지에 따라 동적으로 학습률을 변화시킬수있음
optimizer.zero_grad()를 통해 step이전에 리셋시켜주어야함!
모델평가
주어진 테스트데이터셋을 사용하여 모델을 평가
모델에 대한 평가는 함수와 모듈을 이용하는 두가지방법이 있음
먼저 모델평가를위해 터미널 커맨드라인(아나콘다프롬프트)에서 pip 명령어를 사용하여 다음패키지를 설치
훈련과정 모니터링 model.train() & model.eval() • model.train(): 훈련 데이터셋에 사용하며 모델 훈련이 진행될 것임을 알림
이때드롭아웃(dropout)이 활성화 • model.eval(): 모델을 평가할 때는 모든 노드를 사용하겠다는 의미로 검증과 테스트 데이터셋에사용
①model.eval()에서 with torch.no_grad()를 사용하는 이유는 다음과 같다.
파이토치는 모든 연산과 기울기 값을 저장하는데, 검증(테스트) 과정에서는 역전파가 필요하지 않다. 따라서 with torch.no_grad()를 사용하여 기울기 값을 저장하지 않도록 한다. 이를 통해 기울기르 저장하고 기록하는데 필요한 메모리와 연산 시간을 줄인다.
라이브러리 전달하기
보통은 pip freeze를 사용한다.
requirements.txt
pip freeze > requirements.txt #라이브러리를 requirements.txt로 저장
아래와 같은 형태이다.
numpy==1.21.4
pandas==1.3.3
matplotlib==3.4.3
scikit-learn==0.24.2
사용할때는 아래 명령어를 사용하면 requirements에 있는 라이브러리가 설치된다.
pip install -r requirements.txt
보통은 pip가 빠르지만, 파이토치는 conda로 까는게 좋다.
윈도우용 pytorch설치코드는 아래와 같다.
conda install pytorch torchvision torchaudio pytorch-cuda=11.8 -c pytorch -c nvidia
주피터 노트북 설치한다.
pip install jupyter notebook
주피터 노트북을 실행한다.
jupyter notebook
실습 - MNIST
데이터 다운 받기
실습파일
https://github.com/joomj2000/DeepLearning/blob/main/fashionCNN.ipynb
DeepLearning/fashionCNN.ipynb at main · joomj2000/DeepLearning
Contribute to joomj2000/DeepLearning development by creating an account on GitHub.
github.com