Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit adc1cdc

Browse files
committed
print MMD/JMMD loss
1 parent 92748d9 commit adc1cdc

File tree

3 files changed

+74
-35
lines changed

3 files changed

+74
-35
lines changed

pytorch/src/loss.py

Lines changed: 42 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -30,15 +30,6 @@ def DAN(source, target, kernel_mul=2.0, kernel_num=5, fix_sigma=None):
3030
kernels = guassian_kernel(source, target,
3131
kernel_mul=kernel_mul, kernel_num=kernel_num, fix_sigma=fix_sigma)
3232

33-
# Linear version
34-
# loss = 0
35-
# for i in range(batch_size):
36-
# s1, s2 = i, (i+1)%batch_size
37-
# t1, t2 = s1+batch_size, s2+batch_size
38-
# loss += kernels[s1, s2] + kernels[t1, t2]
39-
# loss -= kernels[s1, t2] + kernels[s2, t1]
40-
# return loss / float(batch_size)
41-
4233
loss1 = 0
4334
for s1 in range(batch_size):
4435
for s2 in range(s1+1, batch_size):
@@ -54,6 +45,21 @@ def DAN(source, target, kernel_mul=2.0, kernel_num=5, fix_sigma=None):
5445
loss2 = loss2 / float(batch_size * batch_size)
5546
return loss1 + loss2
5647

48+
def DAN_Linear(source, target, kernel_mul=2.0, kernel_num=5, fix_sigma=None):
49+
batch_size = int(source.size()[0])
50+
kernels = guassian_kernel(source, target,
51+
kernel_mul=kernel_mul, kernel_num=kernel_num, fix_sigma=fix_sigma)
52+
53+
# Linear version
54+
loss = 0
55+
for i in range(batch_size):
56+
s1, s2 = i, (i+1)%batch_size
57+
t1, t2 = s1+batch_size, s2+batch_size
58+
loss += kernels[s1, s2] + kernels[t1, t2]
59+
loss -= kernels[s1, t2] + kernels[s2, t1]
60+
return loss / float(batch_size)
61+
62+
5763
def RTN():
5864
pass
5965

