Activation function 종류별 성능
1. Adam
2. Adamax
3. ASGD
4. Rprop
Learning Rate별 성능
MESLoss, Adam Activation Function으로 진행. loss가 1보다 작아질 때까지 돌림.
1. lr = 0.0001
2. lr = 0.00001
3. lr = 0.00005
4. lr = 0.000005
5. lr = 0.000001
Loss Function 별 성능
lr = 0.00001, optimizer = Adam
1. MSELoss()
2. SmoothL1Loss()
3. L1Loss()
베이스코드
#Pretrained NN이 항상 1이 나오도록 학습시킨다.
#Gound Truth를 1로 넣어주고 학습 시킨 후 모델 저장, 이후 test 해보면 1에 가까운 값이 나온다.
#하지만 1을 넘기는 값이 나오는 문제가 발생.
#파이썬 기반의 계산 라이브러리. 딥러닝 모델을 쉽게 구성하고 학습시킬 수 있다.
import torch
#PyTorch 라이브러리에서 제공하는 신경망 모듈을 사용하기 위한 코드. nn.Module 클래스를 상속받아 신경망 모델을 정의할 수 있다.
import torch.nn as nn
#PyTorch 라이브러리에서 제공하는 이미지 분류를 위한 대표적인 딥러닝 모델인 VGG, ResNet, DenseNet 등을 제공한다.
import torchvision.models as models
from torch.autograd import Variable
from torchsummary import summary
#데이터 시각화를 위한 Plotly 라이브러리를 불러온다.
import plotly.express as px
#데이터 분석을 위한 라이브러리
import pandas as pd
#PyTorch에서 제공하는 변수 클래스 Variable을 불러온다. Variable은 tensor를 래핑한 객체이다.
from torch.autograd import Variable
#PyTorch 모델의 구조를 출력하는 함수 summary를 사용하기 위한 코드. 모델의 구조와 파라미터 수 등을 쉽게 확인할 수 있다.
from torchsummary import summary
#import os
#os.environ["LMP_DUPLICATE_LIB_OK"] = "TRUE"
#cuda로 보낸다
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
print('========VGG 테스트 =========')
print("========입력데이터 생성 [batch, color, image x, image y]=========")
#이미지 사이즈를 어떻게 잡아도 vgg는 다 소화한다.
#==========================================
#1) 모델 생성
model = models.vgg16(pretrained=True).to(device)
print(model)
print('========= Summary로 보기 =========')
#Summary 때문에 cuda, cpu 맞추어야 함
#뒤에 값이 들어갔을 때 내부 변환 상황을 보여줌
#adaptive average pool이 중간에서 최종값을 바꿔주고 있음
summary(model, (3, 100, 100))
print("========model weight 값 측정=========")
'''
for name, param in model.named_parameters():
if param.requires_grad:
print (name, param.data)
'''
#2) loss function
#꼭 아래와 같이 2단계, 클래스 선언 후, 사용
criterion = nn.MSELoss()
#criterion = nn.SmoothL1Loss()
#criterion = nn.L1Loss()
#criterion = nn.Tanh()
#criterion = nn.KLDivLoss()
#criterion = nn.NLLLoss()
#criterion = nn.CrossEntropyLoss()
#criterion = nn.MarginRankingLoss()
#criterion = nn.CosineEmbeddingLoss()
#3) activation function :
learning_rate = 0.000005
#learning_rate = 0.001 #이렇게 하면 부동 소수점 에러
optimizer = torch.optim.Adam(model.parameters(), lr=learning_rate)
#optimizer = torch.optim.Adamax(model.parameters(), lr=learning_rate)
#optimizer = torch.optim.ASGD(model.parameters(), lr=learning_rate)
#optimizer = torch.optim.Rprop(model.parameters(), lr=learning_rate)
#모델이 학습 모드라고 알려줌
model.train()
#loss들을 담을 list
loss_list = []
#제일 큰 loss값 정의.
max_loss = 10
#epoch란 딥러닝모델에서 전체 데이터셋을 한 번 훑는 과정.
epoch = 0
#epoch를 담을 리스트.
epoch_list = []
#----------------------------
#epoch training
#for i in range (10):
while True:
#옵티마이저 초기화
optimizer.zero_grad()
#입력값 생성하고
a = torch.randn(12,3,100,100).to(device)
#모델에 넣은다음
result = model(a)
#결과와 동일한 shape을 가진 Ground-Truth 를 읽어서
#target = torch.randn_like(result)
#타겟값을 1로 바꾸어서 네트워크가 무조건 1만 출력하도록 만든다. 오버피팅 될수도있음.
target = torch.ones_like(result)
#네트워크값과의 차이를 비교
loss = criterion(result, target).to(device)
if(loss<1.002):
break
# 배열에 차이 저장.
loss_list.append(loss.item())
epoch_list.append(epoch)
#=============================
#loss는 텐서이므로 item()
print("epoch: {} loss:{} ".format(epoch, loss.item()))
#loss diff값을 뒤로 보내서 grad에 저장하고
loss.backward()
#저장된 grad값을 기준으로 activation func을 적용한다.
optimizer.step()
epoch += 1
#epoch수와 해당epoch에서의 loss값을 갖는 데이터프레임을 만든다.
df = pd.DataFrame(dict(
epoch=epoch_list,
Loss=loss_list
))
#위에서 정의한 데이터프레임을 이용하여 loss값의 변화를 시각화하는 그래프 생성.
fig = px.line(df, x="epoch", y="Loss", title='Loss Visualization')
#그래프 출력
fig.show()
print("=========== 학습된 파라미터만 저장 ==============")
torch.save(model.state_dict(), 'trained_model.pt')
print("=========== 전체모델 저장 : VGG 처럼 모델 전체 저장==============")
torch.save(model, 'trained_model_all.pt')
'수업내용 정리' 카테고리의 다른 글
[인공지능 응용] loss값을 동적으로 조절하기 (0) | 2023.05.12 |
---|---|
[인공지능 응용] Tensorboard로 그래프 출력하기 (0) | 2023.05.12 |
[인공지능 응용] CIFAR10 예제 공부하기 (0) | 2023.04.06 |