테스트 코드
import torch
import torch.nn as nn
import torchvision.models as models
from torch.autograd import Variable
from torchsummary import summary
import matplotlib.pyplot as plt
import numpy as np
from tensorboardX import SummaryWriter
#1) 텐서보드 생성
tf_summary = SummaryWriter()
#tf_summary = SummaryWriter("./") #특정 폴더
#cuda로 보낸다
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
print('========VGG 테스트 =========')
#==========================================
#1) 모델 생성
model = models.vgg16(pretrained=True).to(device)
print(model)
print("========맨 뒤에 모듈 추가=========")
my_layer2 = nn.Sigmoid()
model.classifier.add_module("7", my_layer2)
print(model)
print('========= Summary로 보기 =========')
#Summary 때문에 cuda, cpu 맞추어야 함
#뒤에 값이 들어갔을 때 내부 변환 상황을 보여줌
#adaptive average pool이 중간에서 최종값을 바꿔주고 있음
summary(model, (3, 100, 100))
#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 = 1e-4
#optimizer = torch.optim.Adam(model.parameters(), lr=learning_rate)
optimizer = torch.optim.SGD(model.parameters(), lr=0.01, momentum=0.9)
#optimizer = torch.optim.Adagrad(model.parameters(), lr=0.01)
#모델이 학습 모드라고 알려줌
model.train()
#----------------------------
#epoch training
for i in range (10):
#옵티마이저 초기화
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)
#=============================
#loss는 텐서이므로 item()
print("epoch: {} loss:{} ".format(i, loss.item()))
#================================
#2) 텐서보드 값 입력
tf_summary.add_scalar('loss/loss_a', loss.item(), i)
tf_summary.add_scalar('learning_rate', learning_rate, i)
#loss diff값을 뒤로 보내서 grad에 저장하고
loss.backward()
#저장된 grad값을 기준으로 activation func을 적용한다.
optimizer.step()
#3) 텐서보드 꼭 닫기
tf_summary.close()
1. Tensorflow, Tensorboard, Tensorboardx, Chardet 를 먼저 설치해주어야 한다.
파이참을 열고 File->Settings->저 빨간 버튼을 눌러서 검색창에 위의 라이브러리들을 검색하면 설치할 수 있다.
2. 그 후 위의 코드를 돌려보면 runs 폴더에 로그파일이 하나 생성될것이다.
3. 위의 로그파일이 생성되었다면 아나콘다 cmd창을 켜준후 명령어를 입력한다.
1. conda env list : 콘다 가상환경 리스트를 불러온다.
2. conda activate 가상환경이름 : 원하는 환경을 활성화시킨다.
3. tensorboard --logdir="./runs" : 텐서보드를 이용하여 해당 폴더를 읽어 불러온다.
4. ip주소가 떴다면 성공이다. Ctrl+클릭해서 웹사이트를 열어본다. (혹시 그래프가 안뜨면 코드를 다시한번 실행시켜보자.)
4. 텐서보드에 그래프가 성공적으로 그려진 모습.
이전에 쓰던 matplot 등의 시각화 라이브러리와는 달리 훨씬 진보된 그래프를 사용할 수 있다. 실제 딥러닝을 할때에는 TensorBoard를 필수로 사용하는 것 같다.
'수업내용 정리' 카테고리의 다른 글
[인공지능 응용] loss값을 동적으로 조절하기 (0) | 2023.05.12 |
---|---|
ActivationFuction, Learninglate, LossFunction 별 그래프 출력 (0) | 2023.04.28 |
[인공지능 응용] CIFAR10 예제 공부하기 (0) | 2023.04.06 |