class MyModel(nn.Module) :
def __init__(self) :
super(MyModel, self).__init__()
self.fcl_1 = nn.Linear(10, 10)
...
def forward(self, x) :
...
return y
criterion = torch.nn.MSELoss()
loss = criterion(y_pred, y_true)
loss.backward()
# SGD 옵티마이저 생성
optimizer = torch.optim.SGD(model.parameters(), lr=1e-4)
optimizer.zero_grad()
optimizer.step()
# 모듈 임포트
import torch
import torch.nn as nn
import torch.optim as optim
import numpy as np
# 모델 생성
class FCLModel(nn.Module) :
def __init__(self) :
super(FCLModel, self).__init__()
# FCL 2층 후 분류기
self.linear_1 = nn.Linear(784, 128)
self.linear_2 = nn.Linear(128, 128)
self.out = nn.Linear(128, 10)
# 여기에서 네트워크의 순서를 정의
def forward(self, x) :
x = self.linear_1(x)
x = nn.ReLU()(x)
x = self.linear_2(x)
x = nn.ReLU()(x)
y = self.out(x)
return y
# 실행부분 정의
def main() :
# 모델생성
model = FCLModel()
# 손실모듈 생성 pytorch의 CrossEntropy는 log softmax를 포함
criterion = nn.CrossEntropyLoss()
# 옵티마이저 생성
optimizer = optim.Adam(model.parameters(), lr=0.001)
# 임시 랜덤 데이터 생성
x_train = torch.randn((5, 784), dtype=torch.float32)
y_train = torch.randint(10, size =(5,))
y_pred = model(x_train)
# loss 계산 (원핫이 아닌 그냥 레이블을 집어넣음)
loss = criterion(y_pred, y_train)
# 옵티마이저 초기화 (위치 수정했습니다 ㅠㅠ)
optimizer.zero_grad()
# 역전파 계산 (내부에 지정된 grad_fn 사용)
loss.backward()
# 옵티마이저 업데이트
optimizer.step()
# 그냥 놔두면 썰렁하니 출력
print(loss)
from torch.utils.data import Dataset, DataLoader
# 데이터 불러오는 클래스 정의
class MyDataSet(Dataset) :
# 여기서 데이터를 불러오거나 데이터 불러오기 위한 준비를한다
def __init__(self) :
...
# 여기서 인덱스와 데이터를 연결해서 반환해줌
def __getitem__(self, index) :
...
return x, y
# 데이터 전체 길이 반환하는 함수 정의
def __len__(self) :
length = ...
return length
# 위에서 정의한 클래스 객체 생성
dataset = MyDataSet()
# 데이터셋과 연결된 Loader 생성
train_loader = DataLoader(dataset = dataset,
batch_size = 32,
shuffle = True,
num_workers = 0)
# 학습
for epoch in range(1, epochs+1) :
for i, (input, label) in enumerate(train_loader) :
...