👩‍💻LEARN : ML&Data/Lecture

[CS231n] Lecture8. Deep Learning SW - Pytorch

쟈니유 2023. 5. 16. 20:00
728x90

 

본래 cs231n 2017강의에서는 CPU,GPU의 차이와 딥러닝 프레임워크 TensorFlow, Pytorch에 대해 강의한다.

앞 부분은 스킵하고 Pytorch 요점만 간단하게 정리한다. 

 

파이토치 주요 구성 요소 

큰 맥락만 정리했으며, 파이토치는 워낙 업데이트가 잦아서 아래 내용이 이젠 다를 수도 있다. 

 

1. Tensor

ndarray(배열)! 그런데 GPU에서 연산이 가능함 

dtype = torch.cuda.FloatTensor #GPU에서 돌리기 

x = torch.randn(64, 100).type(dtype) #임의 숫자로 텐서 만들기

2. Variable

연산그래프에서의 노드라고 생각하면 됨. 데이터랑 gradient 저장 

...그런데 2021년 쯤 부터 tensor 에 variable의 성격을 같이 업데이트 해서 더이상 안쓰인다고 함! 패스 

 

2. Autograd 

파이토치에서는 자동 미분이 가능함 !

이 부분은 파이토치 튜토리얼에 자세히 나와있으므로 해당 튜토리얼의 코드를 구현하는것으로 대체 

 

torch.autograd 에 대한 간단한 소개

torch.autograd 는 신경망 학습을 지원하는 PyTorch의 자동 미분 엔진입니다. 이 단원에서는 autograd가 신경망 학습을 어떻게 돕는지에 대한 개념적 이해를 할 수 있습니다. 배경(Background): 신경망(NN; Neur

tutorials.pytorch.kr

 

import torch
from torchvision.models import resnet18, ResNet18_Weights

#임의로 모델을 불러오고 데이터를 세팅한다 (모델 구현은 여기서는 아직 중요한게 아니니까) 
model = resnet18(weights=ResNet18_Weights.DEFAULT)
data = torch.rand(1, 3, 64, 64)
labels = torch.rand(1, 1000)

#모델에 데이터를 넣고 통과시킨다. 
prediction = model(data) # 순전파 단계(forward pass)
#오차를 계산하고 역전파시킨다. backward() 하나면 됨 최고임 
loss = (prediction - labels).sum()

model.zero_grad() #이전 배치, 루프에서 저장되어있을 수도 있는 grad들 초기화시키기 
loss.backward() # 역전파 단계(backward pass)

#최적화를 위해 옵티마이저를 불러와 모델의 파라미터에 적용시키고 파라미터 값을 세팅한다. 
optim = torch.optim.SGD(model.parameters(), lr=1e-2, momentum=0.9)

#마지막으로 .step 을 호출하여 경사하강법(gradient descent)을 수행한다.
#옵티마이저는 grad 에 저장된 변화도에 따라 각 매개변수를 조정(adjust)
optim.step() # 경사하강법(gradient descent)

3. Module 

신경망 레이어로 (nn 모듈이 이에 포함) tf.layer와 다른 연산을 위해 필요한 것들을 주로 담고 있음 

 

[nn]

neural net에서 작동하는 고차원의 wrapper! 텐서플로우의 Keras와 유사한데 다른 특징들도 많이 갖고 있ㄷㅏ.

 

사용법1. 모델 정의 

import torch

#x,y를 여기에서 대충 정해줬다고 봅시다#

model = torch.nn.Sequential(
	torch.nn.Linear(D_in,H),
    torch.nn.ReLU(),
    torch.nn.Linear.Linear(H,D_out)
    )

사용법2. 오차 정의 

#위에 이어서 

loss_fn = torch.nn.MSELoss(size_average=False)

 

사용법3. 새로운 모듈 자체 제작 가능

import torch 

class TwoLayerNet(torch.nn.Module):
	def __init__(self, D_in, H, D_out):
    	super(TwoLayerNet, self).__init__()
        self.linear1 = torch.nn.Linear(D_in, H)
        self.linear2 = torch.nn.Linear(H, D_out)
        
    def forward(self,x):
    	h_relu = self.linear1(x).clamp(min=0) #원래 선형함수인데 최소값은 무조건 0이 되게 해서 자체적으로 렐루를 만든 것
        y_pred = self.linear2(h_relu)
        return y_pred 

#위의 모델 적용해보기 

N, D_in,H,D_out = 64,1000,100,10 

model = TwoLayerNet(D_in,H,D_out) 

criterion = torch.nn.MSELoss(size_average=False)
optimizer = torch.optim.SGD(model.parameters(), lr=1e-4)

for t in range(500):
	y_pred = model(x) 
    loss = criterion(y_pred,y)
    
    optimizer.zero_grad()
    loss.backward()
    optimizer.step()

 

 

[optim]

다양한 옵티마이저들 사용

optimizer = torch.optim.Adam(model.parameters(), lr=1e-2)

 

[DataLoaders]

데이터셋을 집약시키고 미니배치, 셔플링 등을 제공해줌. 직접 데이터를 사용하고 싶으면 데이터로더를 사용하면 됨 

loader의 출력으로는 텐서가 나옴 

import torch
from torch.utils.data import DataLoader , TensorDataset

loader = DataLoader(TensorDataset(x,y), batch_size = 8)

#...생략...#

for epoch in range(10):
	for x_batch, y_batch in loader :
    	y_pred = model(x)
        loss = criterion(y_pred, y)
        
        #...#

 

[Torchvision]

사전에 학습된 모델을 제공해줌

import torch
import torchvision

alexnet = torchvision.models.alexnet(pretrained=True)
#vgg16, resnet101 등등 보유