예습 - CNN(Convolutional neural network) 주로 이미지나 영상데이터를 처리할 때 쓰임
트랜스포머가 목표 자연어랑 딥러닝 같이 하는걸로 변경
19일부터 모델 얹이는 거 연습 복습철저히 할것
20일부터 프로젝트
회귀는 시그모이드
다중분류는 소프트맥스
class RegressionModel(nn.Module):
def __init__(self):
super(RegressionModel, self).__init__()
self.layer1 = nn.Linear(5, 120)
self.layer2 = nn.Linear(120, 100)
self.layer3 = nn.Linear(100, 100)
self.out_layer = nn.Linear(100, 1)
def forward(self, x):
x = torch.sigmoid(self.layer1(x))
x = torch.sigmoid(self.layer2(x))
x = torch.sigmoid(self.layer3(x))
x = self.out_layer(x)
return x
2-1 모델 호출
model = RegressionModel()
3.학습 방식 설정 : loss & optimizer 정의
criterion = nn.MSELoss()
optimizer = optim.SGD(model.parameters(), lr=0.00001)
4.모델 학습
4-1 모델 값 저장 및 에폭시 지정
num_epochs = 800
train_losses = []
valid_losses = []
4-2 모델학습
for epoch in range(num_epochs):
model.train() # 모델을 훈련 모드로 설정
for inputs, targets in train_loader: # inputs 검증데이터의 입력을. # targets는 해당 레이블을 나타냄
optimizer.zero_grad() # 1. 기울기 누적을 피해 0으로 설정
outputs = model(inputs) # 순전파 시작
loss = criterion(outputs, targets) # 예측된 출력과 실제 타겟간의 손실 계산
loss.backward() # 역전파로 모델 기울기 계산
optimizer.step() # 옵티마이저로 파라미터 업데이트
# Validation loss
# 모델 학습 끔 왜? 모델을 훈련할때는 기울기 추척이 필요하지만
# 평가할땐 필요가 없다!
model.eval()
with torch.no_grad():
# 검증에서 가져온 각 배치에 대한 총 검증 손실 계산
valid_loss = sum(criterion(model(inputs), targets) for inputs, targets in valid_loader)
# 200번의 에포크 마다 훈련 손실을 출력
if (epoch+1) % 200 == 0:
print(f'Epoch [{epoch+1}/{num_epochs}], Loss: {loss.item():.4f}')
# 분석이나 플로팅을 위해 훈련 및 검증 손실 저장
train_losses.append(loss.item()) # .item()메서드로 해당 스칼라 가져오기
valid_losses.append(valid_loss.item())
5.모델 평가
테스트 데이터로 모델 평가
model.eval()
with torch.no_grad():
for inputs, targets in test_loader:
outputs = model(inputs) # 순전파
test_loss = criterion(outputs, targets)
print("\n Test RMSE: %.4f" % torch.sqrt(test_loss).item())
모르는 키워드
broadcasting 이란? 행렬의 생김세가 달라도 연산 가능하게 해주는 것(자동으로 맞춰줌)
필수조건 : 둘중하나는 반드시 스칼라여야 함