@@ -75,15 +81,6 @@ def JAN(source_list, target_list, kernel_muls=[2.0, 2.0], kernel_nums=[5, 1], fi
7581
else:
7682
joint_kernels = kernels
7783

78-
# Linear version
79-
# loss = 0
80-
# for i in range(batch_size):
81-
# s1, s2 = i, (i+1)%batch_size
82-
# t1, t2 = s1+batch_size, s2+batch_size
83-
# loss += joint_kernels[s1, s2] + joint_kernels[t1, t2]
84-
# loss -= joint_kernels[s1, t2] + joint_kernels[s2, t1]
85-
# return loss / float(batch_size)
86-
8784
loss1 = 0
8885
for s1 in range(batch_size):
8986
for s2 in range(s1 + 1, batch_size):
@@ -99,5 +96,31 @@ def JAN(source_list, target_list, kernel_muls=[2.0, 2.0], kernel_nums=[5, 1], fi
9996
loss2 = loss2 / float(batch_size * batch_size)
10097
return loss1 + loss2
10198

99+
def JAN_Linear(source_list, target_list, kernel_muls=[2.0, 2.0], kernel_nums=[5, 1], fix_sigma_list=[None, 1.68]):
100+
batch_size = int(source_list[0].size()[0])
101+
layer_num = len(source_list)
102+
joint_kernels = None
103+
for i in range(layer_num):
104+
source = source_list[i]
105+
target = target_list[i]
106+
kernel_mul = kernel_muls[i]
107+
kernel_num = kernel_nums[i]
108+
fix_sigma = fix_sigma_list[i]
109+
kernels = guassian_kernel(source, target,
110+
kernel_mul=kernel_mul, kernel_num=kernel_num, fix_sigma=fix_sigma)
111+
if joint_kernels is not None:
112+
joint_kernels = joint_kernels * kernels
113+
else:
114+
joint_kernels = kernels
115+
116+
# Linear version
117+
loss = 0
118+
for i in range(batch_size):
119+
s1, s2 = i, (i+1)%batch_size
120+
t1, t2 = s1+batch_size, s2+batch_size
121+
loss += joint_kernels[s1, s2] + joint_kernels[t1, t2]
122+
loss -= joint_kernels[s1, t2] + joint_kernels[s2, t1]
123+
return loss / float(batch_size)
124+
102125

103-
loss_dict = {"DAN":DAN, "RTN":RTN, "JAN":JAN}
126+
loss_dict = {"DAN":DAN, "DAN_Linear":DAN_Linear, "RTN":RTN, "JAN":JAN, "JAN_Linear":JAN_Linear}

pytorch/src/run.sh

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,8 @@
11
###
22

3-
#python train.py --gpu_id 6 --source amazon --target webcam --loss_name JAN --tradeoff 1.0 --using_bottleneck 1
3+
python train.py --gpu_id 0 --source amazon --target webcam --loss_name JAN_Linear --tradeoff 1.0 --using_bottleneck 1
44

5-
python train.py --gpu_id 6 --source webcam --target amazon --loss_name JAN --tradeoff 1.0 --using_bottleneck 1
5+
#python train.py --gpu_id 0 --source webcam --target amazon --loss_name DAN --tradeoff 1.0 --using_bottleneck 1
66

7-
#python train.py --gpu_id 6 --source amazon --target dslr --loss_name JAN --tradeoff 1.0 --using_bottleneck 1
87

9-
#python train.py --gpu_id 6 --source dslr --target amazon --loss_name JAN --tradeoff 1.0 --using_bottleneck 1
10-
11-
#python train.py --gpu_id 6 --source webcam --target dslr --loss_name JAN --tradeoff 1.0 --using_bottleneck 1
12-
13-
#python train.py --gpu_id 6 --source dslr --target webcam --loss_name JAN --tradeoff 1.0 --using_bottleneck 1
148

pytorch/src/train.py

Lines changed: 30 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,23 @@
1515

1616
optim_dict = {"SGD": optim.SGD}
1717

18+
class AverageMeter(object):
19+
"""Computes and stores the average and current value"""
20+
def __init__(self):
21+
self.reset()
22+
23+
def reset(self):
24+
self.val = 0
25+
self.avg = 0
26+
self.sum = 0
27+
self.count = 0
28+
29+
def update(self, val, n=1):
30+
self.val = val
31+
self.sum += val * n
32+
self.count += n
33+
self.avg = self.sum / self.count
34+
1835
def image_classification_predict(loader, model, test_10crop=True, gpu=True):
1936
start_test = True
2037
if test_10crop:
@@ -104,7 +121,8 @@ def image_classification_test(loader, model, test_10crop=True, gpu=True):
104121
all_label = torch.cat((all_label, labels.data.float()), 0)
105122

106123
_, predict = torch.max(all_output, 1)
107-
accuracy = torch.sum(torch.squeeze(predict).float() == all_label).item() / float(all_label.size()[0])
124+
# accuracy = torch.sum(torch.squeeze(predict).float() == all_label).item() / float(all_label.size()[0])
125+
accuracy = torch.sum(torch.squeeze(predict).float() == all_label) / float(all_label.size()[0])
108126
return accuracy
109127

110128

@@ -192,7 +210,7 @@ def transfer_classification(config):
192210
parameter_list = [{"params":classifier_layer.parameters(), "lr":10}]
193211

194212
## add additional network for some methods
195-
if loss_config["name"] == "JAN":
213+
if loss_config["name"] == "JAN" or loss_config["name"] == "JAN_Linear":
196214
softmax_layer = nn.Softmax()
197215
if use_gpu:
198216
softmax_layer = softmax_layer.cuda()
@@ -211,20 +229,22 @@ def transfer_classification(config):
211229
## train
212230
len_train_source = len(dset_loaders["source"]["train"]) - 1
213231
len_train_target = len(dset_loaders["target"]["train"]) - 1
214-
transfer_loss_value = classifier_loss_value = total_loss_value = 0.0
232+
mmd_meter = AverageMeter()
215233
for i in range(config["num_iterations"]):
216234
## test in the train
217235
if i % config["test_interval"] == 0:
218236
base_network.train(False)
219237
classifier_layer.train(False)
220238
if net_config["use_bottleneck"]:
221239
bottleneck_layer.train(False)
222-
print image_classification_test(dset_loaders["target"], nn.Sequential(base_network, bottleneck_layer, classifier_layer), test_10crop=prep_dict["target"]["test_10crop"], gpu=use_gpu)
240+
test_acc = image_classification_test(dset_loaders["target"], nn.Sequential(base_network, bottleneck_layer, classifier_layer), test_10crop=prep_dict["target"]["test_10crop"], gpu=use_gpu)
223241

224242
else:
225-
print image_classification_test(dset_loaders["target"], nn.Sequential(base_network, classifier_layer), test_10crop=prep_dict["target"]["test_10crop"], gpu=use_gpu)
243+
test_acc = image_classification_test(dset_loaders["target"], nn.Sequential(base_network, classifier_layer), test_10crop=prep_dict["target"]["test_10crop"], gpu=use_gpu)
244+
245+
print('Iter: %d, mmd = %.4f, test_acc = %.3f' % (i, mmd_meter.avg, test_acc))
246+
mmd_meter.reset()
226247

227-
loss_test = nn.BCELoss()
228248
## train one iter
229249
if net_config["use_bottleneck"]:
230250
bottleneck_layer.train(True)
@@ -251,15 +271,17 @@ def transfer_classification(config):
251271

252272
classifier_loss = class_criterion(outputs.narrow(0, 0, inputs.size(0)/2), labels_source)
253273
## switch between different transfer loss
254-
if loss_config["name"] == "DAN":
274+
if loss_config["name"] == "DAN" or loss_config["name"] == "DAN_Linear":
255275
transfer_loss = transfer_criterion(features.narrow(0, 0, features.size(0)/2), features.narrow(0, features.size(0)/2, features.size(0)/2), **loss_config["params"])
256276
elif loss_config["name"] == "RTN":
257277
## RTN is still under developing
258278
transfer_loss = 0
259-
elif loss_config["name"] == "JAN":
279+
elif loss_config["name"] == "JAN" or loss_config["name"] == "JAN_Linear":
260280
softmax_out = softmax_layer(outputs)
261281
transfer_loss = transfer_criterion([features.narrow(0, 0, features.size(0)/2), softmax_out.narrow(0, 0, softmax_out.size(0)/2)], [features.narrow(0, features.size(0)/2, features.size(0)/2), softmax_out.narrow(0, softmax_out.size(0)/2, softmax_out.size(0)/2)], **loss_config["params"])
262282

283+
# mmd_meter.update(transfer_loss.item(), inputs_source.size(0))
284+
mmd_meter.update(transfer_loss.data[0], inputs_source.size(0))
263285
total_loss = loss_config["trade_off"] * transfer_loss + classifier_loss
264286
total_loss.backward()
265287
optimizer.step()

0 commit comments

Comments
 (0)