In [1]데이터 준비
data__transform = transforms.Compose([
transforms.ToTensor(),
transforms.Resize(32),
transforms.Normalize((0.5,), (1.0))
])
train_data = datasets.MNIST(root='./', train=True, transform=data__transform, download=True)
test_data = datasets.MNIST(root='./', train=False, transform=data__transform, download=True)
train_loader = DataLoader(train_data, batch_size=32, shuffle=True)
test_loader = DataLoader(test_data, batch_size=32)
In [2]학습 (TensorBoard 기록)
model.to(device)
epochs = 10
optim = Adam(model.parameters(), lr=1e-3)
ciriterion = nn.CrossEntropyLoss()
writer = SummaryWriter()
count = 0
for epoch in range(epochs):
for data, label in train_loader:
optim.zero_grad()
pred = model(data.to(device))
loss = ciriterion(pred, label.to(device))
writer.add_scalar('Loss/train', loss, count)
count += 1
loss.backward()
optim.step()
print(f'epoch: {epoch+1} / loss: {loss.item()}')
Out[2] 출력 보기
epoch: 1 / loss: 0.8837156295776367
epoch: 2 / loss: 0.8420839905738831
...
epoch: 10 / loss: 0.7967485189437866
In [3]평가
model.eval()
total_corr = 0
with torch.no_grad():
for images, labels in test_loader:
preds = model(images.to(device))
_, pred = torch.max(preds.data, 1)
total_corr += (pred == labels.to(device)).sum().item()
print(f'acc: {total_corr/len(test_data.targets)}')
Out[3] 출력 보기
acc: 0.9871
In [4]Grad-CAM
from pytorch_grad_cam import GradCAM
from pytorch_grad_cam.utils.image import show_cam_on_image
from pytorch_grad_cam.utils.model_targets import ClassifierOutputTarget
ca = GradCAM(model=model, target_layers=[model.conv2])
image, _ = test_data[1]
input_tensor = image.unsqueeze(0).to(device)
pred_class = model(input_tensor).argmax().item()
grayscale_cam = ca(input_tensor=input_tensor, targets=[ClassifierOutputTarget(pred_class)])