본래 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
파이토치에서는 자동 미분이 가능함 !
이 부분은 파이토치 튜토리얼에 자세히 나와있으므로 해당 튜토리얼의 코드를 구현하는것으로 대체
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 등등 보유
'👩💻LEARN : ML&Data > Lecture' 카테고리의 다른 글
[CS231n] Lecture10. Recurrent Neural Networks (0) | 2023.05.16 |
---|---|
[CS231n] Lecture9. CNN Architecture (0) | 2023.05.16 |
[CS231n] Lecture6. Training Neural Networks 2 (0) | 2023.05.15 |
[CS231n] Lecture6. Training Neural Networks 1 (0) | 2023.05.14 |
[CS231n] Lecture5. Convolutional Neural Networks (0) | 2023.05.14 |