파이토치 튜토리얼

2023. 10. 7. 18:27딥러닝 모델: 파이토치

♣ 주제

♣ 데이터 작업

파이토치에는 데이터 작업을 위한 기본 요소 두 가지인 torch.utils.data.DataLoader와 torch.utils.data.Dataset가 있음

- Dataset: 샘플과 정답(label)을 저장

- DataLoader: Dataset을 순회 가능한 객체(iterable)로 감쌈. 

 

1. Dataset 내려받기

데이터 다운로드(dataset으로)

- root: 학습/테스트 데이터가 저장되는 경로

- train: 학습용 또는 테스트용 Dataset 여부 지정

- download: root에 데이터가 없는 경우 인터넷에서 다운로드함

- transform, target_transform: 특징(feature)과 정답(label) 변형을 지정함. 

 

데이터 변형(transform)

- 변형을 통해 데이터를 조작하고 학습에 적합하게 만듦

- 모든 TorchVision 데이터셋들은 특징(feature)을 변경하기 위한 transform과 정답(label)을 변경하기 위한 target_transform을 가짐.

- torchvision.transforms 모듈은 주로 사용하는 몇 가지 변형을 제공함.

 

 

- torchvision.transform 관련 정보

https://jy-deeplearning.tistory.com/18

 

 

2. DataLoader 만들기 

모델을 학습할 때, 일반적으로 샘플을 미니배치로 전달하고, 매 EPOCH마다 데이터를 다시 섞어서 과적합을 막고, Python의 multiprocessing을 사용하여 데이터 검색 속도를 높이려고 함. 

DataLoader는 간단한 API로 이러한 복잡한 과정들을 추상화한 순회 가능한 객체(iterable)임.

Dataset을 순환 가능한 객체(iterable)로 감싸고, 자동화된 batch, sampling, shuffle 및 다중 프로세스로 데이터 불러오기를 지원함

여기에서 DataLoader 객체의 각 요소는 64개 특징과 label 묶음으로 반환됨.

DataLoader 만들기

 

- 관련 정보(DataLoader 만들기)

https://jy-deeplearning.tistory.com/14

 

DataLoader 만들기 비교

A B 둘 다 DataLoader 객체를 생성하고 있음. A보다 B가 좀 더 파라미터를 많이 사용하여 customize하고 있는 것. A에서 batchsize를 주고 싶으면 dls = mnist.dataloaders(path, bs=64) 이런 식으로 줄 수 있음.

jy-deeplearning.tistory.com

https://jy-deeplearning.tistory.com/18

 

 

♠ Model 만들기(신경망 모델 구성하기)

신경망은 데이터에 대한 연산을 수행하는 계층(layer)/모듈(module)로 구성되어 있음. Pytorch의 torch.nn 스페이스는 신경망을 구성하는 데 필요한 모든 구성 요소를 제공함. Pytorch의 모든 모듈은 nn.Module의 하위클래스임. 

따라서 파이토치에서 신경망 모델은 nn.Module을 상속받는 class를 생성하여 정의함. nn.Module을 상속받은 모든 클래스는 신경망 모듈이 된다. nn.Module은 학습 중에 최적화되는 가중치와 편향을 parameter로 가진다. 

__init__ 함수에서 신경망의 계층(layer)들을 정의하고, forward 함수에서 신경망에 데이터를 어떻게 전달할지 지정함. 가능한 경우, GPU  또는 MPS로 신경망을 이동시켜서 연산을 가속함. 

 

 

신경망 모델은 nn.Module의 하위 클래스를 정의하고, __init__에서 신경망 계층들을 초기화함. nn.Module을 상속받은 모든 클래스는 forward 메소드에 input에 대한 연산들을 구현함. 

 

nn.Linear

선형 계층: 저장된 가중치(weight)와 편향(bias)을 사용하여 입력에 선형 변환(linear transformation)을 적용하는 모듈

 

nn.ReLU

비선형 활성화: 모델의 input과 output 사이에 복잡한 관계를 만듦. 비선형 활성화는 선형 변환 후에 적용되어 비선형성을 도입하고, 신경망이 다양한 현상을 학습할 수 있도록 도움

이 모델에서는 nn.ReLU를 사용했지만, 비선형성을 가진 다른 활성화 함수를 도입할 수도 있음. 

 

nn.Sequential

순서를 갖는 모듈의 컨테이너. 데이터는 정의된 것과 같은 순서로 모든 모듈들을 통해 전달됨. 여러 layer들을 이어붙여서 하나의 모듈로 만드는 역할을 함. 

 

♣ 모델 매개변수 최적화하기

최적화 단계(optimization loop)는 학습단계(train loop)와 검증/테스트 단계(validation/test loop)로 이루어짐

 

모델을 학습하려면 손실 함수(loss function)과 옵티마이저(optimizer)가 필요함. 

