파이토치 한국사용자 모임의 글을 보면서 공부한 내용을 정리한 글입니다.
신경망은 연산을 수행하는 계층/모듈로 구성된다.
torch.nn 네임스페이스는 신경망을 구성하는데 필요한 모든 구성 요소를 제공한다.
PyTorch의 모든 모듈은 nn.Module의 하위 클래스이다.
신경망은 다른 모듈로 구성된 모듈이다.
Import
import os
import torch
from torch import nn
from torch.utils.data import DataLoader
from torchvision import datasets, transforms
device 세팅
device = (
"cuda"
if torch.cuda.is_available()
else "mps"
if torch.backends.mps.is_available()
else "cpu"
)
print(f"Using {device} device")
신경망 모델을 nn.Module의 하위 클래스로 정의하고 __init__에서 신경망 계층들을 초기화한다.
forward 메소드에 입력 데이터에 대한 연산들을 구현한다.
class NeuralNetwork(nn.Module):
def __init__(self):
super().__init__()
self.flatten = nn.Flatten()
self.linear_relu_stack = nn.Sequential(
nn.Linear(28*28, 512),
nn.ReLU(),
nn.Linear(512, 512),
nn.ReLU(),
nn.Linear(512, 10),
)
def forward(self, x):
x = self.flatten(x)
logits = self.linear_relu_stack(x)
return logits
모델의 인스턴스를 생성하고 device로 이동한뒤, 구조를 출력한다.
model = NeuralNetwork().to(device)
print(model)
모델을 사용하기 위해 입력 데이터를 전달한다.
- 일부 백그라운드 연산들과 함께 모델의 "forward" 메서드를 실행한다. (*model.forward()를 직접 호출하면 안됨!)
- 입력을 전달하면 2차원 텐서를 반환 -> dim=0은 각 분류(class)에 대한 원시(raw) 예측값, dim=1은 각 출력의 개별 값들이 해당
- 원시 예측값을 nn.Softmax 모듈의 인스턴스에 통과시켜 예측 확률을 얻는다.
X = torch.rand(1, 28, 28, device=device)
logits = model(X)
pred_probab = nn.Softmax(dim=1)(logits)
y_pred = pred_probab.argmax(1)
print(f"Predicted class: {y_pred}")
모델 계층(Layer)
Input Data
input_image = torch.rand(3,28,28)
print(input_image.size())
nn.Flatten : dim=1의 미니배치 차원은 유지, 28 * 28의 이미지를 784로 변환(펼치기)
flatten = nn.Flatten()
flat_image = flatten(input_image)
print(flat_image.size())
nn.Linear : 저장된 가중치(weight)와 편향(bias)을 사용하여 입력에 선형 변환(Linear transformation)을 적용하는 모듈
layer1 = nn.Linear(in_features=28*28, out_features=20)
hidden1 = layer1(flat_image)
print(hidden1.size())
nn.ReLU : 비선형 활성화(activation)은 모델의 입력과 출력 사이에 복잡한 관계(mapping)를 만든다. 선형 변환 후에 적용되어 비선형성을 도입하고, 신경망이 다양한 현상을 학습할 수 있게 돕는다.
print(f"Before ReLU: {hidden1}\n\n")
hidden1 = nn.ReLU()(hidden1)
print(f"After ReLU: {hidden1}")
nn.Sequential : 순서를 갖는 모듈의 컨테이너이다. 데이터는 정의된 것과 같은 순서로 모든 모듈을 전달한다.
seq_modules = nn.Sequential(
flatten,
layer1,
nn.ReLU(),
nn.Linear(20, 10)
)
input_image = torch.rand(3,28,28)
logits = seq_modules(input_image)
nn.Softmax : 신경망의 마지막 선형 계층은 nn.Softmax에 전달될([-infty,infty] 범위의 raw value인)logits을 반환한다. logits는 모델의 각 분류(class)에 대한 예측 확률을 나타내도록 [0,1] 범위로 비례하여 조정(scale)된다. dim은 값의 합이 1이 되는 차원을 나타낸다.
softmax = nn.Softmax(dim=1)
pred_probab = softmax(logits)
모델 매개변수
신경망 내부의 많은 계층들은 매개변수화 된다.
parameters(), named_parameters() 메소드로 모든 매개변수에 접근할 수 있다.
print(f"Model structure: {model}\n\n")
for name, param in model.named_parameters():
print(f"Layer: {name} | Size: {param.size()} | Values : {param[:2]} \n")
4. Create Neural Network.ipynb
Colaboratory notebook
colab.research.google.com
'AI > AI 라이브러리' 카테고리의 다른 글
[Pytorch] 모델 매개변수 최적화하기 (0) | 2023.12.28 |
---|---|
[Pytorch] Autograd (0) | 2023.12.28 |
[Pytorch] 변형(Transform) (0) | 2023.12.27 |
[Pytorch] 데이터셋 (0) | 2023.12.27 |
[Pytorch] 파이토치 시작하기 (0) | 2023.12.27 |