Search

Pytorch TensorBoard

대분류
인공지능/데이터
소분류
ML/DL 정리 노트
유형
딥 러닝
부유형
Introduction Pytorch
최종 편집 일시
2024/10/27 15:18
생성 일시
2024/10/17 00:21
14 more properties

Pytorch TensorBoard

TensorBoard는 머신러닝 실험을 위한 시각화 툴킷(toolkit)
TensorBoard를 사용하면 손실 및 정확도와 같은 측정 항목을 추적 및 시각화하는 것, 모델 그래프를 시각화하는 것, 히스토그램을 보는 것, 이미지를 출력하는 것 등이 가능

PyTorch로 TensorBoard 사용하기

먼저 SummaryWriter 인스턴스를 생성
import torch from torch.utils.tensorboard import SummaryWriter writer = SummaryWriter()
Python
복사
Writer는 기본적으로 ./runs/ 디렉터리에 출력
# 입력 데이터 생성 x = torch.arange(-5, 5, 0.1).view(-1, 1) # 입력값 x를 -5에서 5까지 생성 y = -5 * x + 0.1 * torch.randn(x.size()) # y는 x에 노이즈를 더한 값 # 모델, 손실 함수, 옵티마이저 설정 model = torch.nn.Linear(1, 1) # 선형 회귀 모델 criterion = torch.nn.MSELoss() # 평균 제곱 오차 손실 함수 optimizer = torch.optim.SGD(model.parameters(), lr=0.1) # SGD 옵티마이저 # 모델 학습 함수 def train_model(iter): for epoch in range(iter): model.train() # 모델을 학습 모드로 설정 y1 = model(x) # 모델의 예측값 계산 loss = criterion(y1, y) # 손실 값 계산 # TensorBoard에 epoch, 손실 값(loss) 기록 writer.add_scalar("Loss/sample", loss.item(), epoch) # 손실을 TensorBoard에 기록 (그래프 이름, y축 데이터, x축 데이터) optimizer.zero_grad() # 기울기 초기화 loss.backward() # 역전파를 통해 기울기 계산 optimizer.step() # 옵티마이저 스텝을 통해 파라미터 업데이트 # 모델 학습 (10번의 에포크 동안) train_model(10) # 기록된 데이터 저장 writer.flush() writer.close()
Python
복사
%load_ext tensorboard %tensorboard --logdir=runs
Python
복사
나오는 화면

Full implementation

사전에 필요한 작업들
1.
데이터 불러오기
2.
모델 설정
3.
하이퍼파라미터 설정
4.
Backpropagation
optimizer.zero_grad()
역전파 단계를 실행하기 전에 각 파라미터들의 변화도(gradient)를 0으로 재설정
loss.backward()
역전파 단계: 모델의 학습 가능한 모든 매개변수에 대해 손실의 변화도 계산
optimizer.step()
변화도를 계산한 뒤에 optimizer.step()을 호출하여 역전파 단계에서 수집된 변화도로 매개변수 조정
def train_loop(dataloader, model, loss_fn, optimizer, epoch): size = len(dataloader.dataset) # 데이터셋의 전체 크기를 저장한다. for batch, (X, y) in enumerate(dataloader): # dataloader에서 데이터를 배치 단위로 가져온다. # Compute prediction and loss (예측과 손실 계산) pred = model(X) # 모델을 사용하여 입력 X에 대한 예측을 수행한다. loss = loss_fn(pred, y) # 예측 결과와 실제 값(y)을 비교하여 손실을 계산한다. writer.add_scalar("Loss/train", loss, epoch) # 현재 에포크에서의 훈련 손실 값을 기록한다. # Backpropagation (역전파) optimizer.zero_grad() # 이전 배치에서의 기울기를 초기화한다. loss.backward() # 손실에 대한 기울기를 계산한다. optimizer.step() # 계산된 기울기를 사용하여 모델의 파라미터를 업데이트한다. if batch % 100 == 0: # 100 배치마다 출력 loss, current = loss.item(), batch * len(X) # 손실 값을 가져오고, 현재 배치까지의 데이터 양을 계산한다. print(f"loss: {loss:>7f} [{current:>5d}/{size:>5d}]") # 손실 값과 진행 상황을 출력한다.
Python
복사
def test_loop(dataloader, model, loss_fn, epoch): size = len(dataloader.dataset) # 테스트 데이터셋의 전체 크기를 저장한다. test_loss, correct = 0, 0 # 총 손실과 맞춘 예측 수를 초기화한다. with torch.no_grad(): # 기울기 계산을 하지 않도록 설정 (테스트에서는 필요 없음) for X, y in dataloader: # dataloader에서 테스트 데이터를 배치 단위로 가져온다. pred = model(X) # 모델을 사용하여 입력 X에 대한 예측을 수행한다. loss = loss_fn(pred, y) # 예측 결과와 실제 값(y)을 비교하여 손실을 계산한다. writer.add_scalar("Loss/test", loss, epoch) # 현재 에포크에서의 테스트 손실 값을 기록한다. test_loss += loss.item() # 손실 값을 누적하여 총 손실을 계산한다. correct += (pred.argmax(1) == y).type(torch.float).sum().item() # 맞춘 예측의 수를 계산한다. test_loss /= size # 평균 손실 값을 계산한다. correct /= size # 정확도를 계산한다. print(f"Test Error: \n Accuracy: {(100*correct):>0.1f}%, Avg loss: {test_loss:>8f} \n") # 테스트 결과를 출력한다.
Python
복사
loss_fn = nn.CrossEntropyLoss() # 손실 함수로 CrossEntropyLoss를 사용한다. 다중 클래스 분류 문제에서 자주 사용된다. optimizer = torch.optim.SGD(model.parameters(), lr=learning_rate) # 옵티마이저로 SGD(확률적 경사하강법)를 사용한다. 학습률(lr)을 설정하여 파라미터 업데이트 속도를 조절한다. epochs = 10 # 전체 학습할 에포크 수를 설정한다. for epoch in range(epochs): # 각 에포크에 대해 반복한다. print(f"Epoch {epoch+1}\n-------------------------------") train_loop(train_dataloader, model, loss_fn, optimizer, epoch) # 훈련 루프를 실행한다. test_loop(test_dataloader, model, loss_fn, epoch) # 테스트 루프를 실행하여 모델을 평가한다. writer.flush() # 텐서보드에 기록된 데이터를 저장 및 출력한다. print("Done!") # 학습이 완료되었음을 알린다.
Python
복사

TensorBoard

writer.close() %load_ext tensorboard %tensorboard --logdir=runs
Python
복사