nn.Module을 상속하면 모델 객체 내부의 모든 필드들이 자동으로 추적되며 모델의 parameters() 및 named_parameters() 메소드로 모든 매개변수에 접근할 수 있게 됨. 

 

optimizer: 위의 optimizer에서는 최적화 과정이 수행되는 방식을 SGD(확률적 경사하강법)으로 정의함. 

torch.optim.SGD(model.parameters(), lr = 1e-3)는 학습하려는 모델의 매개변수와 학습률 하이퍼파라미터를 등록하여 옵티마이저를 초기화함. 

 

training loop에서 모델은 배치로 제공되는 학습 데이터셋에 대한 예측을 수행하고, 예측 오류를 역전파하여 모델의 매개변수를 조정함. 

학습 단계에서 최적화는 3개 단계로 이루어짐

1. optimizer.zero_grad()

모델 매개변수의 변화도를 재설정함. 기본적으로 변화도는 더해지기 때문에 중복 계산을 막기 위해 반복할 때마다 명시적으로 0으로 설정함. 

2. loss.backwards()

예측 손실(prediction loss)을 역전파함. PyTorch는 각 매개변수에 대한 손실의 변화도를 저장함

3. optimizer.step()

변화도를 계산한 뒤에는 역전파 단계에서 수집된 변화도로 매개변수를 조정함. 

 

 

모델이 학습하고 있는지를 확인하기 위해 테스트 데이터셋으로 모델의 성능 확인하기

test_loss와 correct 변수 초기화: 테스트 손실과 정확도를 저장할 변수 초기화

with torch.no_grad(): 이 블록 내에서는 역전파를 하지 않도록 설정하여 계산 그래프가 만들어지지 않도록 함

for X, y in dataloader: 데이터로더에서 미니배치를 순회하면서 다음을 수행함

 - 모델을 사용하여 입력 데이터 X에 대한 예측 계산

 - test_loss += loss_fn(pred, y).item(): 예측과 실제 레이블 y 간의 손실을 계산하고 누적함

 - correct += (pred.argmax(1) == y).type(torch.float).sum().item(): 모델이 정확하게 예측한 개수를 누적함

 

test_loss /= num_batches: 테스트 손실을 미니배치 개수로 나누어 평균 손실을 계산

correct /= size: 정확도를 데이터셋의 크기로 나누어 백분율로 표현함

결과를 출력하여 테스트 정확도와 평균 손실을 표시함. 

 

 

학습 단계는 여러 번의 반복 단계(epoch)를 거쳐서 수행됨. 각 epoch에서 모델은 더 나은 예측을 하기 위해 매개변수를 학습함. 각 epoch마다 모델의 정확도(accuracy)와 손실(loss)을 출력함. epoch 마다 정확도가 증가하고 손실이 감소하는 것을 확인하려고 함. 

 

- 관련 정보

named_parameters 메소드를 사용하여 각 layer 별 매개변수(weight, bias) 확인하기[

https://colab.research.google.com/drive/1zyLpiOIVsqZidheC5a0KukVqcQTP4wEq#scrollTo=aWXEf1QWKjOz

 

파이토치 튜토리얼.ipynb

Colaboratory notebook

colab.research.google.com

 

♣ 모델 저장하기

모델을 저장하는 일반적인 방법은 모델의 매개변수들을 포함하여 내부상태사전(internal state dictionary)을 직렬화(serialize) 하는 것. 이 상태 값들은 torch.save 메소드를 사용하여 저장할 수 있음. 

 

♣ 모델 불러오기

모델을 불러오는 과정에는 동일한 모델 구조를 다시 만들고 상태 사전을 모델에 불러오는 과정이 포함됨

♣ 모델을 사용해서 예측하기

test 데이터의 결과값을 추론하기 전에 model.eval() 메소드를 호출하여 드롭아웃과 배치 정규화를 평가모드로 설정해야 함. 그렇지 않으면 일관성 없는 추론 결과가 생성됨. 

 

* 새로운 이미지

- 예측 결과는 틀림ㅠㅜ 사진은 sandal 이었음

 

 

 

♣ 관련 정보

Pytorch 한국 사용자 모임

https://tutorials.pytorch.kr/beginner/basics/quickstart_tutorial.html

 

빠른 시작(Quickstart)

파이토치(PyTorch) 기본 익히기|| 빠른 시작|| 텐서(Tensor)|| Dataset과 Dataloader|| 변형(Transform)|| 신경망 모델 구성하기|| Autograd|| 최적화(Optimization)|| 모델 저장하고 불러오기 이번 장에서는 기계 학습의

tutorials.pytorch.kr

파이토치 튜토리얼 코드

https://colab.research.google.com/drive/1zyLpiOIVsqZidheC5a0KukVqcQTP4wEq#scrollTo=aWXEf1QWKjOz

 

파이토치 튜토리얼.ipynb

Colaboratory notebook

colab.research.google.com