딥러닝을 다루는 대표적인 라이브러리로는 Tensorflow, Keras, Pytorch 가 있다. 해당 게시글에서는 Facebook 에서 제공하는 PyTorch 를 사용한다.
Pytorch 의 가장 큰 장점은 Python 의 언어 구조와 굉장히 유사하며 간결하다. 또한, 내부적으로 CUDA 와 cuDNN 이라는 API 를 이용하 GPU 연산을 가능하게 하며, 이로인해 연산 속도가 월등히 빠르다는 장점을 가진다.
Pytorch 은 데이터의 형태로 Tensor 을 사용한다. 텐서는 새로운 개념이 아니라 수학적 개념의 데이터 배열과 같다. 즉, 0차원 - 스칼라, 1차원 - 벡터, 2차원 - 행렬 이며 3 차원 이상부터는 n차원 텐서라고 부른다.
아나콘다가 설치되어 있다고 가정하고 가상환경을 구축할 것이다.
여러 프로젝트를 진행하다 보면 각 프로젝트에서 필요한 라이브러리와 딥러닝 프레임 워크가 다른 경우가 빈번하다. 하나의 공간에 여러 버전의 라이브러리가 동시에 설치되면 서로 충돌되기 때문에 코드를 실행할 때마다 적절한 버전을 설정해야하는 번거로움을 겪게 된다.
이러한 어려움을 극복하기 위해 독립된 작업 공간인 가상 환경 구축을 사용한다. 프로젝트마다 독립된 방을 만드는 것과 비슷하다.
파이토치를 공식 홈페이지에서 설치할 것이다.
교재에서 파이썬 3.7을 사용하는 것 같으니 virtual 이라는 가상환경 이름을 가진 python=3.7 버전의 가상환경을 작업 폴더 내부에 만들었다.
conda create -n virtual python=3.7
그런데 다음과 같은 오류가 발생하였다.
Channels:
- defaults
Platform: osx-arm64
Collecting package metadata (repodata.json): done
Solving environment: failed
PackagesNotFoundError: The following packages are not available from current channels:
- python=3.7*
Current channels:
- defaults
To search for alternate channels that may provide the conda package you're
looking for, navigate to
https://anaconda.org
and use the search bar at the top of the page.
찾아보니, Python 3.8이 출시된 지 약 1년이 지났기 때문에, osx-arm64용 Python 3.7 빌드는 Conda Forge의 정규 빌드 매트릭스에 포함되지 않았다고 하여, python3.8 로 변경하였다.
https://stackoverflow.com/questions/70205633/cannot-install-python-3-7-on-osx-arm64
conda create -n virtual python=3.8
3.8로 변경하니 잘 생성되었다.
다음 명령어로 해당 가상환경을 활성화해준다.
source activate virtual
종료할 때는 다음 명령어를 입력한다.
source deactivate virtual
파이토치 설치할 때는 아래 공식사이트 들어가서 내 버전에 맞게 설정한 후 나오는 명령어를 가상환경에 입력하면 된다.
나는 예전에 공식 홈페이지에서 파이썬을 설치했어서 pip 로 되었지만 아나콘다에서 설치했다면 conda 를 선택하면 된다.
https://pytorch.kr/get-started/locally/
# MPS acceleration is available on MacOS 12.3+
pip3 install torch torchvision torchaudio
MNIST 데이터는 손으로 쓰인 0에서 9까지의 이미지 데이터이다. 각 이미지에는 어떤 숫자인지 나타내는 정답 레이블 정보가 포함되어 있다.
해당 손글씨를 보고 숫자로 분류하는 문제로 연습을 진행할 것이다.
이미지 데이터는 0에서 1까지의 값을 갖는 고정 크기의 28x28 행렬이다. 각 행렬의 원소는 픽셀의 밝기 정보를 나타낸다. 1에 가까울수록 흰색, 0에 가까울 수록 검은색이다.
레이블은 one-hot encoding 방식으로 길이가 10인 벡터로 이루어져 있다.
MNIST 은 4차원 데이터이다. 3차원 행렬은 [Channel, Width, Height] 를 나타낸다.
Python 을 통해 손글씨 숫자 이미지를 분류하는 간단한 구조의 CNN 을 구성해볼 것이다. 코드는 크게 네 부분으로 구성된다.
1. 모듈 및 분석 환경 설정
2. 데이터 불러오기
3. 모델 학습
4. 모델 평가
우선 라이브러리 임포트는 이렇게 해줄 것이다.
import torch
import torch.nn as nn # 딥러닝 네트워크의 기본 구성 요소 포함한 torch.nn 모듈
import torch.nn.functional as F # 딥러닝에서 자주 사용되는 함수가 포함된 모듈
import torch.optim as optim # 가중치 추정에 필요한 최적화 알고리즘 포함한 모듈
from torchvision import datasets, transforms # 딥러니이에서 자주 사용되는 데이터셋과 모델 구조 및 이미지 변환 기술 포함
from matplotlib import pyplot as plt # 데이터와 차트의 시각화 돕는 모듈
%matplotlib inline #주피터 노트북 사용자가 브라우저에서 바로 그림볼 때 필요한 코드
다음은 분석 환경을 설정할 것이다.
가중치 업데이터 연산 과정에서 어떤 장비를 사용할 지에 대한 코드인다. CUDA 를 통해 gpu 사용이 가능하면 torch.cuda.is.available() 에 True 값이 아니라면 False 값이 저장된다.
pytorch 에서는 모델과 사용하는 데이터에 어떤 장비를 사용할 지 지정해야하므로 구현 전에 장치를 device 에 미리 저장하는 것이 유용하다.
is_cuda = torch.cuda.is_available()
device = torch.device('cuda' if is_cuda else 'cpu')
print('Current cuda device is', device)
하이퍼파라미터를 사전에 정의할 것이다.
batch_size = 50
epoch_num = 15
learning_rate = 0.0001
다음은 데이터를 불러올 것이다.
아래 코드를 실행하면 MNIST 데이터가 다운되어 저장된다.
train_data = datasets.MNIST(root = './data', train=True, download = True, transform = transforms.ToTensor())
test_data = datasets.MNIST(root = '/data', train = False, transform=transforms.ToTensor())
print('number of traning data: ', len(train_data))
print('number of test data: ', len(test_data))
우선 여기까지하고 실행하면, 이렇게 실행될 것이다.
나는 gpu 가 따로 없어서 cpu 로 설정되었다.
training data 의 수는 60000 개이고, test data 개수는 10000개이다.
