-
Notifications
You must be signed in to change notification settings - Fork 45
/
utils.py
108 lines (86 loc) · 3.92 KB
/
utils.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
import numpy as np
import random
import torch
import torchvision
from torch.autograd import Variable
from torchvision import transforms, models
import torch.nn.functional as F
from model import *
from Resnet import *
def cosine_anneal_schedule(t, nb_epoch, lr):
cos_inner = np.pi * (t % (nb_epoch)) # t - 1 is used when t has 1-based indexing.
cos_inner /= (nb_epoch)
cos_out = np.cos(cos_inner) + 1
return float(lr / 2 * cos_out)
def load_model(model_name, pretrain=True, require_grad=True):
print('==> Building model..')
if model_name == 'resnet50_pmg':
net = resnet50(pretrained=pretrain)
for param in net.parameters():
param.requires_grad = require_grad
net = PMG(net, 512, 200)
return net
def model_info(model): # Plots a line-by-line description of a PyTorch model
n_p = sum(x.numel() for x in model.parameters()) # number parameters
n_g = sum(x.numel() for x in model.parameters() if x.requires_grad) # number gradients
print('\n%5s %50s %9s %12s %20s %12s %12s' % ('layer', 'name', 'gradient', 'parameters', 'shape', 'mu', 'sigma'))
for i, (name, p) in enumerate(model.named_parameters()):
name = name.replace('module_list.', '')
print('%5g %50s %9s %12g %20s %12.3g %12.3g' % (
i, name, p.requires_grad, p.numel(), list(p.shape), p.mean(), p.std()))
print('Model Summary: %g layers, %g parameters, %g gradients\n' % (i + 1, n_p, n_g))
def jigsaw_generator(images, n):
l = []
for a in range(n):
for b in range(n):
l.append([a, b])
block_size = 448 // n
rounds = n ** 2
random.shuffle(l)
jigsaws = images.clone()
for i in range(rounds):
x, y = l[i]
temp = jigsaws[..., 0:block_size, 0:block_size].clone()
jigsaws[..., 0:block_size, 0:block_size] = jigsaws[..., x * block_size:(x + 1) * block_size,
y * block_size:(y + 1) * block_size].clone()
jigsaws[..., x * block_size:(x + 1) * block_size, y * block_size:(y + 1) * block_size] = temp
return jigsaws
def test(net, criterion, batch_size):
net.eval()
use_cuda = torch.cuda.is_available()
test_loss = 0
correct = 0
correct_com = 0
total = 0
idx = 0
device = torch.device("cuda:0,1")
transform_test = transforms.Compose([
transforms.Scale((550, 550)),
transforms.CenterCrop(448),
transforms.ToTensor(),
transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5)),
])
testset = torchvision.datasets.ImageFolder(root='./bird/test',
transform=transform_test)
testloader = torch.utils.data.DataLoader(testset, batch_size=batch_size, shuffle=True, num_workers=4)
for batch_idx, (inputs, targets) in enumerate(testloader):
idx = batch_idx
if use_cuda:
inputs, targets = inputs.to(device), targets.to(device)
inputs, targets = Variable(inputs, volatile=True), Variable(targets)
output_1, output_2, output_3, output_concat= net(inputs)
outputs_com = output_1 + output_2 + output_3 + output_concat
loss = criterion(output_concat, targets)
test_loss += loss.item()
_, predicted = torch.max(output_concat.data, 1)
_, predicted_com = torch.max(outputs_com.data, 1)
total += targets.size(0)
correct += predicted.eq(targets.data).cpu().sum()
correct_com += predicted_com.eq(targets.data).cpu().sum()
if batch_idx % 50 == 0:
print('Step: %d | Loss: %.3f | Acc: %.3f%% (%d/%d) |Combined Acc: %.3f%% (%d/%d)' % (
batch_idx, test_loss / (batch_idx + 1), 100. * float(correct) / total, correct, total, 100. * float(correct_com) / total, correct_com, total))
test_acc = 100. * float(correct) / total
test_acc_en = 100. * float(correct_com) / total
test_loss = test_loss / (idx + 1)
return test_acc, test_acc_en, test_loss