수업내용 정리

ActivationFuction, Learninglate, LossFunction 별 그래프 출력

Honey Badger 2023. 4. 28. 14:20

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')