├── DANN_torch.ipynb ├── MDAN_torch.ipynb ├── README.md └── images ├── 48,1000,d_acc.png ├── 48,1000,loss.png ├── 48,1000,p_acc.png ├── DC_DA_10.png ├── DC_original_10.png ├── dann.png ├── init └── visulization.png /DANN_torch.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": 1, 6 | "metadata": {}, 7 | "outputs": [], 8 | "source": [ 9 | "from __future__ import absolute_import, division, print_function, unicode_literals\n", 10 | "\n", 11 | "import torchvision\n", 12 | "import torch.optim as optim\n", 13 | "\n", 14 | "import numpy as np\n", 15 | "\n", 16 | "from models import models\n", 17 | "from sklearn.manifold import TSNE\n", 18 | "\n", 19 | "import argparse, sys, os\n", 20 | "\n", 21 | "import torch\n", 22 | "import torch.nn as nn\n", 23 | "import torch.nn.functional as F\n", 24 | "from torch.autograd import Variable\n", 25 | "import torch.nn.init as init\n", 26 | "from torch.utils.data import DataLoader\n", 27 | "from torchvision import datasets, transforms\n", 28 | "\n", 29 | "import time\n", 30 | "from collections import Counter\n", 31 | "import matplotlib.pyplot as plt " 32 | ] 33 | }, 34 | { 35 | "cell_type": "code", 36 | "execution_count": 2, 37 | "metadata": {}, 38 | "outputs": [ 39 | { 40 | "name": "stdout", 41 | "output_type": "stream", 42 | "text": [ 43 | "(23758, 62, 5) (23758,)\n", 44 | "(23758, 62, 5) (23758,)\n", 45 | "Counter({1: 8190, 2: 7840, 0: 7728})\n", 46 | "(47516, 62, 5) (47516,)\n" 47 | ] 48 | } 49 | ], 50 | "source": [ 51 | "data2 = np.load(r'C:\\Users\\dingk\\Desktop\\experiment\\DL-model with MMD\\ExtractedFeatures\\3session012\\session2.npy')\n", 52 | "label2 = np.load(r'C:\\Users\\dingk\\Desktop\\experiment\\DL-model with MMD\\ExtractedFeatures\\3session012\\label2.npy')\n", 53 | "data1 = np.load(r'C:\\Users\\dingk\\Desktop\\experiment\\DL-model with MMD\\ExtractedFeatures\\3session012\\session1.npy')\n", 54 | "label1 = np.load(r'C:\\Users\\dingk\\Desktop\\experiment\\DL-model with MMD\\ExtractedFeatures\\3session012\\label1.npy')\n", 55 | "data3 = np.load(r'C:\\Users\\dingk\\Desktop\\experiment\\DL-model with MMD\\ExtractedFeatures\\3session012\\session3.npy')\n", 56 | "label3 = np.load(r'C:\\Users\\dingk\\Desktop\\experiment\\DL-model with MMD\\ExtractedFeatures\\3session012\\label3.npy')\n", 57 | "\n", 58 | "print(data2.shape,label2.shape)\n", 59 | "print(data1.shape,label1.shape)\n", 60 | "\n", 61 | "print(Counter(label1))\n", 62 | "\n", 63 | "train_data = np.concatenate((data1,data3),axis = 0)\n", 64 | "label_data = np.concatenate((label1,label3),axis = 0)\n", 65 | "\n", 66 | "test = data2\n", 67 | "label_test = label2\n", 68 | "print(train_data.shape,label_data.shape)" 69 | ] 70 | }, 71 | { 72 | "cell_type": "code", 73 | "execution_count": 3, 74 | "metadata": {}, 75 | "outputs": [], 76 | "source": [ 77 | "def get_train_loader(data,label,batch_size,shuffle=True):\n", 78 | " \"\"\"\n", 79 | " Get train dataloader of source domain or target domain\n", 80 | " :return: dataloader\n", 81 | " \"\"\"\n", 82 | " tensor_x = torch.Tensor(data) # transform to torch tensor\n", 83 | " tensor_y = torch.Tensor(label)\n", 84 | "\n", 85 | " my_dataset = torch.utils.data.TensorDataset(tensor_x,tensor_y) # create your datset\n", 86 | " my_dataloader = torch.utils.data.DataLoader(my_dataset,batch_size=batch_size,shuffle=True,drop_last=True,\n", 87 | " num_workers=8, pin_memory=True) # create your dataloader\n", 88 | " \n", 89 | " return my_dataloader\n", 90 | "\n", 91 | "def get_test_loader(data,label,batch_size,shuffle=True):\n", 92 | " \"\"\"\n", 93 | " Get test dataloader of source domain or target domain\n", 94 | " :return: dataloader\n", 95 | " \"\"\"\n", 96 | " tensor_x = torch.Tensor(data) # transform to torch tensor\n", 97 | " tensor_y = torch.Tensor(label)\n", 98 | "\n", 99 | " my_dataset = torch.utils.data.TensorDataset(tensor_x,tensor_y) # create your datset\n", 100 | " my_dataloader = torch.utils.data.DataLoader(my_dataset,batch_size=batch_size,shuffle=True,drop_last=True,\n", 101 | " num_workers=8, pin_memory=True) # create your dataloader\n", 102 | " \n", 103 | " return my_dataloader\n", 104 | "\n", 105 | "\n", 106 | "def optimizer_scheduler(optimizer, p):\n", 107 | " \"\"\"\n", 108 | " Adjust the learning rate of optimizer\n", 109 | " :param optimizer: optimizer for updating parameters\n", 110 | " :param p: a variable for adjusting learning rate\n", 111 | " :return: optimizer\n", 112 | " \"\"\"\n", 113 | " for param_group in optimizer.param_groups:\n", 114 | " param_group['lr'] = 0.01 / (1. + 10 * p) ** 0.75\n", 115 | "\n", 116 | " return optimizer" 117 | ] 118 | }, 119 | { 120 | "cell_type": "code", 121 | "execution_count": 4, 122 | "metadata": {}, 123 | "outputs": [], 124 | "source": [ 125 | "class GradReverse(torch.autograd.Function):\n", 126 | " \"\"\"\n", 127 | " Extension of grad reverse layer\n", 128 | " \"\"\"\n", 129 | " @staticmethod\n", 130 | " def forward(ctx, x, constant):\n", 131 | " ctx.constant = constant\n", 132 | " return x.view_as(x)\n", 133 | "\n", 134 | " @staticmethod\n", 135 | " def backward(ctx, grad_output):\n", 136 | " grad_output = grad_output.neg() * ctx.constant\n", 137 | " return grad_output, None\n", 138 | "\n", 139 | " def grad_reverse(x, constant):\n", 140 | " return GradReverse.apply(x, constant)\n", 141 | "\n", 142 | "class Extractor(nn.Module):\n", 143 | "\n", 144 | " def __init__(self):\n", 145 | " super(Extractor, self).__init__()\n", 146 | " self.conv1 = nn.Conv1d(5, 64, 5, 1) \n", 147 | " self.bn1 = nn.BatchNorm1d(64)\n", 148 | " self.conv2 = nn.Conv1d(64, 64, 5, 1) \n", 149 | " self.bn2 = nn.BatchNorm1d(64)\n", 150 | " self.conv3 = nn.Conv1d(64, 64, 5, 1) \n", 151 | " self.bn3 = nn.BatchNorm1d(64)\n", 152 | " self.pool = nn.AvgPool1d(5, stride=5)\n", 153 | "# self.pool = nn.MaxPool1d(5, stride=5)\n", 154 | " \n", 155 | "\n", 156 | " def forward(self, input):\n", 157 | " x = input.permute(0,2,1)\n", 158 | "# print('after permute ',x.shape) # 64,5,62\n", 159 | " x = F.relu(self.bn1(self.conv1(x))) \n", 160 | "# print('after CNN1 ',x.shape) # 64, 64, 58\n", 161 | " x = F.relu(self.bn2(self.conv2(x))) \n", 162 | "# print('after CNN2 ',x.shape) #64, 64, 54\n", 163 | "# x = F.avg_pool1d(x,kernel_size=5) \n", 164 | " x = F.relu(self.bn3(self.conv3(x))) \n", 165 | " x = self.pool(x)\n", 166 | " \n", 167 | "# print('before fc ',x.shape) #64, 64, 10\n", 168 | " x = x.view(-1, 64 * 10) \n", 169 | " \n", 170 | " return x\n", 171 | "\n", 172 | "\n", 173 | "class Class_classifier(nn.Module):\n", 174 | "\n", 175 | " def __init__(self):\n", 176 | " super(Class_classifier, self).__init__()\n", 177 | " # self.fc1 = nn.Linear(50 * 4 * 4, 100)\n", 178 | " # self.bn1 = nn.BatchNorm1d(100)\n", 179 | " # self.fc2 = nn.Linear(100, 100)\n", 180 | " # self.bn2 = nn.BatchNorm1d(100)\n", 181 | " # self.fc3 = nn.Linear(100, 10)\n", 182 | " self.fc1 = nn.Linear(64 * 10, 128)\n", 183 | " self.fc2 = nn.Linear(128, 128)\n", 184 | " self.fc3 = nn.Linear(128, 3)\n", 185 | "\n", 186 | " def forward(self, input):\n", 187 | " # logits = F.relu(self.bn1(self.fc1(input)))\n", 188 | " # logits = self.fc2(F.dropout(logits))\n", 189 | " # logits = F.relu(self.bn2(logits))\n", 190 | " # logits = self.fc3(logits)\n", 191 | " logits = F.relu(self.fc1(input))\n", 192 | " logits = self.fc2(F.dropout(logits))\n", 193 | " logits = F.relu(logits)\n", 194 | " logits = self.fc3(logits)\n", 195 | "\n", 196 | " return F.log_softmax(logits, 1)\n", 197 | "\n", 198 | "class Domain_classifier(nn.Module):\n", 199 | "\n", 200 | " def __init__(self):\n", 201 | " super(Domain_classifier, self).__init__()\n", 202 | " # self.fc1 = nn.Linear(50 * 4 * 4, 100)\n", 203 | " # self.bn1 = nn.BatchNorm1d(100)\n", 204 | " # self.fc2 = nn.Linear(100, 2)\n", 205 | " self.fc1 = nn.Linear(64 * 10, 128)\n", 206 | " self.fc2 = nn.Linear(128, 2)\n", 207 | "\n", 208 | " def forward(self, input, constant):\n", 209 | " input = GradReverse.grad_reverse(input, constant)\n", 210 | " # logits = F.relu(self.bn1(self.fc1(input)))\n", 211 | " # logits = F.log_softmax(self.fc2(logits), 1)\n", 212 | " logits = F.relu(self.fc1(input))\n", 213 | " logits = F.log_softmax(self.fc2(logits), 1)\n", 214 | "\n", 215 | " return logits\n" 216 | ] 217 | }, 218 | { 219 | "cell_type": "code", 220 | "execution_count": 5, 221 | "metadata": {}, 222 | "outputs": [], 223 | "source": [ 224 | "def train(training_mode, feature_extractor, class_classifier, domain_classifier, class_criterion, domain_criterion,\n", 225 | " source_dataloader, target_dataloader, optimizer, epoch):\n", 226 | " \"\"\"\n", 227 | " Execute target domain adaptation\n", 228 | " :param training_mode:\n", 229 | " :param feature_extractor:\n", 230 | " :param class_classifier:\n", 231 | " :param domain_classifier:\n", 232 | " :param class_criterion:\n", 233 | " :param domain_criterion:\n", 234 | " :param source_dataloader:\n", 235 | " :param target_dataloader:\n", 236 | " :param optimizer:\n", 237 | " :return:\n", 238 | " \"\"\"\n", 239 | "\n", 240 | " # setup models\n", 241 | " feature_extractor.train()\n", 242 | " class_classifier.train()\n", 243 | " domain_classifier.train()\n", 244 | "\n", 245 | " # steps\n", 246 | " start_steps = epoch * len(source_dataloader)\n", 247 | " total_steps = 10 * len(source_dataloader)\n", 248 | "\n", 249 | " for batch_idx, (sdata, tdata) in enumerate(zip(source_dataloader, target_dataloader)):\n", 250 | "\n", 251 | " if training_mode == 'dann':\n", 252 | " # setup hyperparameters\n", 253 | " p = float(batch_idx + start_steps) / total_steps\n", 254 | " constant = 2. / (1. + np.exp(-gamma * p)) - 1\n", 255 | "\n", 256 | " # prepare the data\n", 257 | " input1, label1 = sdata\n", 258 | " input2, label2 = tdata\n", 259 | " size = min((input1.shape[0], input2.shape[0]))\n", 260 | " input1, label1 = input1[0:size, :, :], label1[0:size]\n", 261 | " input2, label2 = input2[0:size, :, :], label2[0:size]\n", 262 | " \n", 263 | " input1, label1 = Variable(input1.cuda()), Variable(label1.cuda().long())\n", 264 | " input2, label2 = Variable(input2.cuda()), Variable(label2.cuda().long())\n", 265 | "\n", 266 | "\n", 267 | " # setup optimizer\n", 268 | " optimizer = optimizer_scheduler(optimizer, p)\n", 269 | " optimizer.zero_grad()\n", 270 | "\n", 271 | " # prepare domain labels\n", 272 | " \n", 273 | " source_labels = Variable(torch.zeros((input1.size()[0])).type(torch.LongTensor).cuda())\n", 274 | " target_labels = Variable(torch.ones((input2.size()[0])).type(torch.LongTensor).cuda())\n", 275 | "\n", 276 | " # compute the output of source domain and target domain\n", 277 | " src_feature = feature_extractor(input1)\n", 278 | " tgt_feature = feature_extractor(input2)\n", 279 | "\n", 280 | " # compute the class loss of src_feature\n", 281 | " class_preds = class_classifier(src_feature)\n", 282 | " class_loss = class_criterion(class_preds, label1)\n", 283 | "\n", 284 | " # compute the domain loss of src_feature and target_feature\n", 285 | " tgt_preds = domain_classifier(tgt_feature, constant)\n", 286 | " src_preds = domain_classifier(src_feature, constant)\n", 287 | " tgt_loss = domain_criterion(tgt_preds, target_labels)\n", 288 | " src_loss = domain_criterion(src_preds, source_labels)\n", 289 | " domain_loss = tgt_loss + src_loss\n", 290 | "\n", 291 | " loss = class_loss + theta * domain_loss\n", 292 | " loss.backward()\n", 293 | " optimizer.step()\n", 294 | "\n", 295 | " # print loss\n", 296 | " if (batch_idx + 1) % 100 == 0:\n", 297 | " print('[{}/{} ({:.0f}%)]\\tLoss: {:.6f}\\tClass Loss: {:.6f}\\tDomain Loss: {:.6f}'.format(\n", 298 | " batch_idx * len(input2), len(target_dataloader.dataset),\n", 299 | " 100. * batch_idx / len(target_dataloader), loss.item(), class_loss.item(),\n", 300 | " domain_loss.item()\n", 301 | " ))\n", 302 | " \n", 303 | " total_loss.append(loss.item())\n", 304 | " c_loss.append( class_loss.item())\n", 305 | " d_loss.append(domain_loss.item())\n", 306 | "\n", 307 | "\n", 308 | " elif training_mode == 'source':\n", 309 | " # prepare the data\n", 310 | " input1, label1 = sdata\n", 311 | " size = input1.shape[0]\n", 312 | " input1, label1 = input1[0:size, :, :], label1[0:size]\n", 313 | " input1, label1 = Variable(input1.cuda()), Variable(label1.cuda().long())\n", 314 | " \n", 315 | "\n", 316 | " # setup optimizer\n", 317 | " optimizer = optim.SGD(list(feature_extractor.parameters())+list(class_classifier.parameters()), lr=0.01, momentum=0.9)\n", 318 | " optimizer.zero_grad()\n", 319 | "\n", 320 | " # compute the output of source domain and target domain\n", 321 | " src_feature = feature_extractor(input1)\n", 322 | "\n", 323 | " # compute the class loss of src_feature\n", 324 | " class_preds = class_classifier(src_feature)\n", 325 | " class_loss = class_criterion(class_preds, label1)\n", 326 | "\n", 327 | " class_loss.backward()\n", 328 | " optimizer.step()\n", 329 | "\n", 330 | " # print loss\n", 331 | " if (batch_idx + 1) % 10 == 0:\n", 332 | " print('[{}/{} ({:.0f}%)]\\tClass Loss: {:.6f}'.format(\n", 333 | " batch_idx * len(input1), len(source_dataloader.dataset),\n", 334 | " 100. * batch_idx / len(source_dataloader), class_loss.item()\n", 335 | " ))\n", 336 | "\n", 337 | " elif training_mode == 'target':\n", 338 | " # prepare the data\n", 339 | " input2, label2 = tdata\n", 340 | " size = input2.shape[0]\n", 341 | " input2, label2 = input2[0:size, :, :], label2[0:size]\n", 342 | " input2, label2 = Variable(input2.cuda()), Variable(label2.cuda())\n", 343 | "\n", 344 | " # setup optimizer\n", 345 | " optimizer = optim.SGD(list(feature_extractor.parameters()) + list(class_classifier.parameters()), lr=0.01,\n", 346 | " momentum=0.9)\n", 347 | " optimizer.zero_grad()\n", 348 | "\n", 349 | " # compute the output of source domain and target domain\n", 350 | " tgt_feature = feature_extractor(input2)\n", 351 | "\n", 352 | " # compute the class loss of src_feature\n", 353 | " class_preds = class_classifier(tgt_feature)\n", 354 | " class_loss = class_criterion(class_preds, label2)\n", 355 | "\n", 356 | " class_loss.backward()\n", 357 | " optimizer.step()\n", 358 | "\n", 359 | " # print loss\n", 360 | " if (batch_idx + 1) % 10 == 0:\n", 361 | " print('[{}/{} ({:.0f}%)]\\tClass Loss: {:.6f}'.format(\n", 362 | " batch_idx * len(input2), len(target_dataloader.dataset),\n", 363 | " 100. * batch_idx / len(target_dataloader), class_loss.item()\n", 364 | " ))" 365 | ] 366 | }, 367 | { 368 | "cell_type": "code", 369 | "execution_count": 6, 370 | "metadata": {}, 371 | "outputs": [], 372 | "source": [ 373 | "def test(feature_extractor, class_classifier, domain_classifier, source_dataloader, target_dataloader):\n", 374 | " \"\"\"\n", 375 | " Test the performance of the model\n", 376 | " :param feature_extractor: network used to extract feature from target samples\n", 377 | " :param class_classifier: network used to predict labels\n", 378 | " :param domain_classifier: network used to predict domain\n", 379 | " :param source_dataloader: test dataloader of source domain\n", 380 | " :param target_dataloader: test dataloader of target domain\n", 381 | " :return: None\n", 382 | " \"\"\"\n", 383 | " # setup the network\n", 384 | " feature_extractor.eval()\n", 385 | " class_classifier.eval()\n", 386 | " domain_classifier.eval()\n", 387 | " source_correct = 0.0\n", 388 | " target_correct = 0.0\n", 389 | " domain_correct = 0.0\n", 390 | " tgt_correct = 0.0\n", 391 | " src_correct = 0.0\n", 392 | "\n", 393 | " for batch_idx, sdata in enumerate(source_dataloader):\n", 394 | " # setup hyperparameters\n", 395 | " p = float(batch_idx) / len(source_dataloader)\n", 396 | " constant = 2. / (1. + np.exp(-10 * p)) - 1.\n", 397 | "\n", 398 | " input1, label1 = sdata\n", 399 | " input1, label1 = Variable(input1.cuda()), Variable(label1.cuda().long())\n", 400 | " src_labels = Variable(torch.zeros((input1.size()[0])).type(torch.LongTensor).cuda())\n", 401 | "\n", 402 | " output1 = class_classifier(feature_extractor(input1))\n", 403 | " pred1 = output1.data.max(1, keepdim = True)[1]\n", 404 | " source_correct += pred1.eq(label1.data.view_as(pred1)).cpu().sum()\n", 405 | "\n", 406 | " src_preds = domain_classifier(feature_extractor(input1), constant)\n", 407 | " src_preds = src_preds.data.max(1, keepdim= True)[1]\n", 408 | " src_correct += src_preds.eq(src_labels.data.view_as(src_preds)).cpu().sum()\n", 409 | "\n", 410 | " for batch_idx, tdata in enumerate(target_dataloader):\n", 411 | " # setup hyperparameters\n", 412 | " p = float(batch_idx) / len(source_dataloader)\n", 413 | " constant = 2. / (1. + np.exp(-10 * p)) - 1\n", 414 | "\n", 415 | " input2, label2 = tdata\n", 416 | " input2, label2 = Variable(input2.cuda()), Variable(label2.cuda().long())\n", 417 | " tgt_labels = Variable(torch.ones((input2.size()[0])).type(torch.LongTensor).cuda())\n", 418 | "\n", 419 | " output2 = class_classifier(feature_extractor(input2))\n", 420 | " pred2 = output2.data.max(1, keepdim=True)[1]\n", 421 | " target_correct += pred2.eq(label2.data.view_as(pred2)).cpu().sum()\n", 422 | "\n", 423 | " tgt_preds = domain_classifier(feature_extractor(input2), constant)\n", 424 | " tgt_preds = tgt_preds.data.max(1, keepdim=True)[1]\n", 425 | " tgt_correct += tgt_preds.eq(tgt_labels.data.view_as(tgt_preds)).cpu().sum()\n", 426 | "\n", 427 | " domain_correct = tgt_correct + src_correct\n", 428 | "\n", 429 | " print('\\nSource Accuracy: {}/{} ({:.4f}%)\\nTarget Accuracy: {}/{} ({:.4f}%)\\n'\n", 430 | " 'Domain Accuracy: {}/{} ({:.4f}%)\\n'.\n", 431 | " format(\n", 432 | " source_correct, len(source_dataloader.dataset), 100. * float(source_correct) / len(source_dataloader.dataset),\n", 433 | " target_correct, len(target_dataloader.dataset), 100. * float(target_correct) / len(target_dataloader.dataset),\n", 434 | " domain_correct, len(source_dataloader.dataset) + len(target_dataloader.dataset),\n", 435 | " 100. * float(domain_correct) / (len(source_dataloader.dataset) + len(target_dataloader.dataset))\n", 436 | " ))\n", 437 | " acc_list1.append(100. * float(source_correct) / len(source_dataloader.dataset))\n", 438 | " acc_list2.append(100. * float(target_correct) / len(target_dataloader.dataset))\n", 439 | " acc_list3.append(100. * float(domain_correct) / (len(source_dataloader.dataset) + len(target_dataloader.dataset)))\n" 440 | ] 441 | }, 442 | { 443 | "cell_type": "code", 444 | "execution_count": 7, 445 | "metadata": { 446 | "scrolled": true 447 | }, 448 | "outputs": [ 449 | { 450 | "name": "stdout", 451 | "output_type": "stream", 452 | "text": [ 453 | "Epoch: 0\n", 454 | "[9900/23758 (42%)]\tLoss: 1.790843\tClass Loss: 0.649918\tDomain Loss: 1.140924\n", 455 | "[19900/23758 (84%)]\tLoss: 1.928555\tClass Loss: 0.359018\tDomain Loss: 1.569537\n", 456 | "\n", 457 | "Source Accuracy: 15021.0/23758 (63.2250%)\n", 458 | "Target Accuracy: 12669.0/23758 (53.3252%)\n", 459 | "Domain Accuracy: 27316.0/47516 (57.4880%)\n", 460 | "\n", 461 | "Epoch: 1\n", 462 | "[9900/23758 (42%)]\tLoss: 1.417862\tClass Loss: 0.219204\tDomain Loss: 1.198658\n", 463 | "[19900/23758 (84%)]\tLoss: 1.479155\tClass Loss: 0.186296\tDomain Loss: 1.292859\n", 464 | "\n", 465 | "Source Accuracy: 7711.0/23758 (32.4564%)\n", 466 | "Target Accuracy: 7712.0/23758 (32.4606%)\n", 467 | "Domain Accuracy: 23700.0/47516 (49.8779%)\n", 468 | "\n", 469 | "Epoch: 2\n", 470 | "[9900/23758 (42%)]\tLoss: 1.485815\tClass Loss: 0.096645\tDomain Loss: 1.389169\n", 471 | "[19900/23758 (84%)]\tLoss: 1.428321\tClass Loss: 0.046468\tDomain Loss: 1.381853\n", 472 | "\n", 473 | "Source Accuracy: 16596.0/23758 (69.8544%)\n", 474 | "Target Accuracy: 14933.0/23758 (62.8546%)\n", 475 | "Domain Accuracy: 31245.0/47516 (65.7568%)\n", 476 | "\n", 477 | "Epoch: 3\n", 478 | "[9900/23758 (42%)]\tLoss: 1.589309\tClass Loss: 0.079787\tDomain Loss: 1.509522\n", 479 | "[19900/23758 (84%)]\tLoss: 1.663020\tClass Loss: 0.186908\tDomain Loss: 1.476113\n", 480 | "\n", 481 | "Source Accuracy: 15765.0/23758 (66.3566%)\n", 482 | "Target Accuracy: 12356.0/23758 (52.0077%)\n", 483 | "Domain Accuracy: 27057.0/47516 (56.9429%)\n", 484 | "\n", 485 | "Epoch: 4\n", 486 | "[9900/23758 (42%)]\tLoss: 1.474490\tClass Loss: 0.119472\tDomain Loss: 1.355018\n", 487 | "[19900/23758 (84%)]\tLoss: 1.438168\tClass Loss: 0.040553\tDomain Loss: 1.397614\n", 488 | "\n", 489 | "Source Accuracy: 14429.0/23758 (60.7332%)\n", 490 | "Target Accuracy: 12994.0/23758 (54.6932%)\n", 491 | "Domain Accuracy: 29714.0/47516 (62.5347%)\n", 492 | "\n", 493 | "Epoch: 5\n", 494 | "[9900/23758 (42%)]\tLoss: 1.412591\tClass Loss: 0.033921\tDomain Loss: 1.378671\n", 495 | "[19900/23758 (84%)]\tLoss: 1.417555\tClass Loss: 0.042087\tDomain Loss: 1.375468\n", 496 | "\n", 497 | "Source Accuracy: 18065.0/23758 (76.0375%)\n", 498 | "Target Accuracy: 16876.0/23758 (71.0329%)\n", 499 | "Domain Accuracy: 27996.0/47516 (58.9191%)\n", 500 | "\n", 501 | "Epoch: 6\n", 502 | "[9900/23758 (42%)]\tLoss: 1.475151\tClass Loss: 0.048026\tDomain Loss: 1.427125\n", 503 | "[19900/23758 (84%)]\tLoss: 1.398542\tClass Loss: 0.026189\tDomain Loss: 1.372354\n", 504 | "\n", 505 | "Source Accuracy: 17915.0/23758 (75.4062%)\n", 506 | "Target Accuracy: 13788.0/23758 (58.0352%)\n", 507 | "Domain Accuracy: 23785.0/47516 (50.0568%)\n", 508 | "\n", 509 | "Epoch: 7\n", 510 | "[9900/23758 (42%)]\tLoss: 1.411167\tClass Loss: 0.009974\tDomain Loss: 1.401193\n", 511 | "[19900/23758 (84%)]\tLoss: 1.398504\tClass Loss: 0.016725\tDomain Loss: 1.381778\n", 512 | "\n", 513 | "Source Accuracy: 20377.0/23758 (85.7690%)\n", 514 | "Target Accuracy: 16865.0/23758 (70.9866%)\n", 515 | "Domain Accuracy: 26668.0/47516 (56.1243%)\n", 516 | "\n", 517 | "Epoch: 8\n", 518 | "[9900/23758 (42%)]\tLoss: 1.388465\tClass Loss: 0.004175\tDomain Loss: 1.384290\n", 519 | "[19900/23758 (84%)]\tLoss: 1.407421\tClass Loss: 0.005365\tDomain Loss: 1.402056\n", 520 | "\n", 521 | "Source Accuracy: 12963.0/23758 (54.5627%)\n", 522 | "Target Accuracy: 13614.0/23758 (57.3028%)\n", 523 | "Domain Accuracy: 25071.0/47516 (52.7633%)\n", 524 | "\n", 525 | "Epoch: 9\n", 526 | "[9900/23758 (42%)]\tLoss: 1.401463\tClass Loss: 0.010243\tDomain Loss: 1.391219\n", 527 | "[19900/23758 (84%)]\tLoss: 1.403482\tClass Loss: 0.030464\tDomain Loss: 1.373018\n", 528 | "\n", 529 | "Source Accuracy: 23295.0/23758 (98.0512%)\n", 530 | "Target Accuracy: 17519.0/23758 (73.7394%)\n", 531 | "Domain Accuracy: 24944.0/47516 (52.4960%)\n", 532 | "\n", 533 | "Epoch: 10\n", 534 | "[9900/23758 (42%)]\tLoss: 1.401866\tClass Loss: 0.021802\tDomain Loss: 1.380064\n", 535 | "[19900/23758 (84%)]\tLoss: 1.424058\tClass Loss: 0.006759\tDomain Loss: 1.417299\n", 536 | "\n", 537 | "Source Accuracy: 22754.0/23758 (95.7741%)\n", 538 | "Target Accuracy: 17867.0/23758 (75.2041%)\n", 539 | "Domain Accuracy: 27500.0/47516 (57.8752%)\n", 540 | "\n", 541 | "Epoch: 11\n", 542 | "[9900/23758 (42%)]\tLoss: 1.412953\tClass Loss: 0.012205\tDomain Loss: 1.400748\n", 543 | "[19900/23758 (84%)]\tLoss: 1.375268\tClass Loss: 0.006671\tDomain Loss: 1.368596\n", 544 | "\n", 545 | "Source Accuracy: 16110.0/23758 (67.8087%)\n", 546 | "Target Accuracy: 14437.0/23758 (60.7669%)\n", 547 | "Domain Accuracy: 24550.0/47516 (51.6668%)\n", 548 | "\n", 549 | "Epoch: 12\n", 550 | "[9900/23758 (42%)]\tLoss: 1.438763\tClass Loss: 0.037560\tDomain Loss: 1.401203\n", 551 | "[19900/23758 (84%)]\tLoss: 1.407230\tClass Loss: 0.006404\tDomain Loss: 1.400826\n", 552 | "\n", 553 | "Source Accuracy: 9335.0/23758 (39.2920%)\n", 554 | "Target Accuracy: 9608.0/23758 (40.4411%)\n", 555 | "Domain Accuracy: 24567.0/47516 (51.7026%)\n", 556 | "\n", 557 | "Epoch: 13\n", 558 | "[9900/23758 (42%)]\tLoss: 1.376336\tClass Loss: 0.003661\tDomain Loss: 1.372675\n", 559 | "[19900/23758 (84%)]\tLoss: 1.390265\tClass Loss: 0.007209\tDomain Loss: 1.383056\n", 560 | "\n", 561 | "Source Accuracy: 22854.0/23758 (96.1950%)\n", 562 | "Target Accuracy: 15857.0/23758 (66.7438%)\n", 563 | "Domain Accuracy: 25662.0/47516 (54.0071%)\n", 564 | "\n", 565 | "Epoch: 14\n", 566 | "[9900/23758 (42%)]\tLoss: 1.391270\tClass Loss: 0.001315\tDomain Loss: 1.389955\n", 567 | "[19900/23758 (84%)]\tLoss: 1.374239\tClass Loss: 0.002301\tDomain Loss: 1.371938\n", 568 | "\n", 569 | "Source Accuracy: 22773.0/23758 (95.8540%)\n", 570 | "Target Accuracy: 18244.0/23758 (76.7910%)\n", 571 | "Domain Accuracy: 27106.0/47516 (57.0460%)\n", 572 | "\n", 573 | "Epoch: 15\n", 574 | "[9900/23758 (42%)]\tLoss: 1.388542\tClass Loss: 0.001410\tDomain Loss: 1.387131\n", 575 | "[19900/23758 (84%)]\tLoss: 1.385997\tClass Loss: 0.000551\tDomain Loss: 1.385446\n", 576 | "\n", 577 | "Source Accuracy: 23134.0/23758 (97.3735%)\n", 578 | "Target Accuracy: 17127.0/23758 (72.0894%)\n", 579 | "Domain Accuracy: 26987.0/47516 (56.7956%)\n", 580 | "\n", 581 | "Epoch: 16\n", 582 | "[9900/23758 (42%)]\tLoss: 1.381949\tClass Loss: 0.001925\tDomain Loss: 1.380024\n", 583 | "[19900/23758 (84%)]\tLoss: 1.374534\tClass Loss: 0.001234\tDomain Loss: 1.373300\n", 584 | "\n", 585 | "Source Accuracy: 23559.0/23758 (99.1624%)\n", 586 | "Target Accuracy: 17963.0/23758 (75.6082%)\n", 587 | "Domain Accuracy: 26129.0/47516 (54.9899%)\n", 588 | "\n", 589 | "Epoch: 17\n", 590 | "[9900/23758 (42%)]\tLoss: 1.395145\tClass Loss: 0.001361\tDomain Loss: 1.393784\n", 591 | "[19900/23758 (84%)]\tLoss: 1.394285\tClass Loss: 0.007991\tDomain Loss: 1.386294\n", 592 | "\n", 593 | "Source Accuracy: 21263.0/23758 (89.4983%)\n", 594 | "Target Accuracy: 15727.0/23758 (66.1966%)\n", 595 | "Domain Accuracy: 22819.0/47516 (48.0238%)\n", 596 | "\n", 597 | "Epoch: 18\n", 598 | "[9900/23758 (42%)]\tLoss: 1.384957\tClass Loss: 0.006425\tDomain Loss: 1.378532\n", 599 | "[19900/23758 (84%)]\tLoss: 1.374072\tClass Loss: 0.005166\tDomain Loss: 1.368906\n", 600 | "\n", 601 | "Source Accuracy: 23132.0/23758 (97.3651%)\n", 602 | "Target Accuracy: 17796.0/23758 (74.9053%)\n", 603 | "Domain Accuracy: 27080.0/47516 (56.9913%)\n", 604 | "\n", 605 | "Epoch: 19\n", 606 | "[9900/23758 (42%)]\tLoss: 1.399660\tClass Loss: 0.009474\tDomain Loss: 1.390186\n", 607 | "[19900/23758 (84%)]\tLoss: 1.385671\tClass Loss: 0.001255\tDomain Loss: 1.384416\n", 608 | "\n", 609 | "Source Accuracy: 23505.0/23758 (98.9351%)\n", 610 | "Target Accuracy: 17417.0/23758 (73.3100%)\n", 611 | "Domain Accuracy: 21798.0/47516 (45.8751%)\n", 612 | "\n", 613 | "Epoch: 20\n", 614 | "[9900/23758 (42%)]\tLoss: 1.377080\tClass Loss: 0.001352\tDomain Loss: 1.375727\n", 615 | "[19900/23758 (84%)]\tLoss: 1.385924\tClass Loss: 0.001943\tDomain Loss: 1.383981\n", 616 | "\n", 617 | "Source Accuracy: 23234.0/23758 (97.7944%)\n", 618 | "Target Accuracy: 17842.0/23758 (75.0989%)\n", 619 | "Domain Accuracy: 24946.0/47516 (52.5002%)\n", 620 | "\n", 621 | "Epoch: 21\n", 622 | "[9900/23758 (42%)]\tLoss: 1.393147\tClass Loss: 0.004352\tDomain Loss: 1.388795\n", 623 | "[19900/23758 (84%)]\tLoss: 1.390955\tClass Loss: 0.001478\tDomain Loss: 1.389477\n", 624 | "\n", 625 | "Source Accuracy: 23225.0/23758 (97.7565%)\n", 626 | "Target Accuracy: 17484.0/23758 (73.5921%)\n", 627 | "Domain Accuracy: 24765.0/47516 (52.1193%)\n", 628 | "\n", 629 | "Epoch: 22\n", 630 | "[9900/23758 (42%)]\tLoss: 1.376348\tClass Loss: 0.000912\tDomain Loss: 1.375436\n", 631 | "[19900/23758 (84%)]\tLoss: 1.415650\tClass Loss: 0.005795\tDomain Loss: 1.409856\n", 632 | "\n", 633 | "Source Accuracy: 23591.0/23758 (99.2971%)\n", 634 | "Target Accuracy: 16991.0/23758 (71.5170%)\n", 635 | "Domain Accuracy: 21509.0/47516 (45.2669%)\n", 636 | "\n", 637 | "Epoch: 23\n", 638 | "[9900/23758 (42%)]\tLoss: 1.384212\tClass Loss: 0.001536\tDomain Loss: 1.382676\n", 639 | "[19900/23758 (84%)]\tLoss: 1.391564\tClass Loss: 0.004375\tDomain Loss: 1.387188\n", 640 | "\n", 641 | "Source Accuracy: 23528.0/23758 (99.0319%)\n", 642 | "Target Accuracy: 17153.0/23758 (72.1988%)\n", 643 | "Domain Accuracy: 28963.0/47516 (60.9542%)\n", 644 | "\n", 645 | "Epoch: 24\n", 646 | "[9900/23758 (42%)]\tLoss: 1.404573\tClass Loss: 0.001363\tDomain Loss: 1.403210\n", 647 | "[19900/23758 (84%)]\tLoss: 1.370133\tClass Loss: 0.001086\tDomain Loss: 1.369047\n", 648 | "\n", 649 | "Source Accuracy: 23483.0/23758 (98.8425%)\n", 650 | "Target Accuracy: 17730.0/23758 (74.6275%)\n", 651 | "Domain Accuracy: 30929.0/47516 (65.0918%)\n", 652 | "\n", 653 | "Epoch: 25\n", 654 | "[9900/23758 (42%)]\tLoss: 1.416145\tClass Loss: 0.000760\tDomain Loss: 1.415386\n", 655 | "[19900/23758 (84%)]\tLoss: 1.350325\tClass Loss: 0.001310\tDomain Loss: 1.349015\n", 656 | "\n", 657 | "Source Accuracy: 21940.0/23758 (92.3478%)\n", 658 | "Target Accuracy: 16160.0/23758 (68.0192%)\n", 659 | "Domain Accuracy: 21827.0/47516 (45.9361%)\n", 660 | "\n", 661 | "Epoch: 26\n", 662 | "[9900/23758 (42%)]\tLoss: 1.389704\tClass Loss: 0.001939\tDomain Loss: 1.387766\n", 663 | "[19900/23758 (84%)]\tLoss: 1.374779\tClass Loss: 0.001999\tDomain Loss: 1.372780\n", 664 | "\n", 665 | "Source Accuracy: 23417.0/23758 (98.5647%)\n", 666 | "Target Accuracy: 16904.0/23758 (71.1508%)\n", 667 | "Domain Accuracy: 24467.0/47516 (51.4921%)\n", 668 | "\n", 669 | "Epoch: 27\n", 670 | "[9900/23758 (42%)]\tLoss: 1.394412\tClass Loss: 0.001201\tDomain Loss: 1.393211\n", 671 | "[19900/23758 (84%)]\tLoss: 1.355685\tClass Loss: 0.001147\tDomain Loss: 1.354538\n", 672 | "\n", 673 | "Source Accuracy: 23488.0/23758 (98.8635%)\n", 674 | "Target Accuracy: 17162.0/23758 (72.2367%)\n", 675 | "Domain Accuracy: 24211.0/47516 (50.9534%)\n", 676 | "\n", 677 | "Epoch: 28\n" 678 | ] 679 | }, 680 | { 681 | "name": "stdout", 682 | "output_type": "stream", 683 | "text": [ 684 | "[9900/23758 (42%)]\tLoss: 1.423513\tClass Loss: 0.011672\tDomain Loss: 1.411841\n", 685 | "[19900/23758 (84%)]\tLoss: 1.341217\tClass Loss: 0.001062\tDomain Loss: 1.340155\n", 686 | "\n", 687 | "Source Accuracy: 22660.0/23758 (95.3784%)\n", 688 | "Target Accuracy: 17877.0/23758 (75.2462%)\n", 689 | "Domain Accuracy: 28519.0/47516 (60.0198%)\n", 690 | "\n", 691 | "Epoch: 29\n", 692 | "[9900/23758 (42%)]\tLoss: 1.412507\tClass Loss: 0.001725\tDomain Loss: 1.410782\n", 693 | "[19900/23758 (84%)]\tLoss: 1.366369\tClass Loss: 0.000886\tDomain Loss: 1.365483\n", 694 | "\n", 695 | "Source Accuracy: 23681.0/23758 (99.6759%)\n", 696 | "Target Accuracy: 17921.0/23758 (75.4314%)\n", 697 | "Domain Accuracy: 28139.0/47516 (59.2201%)\n", 698 | "\n", 699 | "Epoch: 30\n", 700 | "[9900/23758 (42%)]\tLoss: 1.400881\tClass Loss: 0.002656\tDomain Loss: 1.398225\n", 701 | "[19900/23758 (84%)]\tLoss: 1.383933\tClass Loss: 0.000655\tDomain Loss: 1.383278\n", 702 | "\n", 703 | "Source Accuracy: 22285.0/23758 (93.8000%)\n", 704 | "Target Accuracy: 18028.0/23758 (75.8818%)\n", 705 | "Domain Accuracy: 27237.0/47516 (57.3217%)\n", 706 | "\n", 707 | "Epoch: 31\n", 708 | "[9900/23758 (42%)]\tLoss: 1.405074\tClass Loss: 0.004948\tDomain Loss: 1.400125\n", 709 | "[19900/23758 (84%)]\tLoss: 1.379068\tClass Loss: 0.000869\tDomain Loss: 1.378199\n", 710 | "\n", 711 | "Source Accuracy: 23670.0/23758 (99.6296%)\n", 712 | "Target Accuracy: 16784.0/23758 (70.6457%)\n", 713 | "Domain Accuracy: 27311.0/47516 (57.4775%)\n", 714 | "\n", 715 | "Epoch: 32\n", 716 | "[9900/23758 (42%)]\tLoss: 1.398373\tClass Loss: 0.001787\tDomain Loss: 1.396586\n", 717 | "[19900/23758 (84%)]\tLoss: 1.374377\tClass Loss: 0.001199\tDomain Loss: 1.373178\n", 718 | "\n", 719 | "Source Accuracy: 23646.0/23758 (99.5286%)\n", 720 | "Target Accuracy: 17712.0/23758 (74.5517%)\n", 721 | "Domain Accuracy: 25043.0/47516 (52.7044%)\n", 722 | "\n", 723 | "Epoch: 33\n", 724 | "[9900/23758 (42%)]\tLoss: 1.401699\tClass Loss: 0.014343\tDomain Loss: 1.387356\n", 725 | "[19900/23758 (84%)]\tLoss: 1.391921\tClass Loss: 0.001369\tDomain Loss: 1.390552\n", 726 | "\n", 727 | "Source Accuracy: 23583.0/23758 (99.2634%)\n", 728 | "Target Accuracy: 17449.0/23758 (73.4447%)\n", 729 | "Domain Accuracy: 19275.0/47516 (40.5653%)\n", 730 | "\n", 731 | "Epoch: 34\n", 732 | "[9900/23758 (42%)]\tLoss: 1.387967\tClass Loss: 0.000460\tDomain Loss: 1.387507\n", 733 | "[19900/23758 (84%)]\tLoss: 1.379375\tClass Loss: 0.000867\tDomain Loss: 1.378509\n", 734 | "\n", 735 | "Source Accuracy: 23684.0/23758 (99.6885%)\n", 736 | "Target Accuracy: 17109.0/23758 (72.0136%)\n", 737 | "Domain Accuracy: 26634.0/47516 (56.0527%)\n", 738 | "\n", 739 | "Epoch: 35\n", 740 | "[9900/23758 (42%)]\tLoss: 1.386999\tClass Loss: 0.000604\tDomain Loss: 1.386395\n", 741 | "[19900/23758 (84%)]\tLoss: 1.392844\tClass Loss: 0.000761\tDomain Loss: 1.392083\n", 742 | "\n", 743 | "Source Accuracy: 23688.0/23758 (99.7054%)\n", 744 | "Target Accuracy: 17309.0/23758 (72.8555%)\n", 745 | "Domain Accuracy: 23075.0/47516 (48.5626%)\n", 746 | "\n", 747 | "Epoch: 36\n", 748 | "[9900/23758 (42%)]\tLoss: 1.389037\tClass Loss: 0.000959\tDomain Loss: 1.388077\n", 749 | "[19900/23758 (84%)]\tLoss: 1.386272\tClass Loss: 0.000531\tDomain Loss: 1.385741\n", 750 | "\n", 751 | "Source Accuracy: 23630.0/23758 (99.4612%)\n", 752 | "Target Accuracy: 18431.0/23758 (77.5781%)\n", 753 | "Domain Accuracy: 23826.0/47516 (50.1431%)\n", 754 | "\n", 755 | "Epoch: 37\n", 756 | "[9900/23758 (42%)]\tLoss: 1.392360\tClass Loss: 0.000903\tDomain Loss: 1.391458\n", 757 | "[19900/23758 (84%)]\tLoss: 1.388736\tClass Loss: 0.005508\tDomain Loss: 1.383228\n", 758 | "\n", 759 | "Source Accuracy: 23673.0/23758 (99.6422%)\n", 760 | "Target Accuracy: 17266.0/23758 (72.6745%)\n", 761 | "Domain Accuracy: 26610.0/47516 (56.0022%)\n", 762 | "\n", 763 | "Epoch: 38\n", 764 | "[9900/23758 (42%)]\tLoss: 1.397081\tClass Loss: 0.016118\tDomain Loss: 1.380963\n", 765 | "[19900/23758 (84%)]\tLoss: 1.387939\tClass Loss: 0.000906\tDomain Loss: 1.387033\n", 766 | "\n", 767 | "Source Accuracy: 23594.0/23758 (99.3097%)\n", 768 | "Target Accuracy: 17257.0/23758 (72.6366%)\n", 769 | "Domain Accuracy: 18903.0/47516 (39.7824%)\n", 770 | "\n", 771 | "Epoch: 39\n", 772 | "[9900/23758 (42%)]\tLoss: 1.379895\tClass Loss: 0.000647\tDomain Loss: 1.379248\n", 773 | "[19900/23758 (84%)]\tLoss: 1.396873\tClass Loss: 0.011238\tDomain Loss: 1.385635\n", 774 | "\n", 775 | "Source Accuracy: 23570.0/23758 (99.2087%)\n", 776 | "Target Accuracy: 17669.0/23758 (74.3707%)\n", 777 | "Domain Accuracy: 23236.0/47516 (48.9014%)\n", 778 | "\n", 779 | "Epoch: 40\n", 780 | "[9900/23758 (42%)]\tLoss: 1.385690\tClass Loss: 0.000763\tDomain Loss: 1.384927\n", 781 | "[19900/23758 (84%)]\tLoss: 1.392005\tClass Loss: 0.001265\tDomain Loss: 1.390740\n", 782 | "\n", 783 | "Source Accuracy: 23636.0/23758 (99.4865%)\n", 784 | "Target Accuracy: 17944.0/23758 (75.5282%)\n", 785 | "Domain Accuracy: 22567.0/47516 (47.4935%)\n", 786 | "\n", 787 | "Epoch: 41\n", 788 | "[9900/23758 (42%)]\tLoss: 1.386314\tClass Loss: 0.000209\tDomain Loss: 1.386104\n", 789 | "[19900/23758 (84%)]\tLoss: 1.384973\tClass Loss: 0.001330\tDomain Loss: 1.383643\n", 790 | "\n", 791 | "Source Accuracy: 23690.0/23758 (99.7138%)\n", 792 | "Target Accuracy: 18011.0/23758 (75.8103%)\n", 793 | "Domain Accuracy: 24049.0/47516 (50.6124%)\n", 794 | "\n", 795 | "Epoch: 42\n", 796 | "[9900/23758 (42%)]\tLoss: 1.392823\tClass Loss: 0.000770\tDomain Loss: 1.392054\n", 797 | "[19900/23758 (84%)]\tLoss: 1.382176\tClass Loss: 0.000783\tDomain Loss: 1.381393\n", 798 | "\n", 799 | "Source Accuracy: 23552.0/23758 (99.1329%)\n", 800 | "Target Accuracy: 17667.0/23758 (74.3623%)\n", 801 | "Domain Accuracy: 24942.0/47516 (52.4918%)\n", 802 | "\n", 803 | "Epoch: 43\n", 804 | "[9900/23758 (42%)]\tLoss: 1.404949\tClass Loss: 0.002852\tDomain Loss: 1.402097\n", 805 | "[19900/23758 (84%)]\tLoss: 1.385293\tClass Loss: 0.001881\tDomain Loss: 1.383412\n", 806 | "\n", 807 | "Source Accuracy: 23639.0/23758 (99.4991%)\n", 808 | "Target Accuracy: 17278.0/23758 (72.7250%)\n", 809 | "Domain Accuracy: 28033.0/47516 (58.9970%)\n", 810 | "\n", 811 | "Epoch: 44\n", 812 | "[9900/23758 (42%)]\tLoss: 1.391430\tClass Loss: 0.001058\tDomain Loss: 1.390372\n", 813 | "[19900/23758 (84%)]\tLoss: 1.390473\tClass Loss: 0.003863\tDomain Loss: 1.386610\n", 814 | "\n", 815 | "Source Accuracy: 23656.0/23758 (99.5707%)\n", 816 | "Target Accuracy: 17903.0/23758 (75.3557%)\n", 817 | "Domain Accuracy: 23413.0/47516 (49.2739%)\n", 818 | "\n", 819 | "Epoch: 45\n", 820 | "[9900/23758 (42%)]\tLoss: 1.385846\tClass Loss: 0.000672\tDomain Loss: 1.385174\n", 821 | "[19900/23758 (84%)]\tLoss: 1.392202\tClass Loss: 0.003446\tDomain Loss: 1.388756\n", 822 | "\n", 823 | "Source Accuracy: 23418.0/23758 (98.5689%)\n", 824 | "Target Accuracy: 17416.0/23758 (73.3058%)\n", 825 | "Domain Accuracy: 22124.0/47516 (46.5612%)\n", 826 | "\n", 827 | "Epoch: 46\n", 828 | "[9900/23758 (42%)]\tLoss: 1.387516\tClass Loss: 0.000902\tDomain Loss: 1.386614\n", 829 | "[19900/23758 (84%)]\tLoss: 1.386322\tClass Loss: 0.000267\tDomain Loss: 1.386055\n", 830 | "\n", 831 | "Source Accuracy: 23692.0/23758 (99.7222%)\n", 832 | "Target Accuracy: 18133.0/23758 (76.3238%)\n", 833 | "Domain Accuracy: 26866.0/47516 (56.5410%)\n", 834 | "\n", 835 | "Epoch: 47\n", 836 | "[9900/23758 (42%)]\tLoss: 1.387192\tClass Loss: 0.001346\tDomain Loss: 1.385846\n", 837 | "[19900/23758 (84%)]\tLoss: 1.386524\tClass Loss: 0.000356\tDomain Loss: 1.386169\n", 838 | "\n", 839 | "Source Accuracy: 23696.0/23758 (99.7390%)\n", 840 | "Target Accuracy: 18438.0/23758 (77.6075%)\n", 841 | "Domain Accuracy: 23383.0/47516 (49.2108%)\n", 842 | "\n", 843 | "Epoch: 48\n", 844 | "[9900/23758 (42%)]\tLoss: 1.390566\tClass Loss: 0.001955\tDomain Loss: 1.388611\n", 845 | "[19900/23758 (84%)]\tLoss: 1.387532\tClass Loss: 0.000610\tDomain Loss: 1.386922\n", 846 | "\n", 847 | "Source Accuracy: 23689.0/23758 (99.7096%)\n", 848 | "Target Accuracy: 18116.0/23758 (76.2522%)\n", 849 | "Domain Accuracy: 22719.0/47516 (47.8134%)\n", 850 | "\n", 851 | "Epoch: 49\n", 852 | "[9900/23758 (42%)]\tLoss: 1.388918\tClass Loss: 0.000496\tDomain Loss: 1.388422\n", 853 | "[19900/23758 (84%)]\tLoss: 1.393028\tClass Loss: 0.006346\tDomain Loss: 1.386682\n", 854 | "\n", 855 | "Source Accuracy: 23692.0/23758 (99.7222%)\n", 856 | "Target Accuracy: 18427.0/23758 (77.5612%)\n", 857 | "Domain Accuracy: 21416.0/47516 (45.0711%)\n", 858 | "\n", 859 | "Epoch: 50\n", 860 | "[9900/23758 (42%)]\tLoss: 1.383915\tClass Loss: 0.000870\tDomain Loss: 1.383045\n", 861 | "[19900/23758 (84%)]\tLoss: 1.389495\tClass Loss: 0.003497\tDomain Loss: 1.385998\n", 862 | "\n", 863 | "Source Accuracy: 23699.0/23758 (99.7517%)\n", 864 | "Target Accuracy: 18496.0/23758 (77.8517%)\n", 865 | "Domain Accuracy: 23885.0/47516 (50.2673%)\n", 866 | "\n", 867 | "Epoch: 51\n", 868 | "[9900/23758 (42%)]\tLoss: 1.385185\tClass Loss: 0.000137\tDomain Loss: 1.385048\n", 869 | "[19900/23758 (84%)]\tLoss: 1.385996\tClass Loss: 0.000896\tDomain Loss: 1.385101\n", 870 | "\n", 871 | "Source Accuracy: 23677.0/23758 (99.6591%)\n", 872 | "Target Accuracy: 18105.0/23758 (76.2059%)\n", 873 | "Domain Accuracy: 25450.0/47516 (53.5609%)\n", 874 | "\n", 875 | "Epoch: 52\n", 876 | "[9900/23758 (42%)]\tLoss: 1.390782\tClass Loss: 0.001514\tDomain Loss: 1.389268\n", 877 | "[19900/23758 (84%)]\tLoss: 1.387977\tClass Loss: 0.002324\tDomain Loss: 1.385653\n", 878 | "\n", 879 | "Source Accuracy: 23677.0/23758 (99.6591%)\n", 880 | "Target Accuracy: 18470.0/23758 (77.7422%)\n", 881 | "Domain Accuracy: 19504.0/47516 (41.0472%)\n", 882 | "\n", 883 | "Epoch: 53\n", 884 | "[9900/23758 (42%)]\tLoss: 1.383165\tClass Loss: 0.000447\tDomain Loss: 1.382718\n", 885 | "[19900/23758 (84%)]\tLoss: 1.386243\tClass Loss: 0.000968\tDomain Loss: 1.385275\n", 886 | "\n", 887 | "Source Accuracy: 23470.0/23758 (98.7878%)\n", 888 | "Target Accuracy: 18412.0/23758 (77.4981%)\n", 889 | "Domain Accuracy: 21540.0/47516 (45.3321%)\n", 890 | "\n", 891 | "Epoch: 54\n", 892 | "[9900/23758 (42%)]\tLoss: 1.388162\tClass Loss: 0.000381\tDomain Loss: 1.387782\n", 893 | "[19900/23758 (84%)]\tLoss: 1.385729\tClass Loss: 0.000937\tDomain Loss: 1.384793\n", 894 | "\n", 895 | "Source Accuracy: 23632.0/23758 (99.4697%)\n", 896 | "Target Accuracy: 17982.0/23758 (75.6882%)\n", 897 | "Domain Accuracy: 26433.0/47516 (55.6297%)\n", 898 | "\n", 899 | "Epoch: 55\n", 900 | "[9900/23758 (42%)]\tLoss: 1.390172\tClass Loss: 0.000103\tDomain Loss: 1.390068\n", 901 | "[19900/23758 (84%)]\tLoss: 1.397405\tClass Loss: 0.000566\tDomain Loss: 1.396839\n", 902 | "\n", 903 | "Source Accuracy: 23667.0/23758 (99.6170%)\n", 904 | "Target Accuracy: 17792.0/23758 (74.8885%)\n", 905 | "Domain Accuracy: 21291.0/47516 (44.8081%)\n", 906 | "\n", 907 | "Epoch: 56\n" 908 | ] 909 | }, 910 | { 911 | "name": "stdout", 912 | "output_type": "stream", 913 | "text": [ 914 | "[9900/23758 (42%)]\tLoss: 1.423285\tClass Loss: 0.013461\tDomain Loss: 1.409823\n", 915 | "[19900/23758 (84%)]\tLoss: 1.385545\tClass Loss: 0.004150\tDomain Loss: 1.381396\n", 916 | "\n", 917 | "Source Accuracy: 23320.0/23758 (98.1564%)\n", 918 | "Target Accuracy: 16557.0/23758 (69.6902%)\n", 919 | "Domain Accuracy: 24780.0/47516 (52.1509%)\n", 920 | "\n", 921 | "Epoch: 57\n", 922 | "[9900/23758 (42%)]\tLoss: 1.397056\tClass Loss: 0.001016\tDomain Loss: 1.396040\n", 923 | "[19900/23758 (84%)]\tLoss: 1.388483\tClass Loss: 0.005153\tDomain Loss: 1.383330\n", 924 | "\n", 925 | "Source Accuracy: 23690.0/23758 (99.7138%)\n", 926 | "Target Accuracy: 17582.0/23758 (74.0045%)\n", 927 | "Domain Accuracy: 23527.0/47516 (49.5138%)\n", 928 | "\n", 929 | "Epoch: 58\n", 930 | "[9900/23758 (42%)]\tLoss: 1.379666\tClass Loss: 0.000552\tDomain Loss: 1.379114\n", 931 | "[19900/23758 (84%)]\tLoss: 1.377842\tClass Loss: 0.000836\tDomain Loss: 1.377006\n", 932 | "\n", 933 | "Source Accuracy: 23648.0/23758 (99.5370%)\n", 934 | "Target Accuracy: 17720.0/23758 (74.5854%)\n", 935 | "Domain Accuracy: 24101.0/47516 (50.7219%)\n", 936 | "\n", 937 | "Epoch: 59\n", 938 | "[9900/23758 (42%)]\tLoss: 1.393548\tClass Loss: 0.004813\tDomain Loss: 1.388736\n", 939 | "[19900/23758 (84%)]\tLoss: 1.389772\tClass Loss: 0.001039\tDomain Loss: 1.388732\n", 940 | "\n", 941 | "Source Accuracy: 23697.0/23758 (99.7432%)\n", 942 | "Target Accuracy: 17617.0/23758 (74.1519%)\n", 943 | "Domain Accuracy: 22155.0/47516 (46.6264%)\n", 944 | "\n", 945 | "Epoch: 60\n", 946 | "[9900/23758 (42%)]\tLoss: 1.391455\tClass Loss: 0.001419\tDomain Loss: 1.390036\n", 947 | "[19900/23758 (84%)]\tLoss: 1.386772\tClass Loss: 0.001127\tDomain Loss: 1.385644\n", 948 | "\n", 949 | "Source Accuracy: 23696.0/23758 (99.7390%)\n", 950 | "Target Accuracy: 17131.0/23758 (72.1062%)\n", 951 | "Domain Accuracy: 22442.0/47516 (47.2304%)\n", 952 | "\n", 953 | "Epoch: 61\n", 954 | "[9900/23758 (42%)]\tLoss: 1.384464\tClass Loss: 0.001719\tDomain Loss: 1.382745\n", 955 | "[19900/23758 (84%)]\tLoss: 1.382799\tClass Loss: 0.000321\tDomain Loss: 1.382478\n", 956 | "\n", 957 | "Source Accuracy: 23599.0/23758 (99.3308%)\n", 958 | "Target Accuracy: 16576.0/23758 (69.7702%)\n", 959 | "Domain Accuracy: 25357.0/47516 (53.3652%)\n", 960 | "\n", 961 | "Epoch: 62\n", 962 | "[9900/23758 (42%)]\tLoss: 1.386681\tClass Loss: 0.001861\tDomain Loss: 1.384820\n", 963 | "[19900/23758 (84%)]\tLoss: 1.389572\tClass Loss: 0.000776\tDomain Loss: 1.388795\n", 964 | "\n", 965 | "Source Accuracy: 23689.0/23758 (99.7096%)\n", 966 | "Target Accuracy: 17520.0/23758 (73.7436%)\n", 967 | "Domain Accuracy: 23726.0/47516 (49.9327%)\n", 968 | "\n", 969 | "Epoch: 63\n", 970 | "[9900/23758 (42%)]\tLoss: 1.383709\tClass Loss: 0.000419\tDomain Loss: 1.383290\n", 971 | "[19900/23758 (84%)]\tLoss: 1.390180\tClass Loss: 0.002337\tDomain Loss: 1.387843\n", 972 | "\n", 973 | "Source Accuracy: 23688.0/23758 (99.7054%)\n", 974 | "Target Accuracy: 17496.0/23758 (73.6426%)\n", 975 | "Domain Accuracy: 26305.0/47516 (55.3603%)\n", 976 | "\n", 977 | "Epoch: 64\n", 978 | "[9900/23758 (42%)]\tLoss: 1.388847\tClass Loss: 0.000854\tDomain Loss: 1.387993\n", 979 | "[19900/23758 (84%)]\tLoss: 1.386437\tClass Loss: 0.001053\tDomain Loss: 1.385384\n", 980 | "\n", 981 | "Source Accuracy: 23694.0/23758 (99.7306%)\n", 982 | "Target Accuracy: 18211.0/23758 (76.6521%)\n", 983 | "Domain Accuracy: 24766.0/47516 (52.1214%)\n", 984 | "\n", 985 | "Epoch: 65\n", 986 | "[9900/23758 (42%)]\tLoss: 1.387684\tClass Loss: 0.000930\tDomain Loss: 1.386754\n", 987 | "[19900/23758 (84%)]\tLoss: 1.392374\tClass Loss: 0.000418\tDomain Loss: 1.391956\n", 988 | "\n", 989 | "Source Accuracy: 23651.0/23758 (99.5496%)\n", 990 | "Target Accuracy: 18397.0/23758 (77.4350%)\n", 991 | "Domain Accuracy: 21347.0/47516 (44.9259%)\n", 992 | "\n", 993 | "Epoch: 66\n", 994 | "[9900/23758 (42%)]\tLoss: 1.391102\tClass Loss: 0.001445\tDomain Loss: 1.389657\n", 995 | "[19900/23758 (84%)]\tLoss: 1.388028\tClass Loss: 0.000639\tDomain Loss: 1.387389\n", 996 | "\n", 997 | "Source Accuracy: 23698.0/23758 (99.7475%)\n", 998 | "Target Accuracy: 18348.0/23758 (77.2287%)\n", 999 | "Domain Accuracy: 23836.0/47516 (50.1642%)\n", 1000 | "\n", 1001 | "Epoch: 67\n", 1002 | "[9900/23758 (42%)]\tLoss: 1.389322\tClass Loss: 0.001797\tDomain Loss: 1.387525\n", 1003 | "[19900/23758 (84%)]\tLoss: 1.390065\tClass Loss: 0.000240\tDomain Loss: 1.389825\n", 1004 | "\n", 1005 | "Source Accuracy: 23695.0/23758 (99.7348%)\n", 1006 | "Target Accuracy: 18101.0/23758 (76.1891%)\n", 1007 | "Domain Accuracy: 21122.0/47516 (44.4524%)\n", 1008 | "\n", 1009 | "Epoch: 68\n", 1010 | "[9900/23758 (42%)]\tLoss: 1.388727\tClass Loss: 0.000581\tDomain Loss: 1.388146\n", 1011 | "[19900/23758 (84%)]\tLoss: 1.385180\tClass Loss: 0.000080\tDomain Loss: 1.385100\n", 1012 | "\n", 1013 | "Source Accuracy: 23687.0/23758 (99.7012%)\n", 1014 | "Target Accuracy: 17998.0/23758 (75.7555%)\n", 1015 | "Domain Accuracy: 21351.0/47516 (44.9343%)\n", 1016 | "\n", 1017 | "Epoch: 69\n", 1018 | "[9900/23758 (42%)]\tLoss: 1.387236\tClass Loss: 0.001813\tDomain Loss: 1.385423\n", 1019 | "[19900/23758 (84%)]\tLoss: 1.385226\tClass Loss: 0.000419\tDomain Loss: 1.384807\n", 1020 | "\n", 1021 | "Source Accuracy: 23694.0/23758 (99.7306%)\n", 1022 | "Target Accuracy: 18222.0/23758 (76.6984%)\n", 1023 | "Domain Accuracy: 24598.0/47516 (51.7678%)\n", 1024 | "\n", 1025 | "Epoch: 70\n", 1026 | "[9900/23758 (42%)]\tLoss: 1.386982\tClass Loss: 0.000377\tDomain Loss: 1.386604\n", 1027 | "[19900/23758 (84%)]\tLoss: 1.389788\tClass Loss: 0.000276\tDomain Loss: 1.389512\n", 1028 | "\n", 1029 | "Source Accuracy: 23677.0/23758 (99.6591%)\n", 1030 | "Target Accuracy: 18449.0/23758 (77.6538%)\n", 1031 | "Domain Accuracy: 22756.0/47516 (47.8912%)\n", 1032 | "\n", 1033 | "Epoch: 71\n", 1034 | "[9900/23758 (42%)]\tLoss: 1.385960\tClass Loss: 0.000379\tDomain Loss: 1.385581\n", 1035 | "[19900/23758 (84%)]\tLoss: 1.385307\tClass Loss: 0.000323\tDomain Loss: 1.384984\n", 1036 | "\n", 1037 | "Source Accuracy: 23685.0/23758 (99.6927%)\n", 1038 | "Target Accuracy: 17950.0/23758 (75.5535%)\n", 1039 | "Domain Accuracy: 23700.0/47516 (49.8779%)\n", 1040 | "\n", 1041 | "Epoch: 72\n", 1042 | "[9900/23758 (42%)]\tLoss: 1.388822\tClass Loss: 0.002081\tDomain Loss: 1.386740\n", 1043 | "[19900/23758 (84%)]\tLoss: 1.383132\tClass Loss: 0.000107\tDomain Loss: 1.383025\n", 1044 | "\n", 1045 | "Source Accuracy: 23695.0/23758 (99.7348%)\n", 1046 | "Target Accuracy: 17788.0/23758 (74.8716%)\n", 1047 | "Domain Accuracy: 26696.0/47516 (56.1832%)\n", 1048 | "\n", 1049 | "Epoch: 73\n", 1050 | "[9900/23758 (42%)]\tLoss: 1.381318\tClass Loss: 0.000290\tDomain Loss: 1.381028\n", 1051 | "[19900/23758 (84%)]\tLoss: 1.386827\tClass Loss: 0.001851\tDomain Loss: 1.384976\n", 1052 | "\n", 1053 | "Source Accuracy: 23699.0/23758 (99.7517%)\n", 1054 | "Target Accuracy: 17854.0/23758 (75.1494%)\n", 1055 | "Domain Accuracy: 24211.0/47516 (50.9534%)\n", 1056 | "\n", 1057 | "Epoch: 74\n", 1058 | "[9900/23758 (42%)]\tLoss: 1.394059\tClass Loss: 0.006660\tDomain Loss: 1.387399\n", 1059 | "[19900/23758 (84%)]\tLoss: 1.385212\tClass Loss: 0.000113\tDomain Loss: 1.385099\n", 1060 | "\n", 1061 | "Source Accuracy: 23688.0/23758 (99.7054%)\n", 1062 | "Target Accuracy: 17941.0/23758 (75.5156%)\n", 1063 | "Domain Accuracy: 23144.0/47516 (48.7078%)\n", 1064 | "\n", 1065 | "Epoch: 75\n", 1066 | "[9900/23758 (42%)]\tLoss: 1.388199\tClass Loss: 0.000258\tDomain Loss: 1.387941\n", 1067 | "[19900/23758 (84%)]\tLoss: 1.388942\tClass Loss: 0.000262\tDomain Loss: 1.388680\n", 1068 | "\n", 1069 | "Source Accuracy: 23696.0/23758 (99.7390%)\n", 1070 | "Target Accuracy: 17787.0/23758 (74.8674%)\n", 1071 | "Domain Accuracy: 19796.0/47516 (41.6618%)\n", 1072 | "\n", 1073 | "Epoch: 76\n", 1074 | "[9900/23758 (42%)]\tLoss: 1.381775\tClass Loss: 0.000100\tDomain Loss: 1.381675\n", 1075 | "[19900/23758 (84%)]\tLoss: 1.384601\tClass Loss: 0.000455\tDomain Loss: 1.384146\n", 1076 | "\n", 1077 | "Source Accuracy: 23698.0/23758 (99.7475%)\n", 1078 | "Target Accuracy: 18020.0/23758 (75.8481%)\n", 1079 | "Domain Accuracy: 27055.0/47516 (56.9387%)\n", 1080 | "\n", 1081 | "Epoch: 77\n", 1082 | "[9900/23758 (42%)]\tLoss: 1.392953\tClass Loss: 0.000437\tDomain Loss: 1.392516\n", 1083 | "[19900/23758 (84%)]\tLoss: 1.387936\tClass Loss: 0.000265\tDomain Loss: 1.387671\n", 1084 | "\n", 1085 | "Source Accuracy: 23700.0/23758 (99.7559%)\n", 1086 | "Target Accuracy: 18073.0/23758 (76.0712%)\n", 1087 | "Domain Accuracy: 25901.0/47516 (54.5101%)\n", 1088 | "\n", 1089 | "Epoch: 78\n", 1090 | "[9900/23758 (42%)]\tLoss: 1.385173\tClass Loss: 0.000475\tDomain Loss: 1.384698\n", 1091 | "[19900/23758 (84%)]\tLoss: 1.382721\tClass Loss: 0.000118\tDomain Loss: 1.382603\n", 1092 | "\n", 1093 | "Source Accuracy: 23698.0/23758 (99.7475%)\n", 1094 | "Target Accuracy: 17794.0/23758 (74.8969%)\n", 1095 | "Domain Accuracy: 19768.0/47516 (41.6028%)\n", 1096 | "\n", 1097 | "Epoch: 79\n", 1098 | "[9900/23758 (42%)]\tLoss: 1.388034\tClass Loss: 0.000330\tDomain Loss: 1.387705\n", 1099 | "[19900/23758 (84%)]\tLoss: 1.388049\tClass Loss: 0.001137\tDomain Loss: 1.386912\n", 1100 | "\n", 1101 | "Source Accuracy: 23698.0/23758 (99.7475%)\n", 1102 | "Target Accuracy: 17905.0/23758 (75.3641%)\n", 1103 | "Domain Accuracy: 24916.0/47516 (52.4371%)\n", 1104 | "\n", 1105 | "Epoch: 80\n", 1106 | "[9900/23758 (42%)]\tLoss: 1.385367\tClass Loss: 0.000155\tDomain Loss: 1.385212\n", 1107 | "[19900/23758 (84%)]\tLoss: 1.387840\tClass Loss: 0.001047\tDomain Loss: 1.386793\n", 1108 | "\n", 1109 | "Source Accuracy: 23689.0/23758 (99.7096%)\n", 1110 | "Target Accuracy: 17780.0/23758 (74.8379%)\n", 1111 | "Domain Accuracy: 26826.0/47516 (56.4568%)\n", 1112 | "\n", 1113 | "Epoch: 81\n", 1114 | "[9900/23758 (42%)]\tLoss: 1.386810\tClass Loss: 0.000156\tDomain Loss: 1.386654\n", 1115 | "[19900/23758 (84%)]\tLoss: 1.386763\tClass Loss: 0.000430\tDomain Loss: 1.386333\n", 1116 | "\n", 1117 | "Source Accuracy: 23698.0/23758 (99.7475%)\n", 1118 | "Target Accuracy: 17850.0/23758 (75.1326%)\n", 1119 | "Domain Accuracy: 24431.0/47516 (51.4164%)\n", 1120 | "\n", 1121 | "Epoch: 82\n", 1122 | "[9900/23758 (42%)]\tLoss: 1.384042\tClass Loss: 0.000143\tDomain Loss: 1.383898\n", 1123 | "[19900/23758 (84%)]\tLoss: 1.390027\tClass Loss: 0.000313\tDomain Loss: 1.389714\n", 1124 | "\n", 1125 | "Source Accuracy: 23698.0/23758 (99.7475%)\n", 1126 | "Target Accuracy: 17824.0/23758 (75.0232%)\n", 1127 | "Domain Accuracy: 20699.0/47516 (43.5622%)\n", 1128 | "\n", 1129 | "Epoch: 83\n", 1130 | "[9900/23758 (42%)]\tLoss: 1.388460\tClass Loss: 0.000152\tDomain Loss: 1.388307\n", 1131 | "[19900/23758 (84%)]\tLoss: 1.384058\tClass Loss: 0.000475\tDomain Loss: 1.383582\n", 1132 | "\n", 1133 | "Source Accuracy: 23695.0/23758 (99.7348%)\n", 1134 | "Target Accuracy: 18037.0/23758 (75.9197%)\n", 1135 | "Domain Accuracy: 28904.0/47516 (60.8300%)\n", 1136 | "\n", 1137 | "Epoch: 84\n" 1138 | ] 1139 | }, 1140 | { 1141 | "name": "stdout", 1142 | "output_type": "stream", 1143 | "text": [ 1144 | "[9900/23758 (42%)]\tLoss: 1.386890\tClass Loss: 0.000391\tDomain Loss: 1.386499\n", 1145 | "[19900/23758 (84%)]\tLoss: 1.386707\tClass Loss: 0.000136\tDomain Loss: 1.386571\n", 1146 | "\n", 1147 | "Source Accuracy: 23681.0/23758 (99.6759%)\n", 1148 | "Target Accuracy: 18251.0/23758 (76.8204%)\n", 1149 | "Domain Accuracy: 24435.0/47516 (51.4248%)\n", 1150 | "\n", 1151 | "Epoch: 85\n", 1152 | "[9900/23758 (42%)]\tLoss: 1.388055\tClass Loss: 0.000140\tDomain Loss: 1.387915\n", 1153 | "[19900/23758 (84%)]\tLoss: 1.387120\tClass Loss: 0.000065\tDomain Loss: 1.387055\n", 1154 | "\n", 1155 | "Source Accuracy: 23700.0/23758 (99.7559%)\n", 1156 | "Target Accuracy: 17882.0/23758 (75.2673%)\n", 1157 | "Domain Accuracy: 23750.0/47516 (49.9832%)\n", 1158 | "\n", 1159 | "Epoch: 86\n", 1160 | "[9900/23758 (42%)]\tLoss: 1.385075\tClass Loss: 0.000114\tDomain Loss: 1.384961\n", 1161 | "[19900/23758 (84%)]\tLoss: 1.387286\tClass Loss: 0.000068\tDomain Loss: 1.387218\n", 1162 | "\n", 1163 | "Source Accuracy: 23700.0/23758 (99.7559%)\n", 1164 | "Target Accuracy: 17782.0/23758 (74.8464%)\n", 1165 | "Domain Accuracy: 21224.0/47516 (44.6671%)\n", 1166 | "\n", 1167 | "Epoch: 87\n", 1168 | "[9900/23758 (42%)]\tLoss: 1.387931\tClass Loss: 0.000085\tDomain Loss: 1.387846\n", 1169 | "[19900/23758 (84%)]\tLoss: 1.388863\tClass Loss: 0.000272\tDomain Loss: 1.388591\n", 1170 | "\n", 1171 | "Source Accuracy: 23695.0/23758 (99.7348%)\n", 1172 | "Target Accuracy: 18178.0/23758 (76.5132%)\n", 1173 | "Domain Accuracy: 25371.0/47516 (53.3946%)\n", 1174 | "\n", 1175 | "Epoch: 88\n", 1176 | "[9900/23758 (42%)]\tLoss: 1.383432\tClass Loss: 0.000168\tDomain Loss: 1.383264\n", 1177 | "[19900/23758 (84%)]\tLoss: 1.390494\tClass Loss: 0.000377\tDomain Loss: 1.390117\n", 1178 | "\n", 1179 | "Source Accuracy: 23696.0/23758 (99.7390%)\n", 1180 | "Target Accuracy: 18351.0/23758 (77.2414%)\n", 1181 | "Domain Accuracy: 23158.0/47516 (48.7373%)\n", 1182 | "\n", 1183 | "Epoch: 89\n", 1184 | "[9900/23758 (42%)]\tLoss: 1.387791\tClass Loss: 0.000102\tDomain Loss: 1.387690\n", 1185 | "[19900/23758 (84%)]\tLoss: 1.387672\tClass Loss: 0.000246\tDomain Loss: 1.387427\n", 1186 | "\n", 1187 | "Source Accuracy: 23700.0/23758 (99.7559%)\n", 1188 | "Target Accuracy: 18127.0/23758 (76.2985%)\n", 1189 | "Domain Accuracy: 23331.0/47516 (49.1014%)\n", 1190 | "\n", 1191 | "Epoch: 90\n", 1192 | "[9900/23758 (42%)]\tLoss: 1.382092\tClass Loss: 0.001599\tDomain Loss: 1.380493\n", 1193 | "[19900/23758 (84%)]\tLoss: 1.388073\tClass Loss: 0.000203\tDomain Loss: 1.387871\n", 1194 | "\n", 1195 | "Source Accuracy: 23696.0/23758 (99.7390%)\n", 1196 | "Target Accuracy: 18096.0/23758 (76.1680%)\n", 1197 | "Domain Accuracy: 22155.0/47516 (46.6264%)\n", 1198 | "\n", 1199 | "Epoch: 91\n", 1200 | "[9900/23758 (42%)]\tLoss: 1.389501\tClass Loss: 0.000175\tDomain Loss: 1.389326\n", 1201 | "[19900/23758 (84%)]\tLoss: 1.388921\tClass Loss: 0.000348\tDomain Loss: 1.388572\n", 1202 | "\n", 1203 | "Source Accuracy: 23700.0/23758 (99.7559%)\n", 1204 | "Target Accuracy: 18031.0/23758 (75.8944%)\n", 1205 | "Domain Accuracy: 26206.0/47516 (55.1519%)\n", 1206 | "\n", 1207 | "Epoch: 92\n", 1208 | "[9900/23758 (42%)]\tLoss: 1.387808\tClass Loss: 0.000209\tDomain Loss: 1.387600\n", 1209 | "[19900/23758 (84%)]\tLoss: 1.384339\tClass Loss: 0.000166\tDomain Loss: 1.384173\n", 1210 | "\n", 1211 | "Source Accuracy: 23699.0/23758 (99.7517%)\n", 1212 | "Target Accuracy: 18029.0/23758 (75.8860%)\n", 1213 | "Domain Accuracy: 26219.0/47516 (55.1793%)\n", 1214 | "\n", 1215 | "Epoch: 93\n", 1216 | "[9900/23758 (42%)]\tLoss: 1.389283\tClass Loss: 0.000151\tDomain Loss: 1.389132\n", 1217 | "[19900/23758 (84%)]\tLoss: 1.388346\tClass Loss: 0.000238\tDomain Loss: 1.388108\n", 1218 | "\n", 1219 | "Source Accuracy: 23699.0/23758 (99.7517%)\n", 1220 | "Target Accuracy: 18213.0/23758 (76.6605%)\n", 1221 | "Domain Accuracy: 21317.0/47516 (44.8628%)\n", 1222 | "\n", 1223 | "Epoch: 94\n", 1224 | "[9900/23758 (42%)]\tLoss: 1.384834\tClass Loss: 0.000087\tDomain Loss: 1.384746\n", 1225 | "[19900/23758 (84%)]\tLoss: 1.385881\tClass Loss: 0.000071\tDomain Loss: 1.385810\n", 1226 | "\n", 1227 | "Source Accuracy: 23699.0/23758 (99.7517%)\n", 1228 | "Target Accuracy: 18220.0/23758 (76.6900%)\n", 1229 | "Domain Accuracy: 22597.0/47516 (47.5566%)\n", 1230 | "\n", 1231 | "Epoch: 95\n", 1232 | "[9900/23758 (42%)]\tLoss: 1.384257\tClass Loss: 0.000177\tDomain Loss: 1.384079\n", 1233 | "[19900/23758 (84%)]\tLoss: 1.389578\tClass Loss: 0.000259\tDomain Loss: 1.389319\n", 1234 | "\n", 1235 | "Source Accuracy: 23690.0/23758 (99.7138%)\n", 1236 | "Target Accuracy: 18204.0/23758 (76.6226%)\n", 1237 | "Domain Accuracy: 20446.0/47516 (43.0297%)\n", 1238 | "\n", 1239 | "Epoch: 96\n", 1240 | "[9900/23758 (42%)]\tLoss: 1.388124\tClass Loss: 0.000282\tDomain Loss: 1.387842\n", 1241 | "[19900/23758 (84%)]\tLoss: 1.381596\tClass Loss: 0.000195\tDomain Loss: 1.381401\n", 1242 | "\n", 1243 | "Source Accuracy: 23698.0/23758 (99.7475%)\n", 1244 | "Target Accuracy: 18120.0/23758 (76.2690%)\n", 1245 | "Domain Accuracy: 27461.0/47516 (57.7932%)\n", 1246 | "\n", 1247 | "Epoch: 97\n", 1248 | "[9900/23758 (42%)]\tLoss: 1.387494\tClass Loss: 0.000096\tDomain Loss: 1.387398\n", 1249 | "[19900/23758 (84%)]\tLoss: 1.389289\tClass Loss: 0.000118\tDomain Loss: 1.389171\n", 1250 | "\n", 1251 | "Source Accuracy: 23699.0/23758 (99.7517%)\n", 1252 | "Target Accuracy: 18043.0/23758 (75.9449%)\n", 1253 | "Domain Accuracy: 23975.0/47516 (50.4567%)\n", 1254 | "\n", 1255 | "Epoch: 98\n", 1256 | "[9900/23758 (42%)]\tLoss: 1.388064\tClass Loss: 0.000264\tDomain Loss: 1.387800\n", 1257 | "[19900/23758 (84%)]\tLoss: 1.388845\tClass Loss: 0.003562\tDomain Loss: 1.385282\n", 1258 | "\n", 1259 | "Source Accuracy: 23697.0/23758 (99.7432%)\n", 1260 | "Target Accuracy: 18204.0/23758 (76.6226%)\n", 1261 | "Domain Accuracy: 26050.0/47516 (54.8236%)\n", 1262 | "\n", 1263 | "Epoch: 99\n", 1264 | "[9900/23758 (42%)]\tLoss: 1.382862\tClass Loss: 0.000112\tDomain Loss: 1.382750\n", 1265 | "[19900/23758 (84%)]\tLoss: 1.386950\tClass Loss: 0.000206\tDomain Loss: 1.386744\n", 1266 | "\n", 1267 | "Source Accuracy: 23698.0/23758 (99.7475%)\n", 1268 | "Target Accuracy: 18063.0/23758 (76.0291%)\n", 1269 | "Domain Accuracy: 20906.0/47516 (43.9978%)\n", 1270 | "\n", 1271 | "total run time: (min) 18.27643547852834\n" 1272 | ] 1273 | } 1274 | ], 1275 | "source": [ 1276 | "def main():\n", 1277 | "\n", 1278 | " # prepare the source data and target data\n", 1279 | " \n", 1280 | " src_train_dataloader = get_train_loader(data1,label1,batch_size=batch_size,shuffle=False)\n", 1281 | " src_test_dataloader = get_test_loader(data1,label1,batch_size=batch_size,shuffle=False)\n", 1282 | " tgt_train_dataloader = get_train_loader(data2,label2,batch_size=batch_size,shuffle=False)\n", 1283 | " tgt_test_dataloader = get_test_loader(data2,label2,batch_size=batch_size,shuffle=False)\n", 1284 | "\n", 1285 | " # init models\n", 1286 | " feature_extractor = Extractor()\n", 1287 | " class_classifier = Class_classifier()\n", 1288 | " domain_classifier = Domain_classifier()\n", 1289 | "\n", 1290 | " feature_extractor.cuda()\n", 1291 | " class_classifier.cuda()\n", 1292 | " domain_classifier.cuda()\n", 1293 | "\n", 1294 | " # init criterions\n", 1295 | " class_criterion = nn.NLLLoss()\n", 1296 | " domain_criterion = nn.NLLLoss()\n", 1297 | "\n", 1298 | " # init optimizer\n", 1299 | " optimizer = optim.SGD([\n", 1300 | " {'params': feature_extractor.parameters()},\n", 1301 | " {'params': class_classifier.parameters()},\n", 1302 | " {'params': domain_classifier.parameters()}\n", 1303 | " ], lr= 0.01, momentum= 0.9)\n", 1304 | "\n", 1305 | " for epoch in range(100):\n", 1306 | " \n", 1307 | " print('Epoch: {}'.format(epoch))\n", 1308 | " train('dann', feature_extractor, class_classifier, domain_classifier, class_criterion, domain_criterion,\n", 1309 | " src_train_dataloader, tgt_train_dataloader, optimizer, epoch)\n", 1310 | " test(feature_extractor, class_classifier, domain_classifier, src_test_dataloader, tgt_test_dataloader)\n", 1311 | "\n", 1312 | " \n", 1313 | "total_loss, d_loss, c_loss = [],[],[]\n", 1314 | "acc_list1, acc_list2, acc_list3 = [],[],[]\n", 1315 | "if __name__ == '__main__':\n", 1316 | " gamma = 10\n", 1317 | " theta = 1\n", 1318 | " batch_size = 100\n", 1319 | " time_start=time.time()\n", 1320 | " main()\n", 1321 | " time_end=time.time()\n", 1322 | " print('total run time: (min)',(time_end-time_start)/60.)" 1323 | ] 1324 | }, 1325 | { 1326 | "cell_type": "code", 1327 | "execution_count": 8, 1328 | "metadata": {}, 1329 | "outputs": [ 1330 | { 1331 | "data": { 1332 | "image/png": "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\n", 1333 | "text/plain": [ 1334 | "
" 1335 | ] 1336 | }, 1337 | "metadata": { 1338 | "needs_background": "light" 1339 | }, 1340 | "output_type": "display_data" 1341 | } 1342 | ], 1343 | "source": [ 1344 | "plt.plot(range(len(total_loss)),total_loss,c='r',label='total_loss')\n", 1345 | "plt.plot(d_loss,c='b',label='domain_loss')\n", 1346 | "plt.plot(c_loss,c='y',label='clf_loss')\n", 1347 | "plt.title('target domain: session2')\n", 1348 | "plt.legend(loc='best')\n", 1349 | "plt.show()" 1350 | ] 1351 | }, 1352 | { 1353 | "cell_type": "code", 1354 | "execution_count": 9, 1355 | "metadata": {}, 1356 | "outputs": [ 1357 | { 1358 | "name": "stdout", 1359 | "output_type": "stream", 1360 | "text": [ 1361 | "max target accuracy: 77.8516710160788\n" 1362 | ] 1363 | }, 1364 | { 1365 | "data": { 1366 | "image/png": "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\n", 1367 | "text/plain": [ 1368 | "
" 1369 | ] 1370 | }, 1371 | "metadata": { 1372 | "needs_background": "light" 1373 | }, 1374 | "output_type": "display_data" 1375 | } 1376 | ], 1377 | "source": [ 1378 | "print('max target accuracy: ',max(acc_list2))\n", 1379 | "plt.plot(range(len(acc_list1)),acc_list1,c='r',label='source_acc')\n", 1380 | "plt.plot(acc_list2,c='b',label='target_acc')\n", 1381 | "plt.plot(acc_list3,c='y',label='domain_acc')\n", 1382 | "plt.axhline(max(acc_list2),c='b',linestyle='--')\n", 1383 | "plt.title('target domain: session2')\n", 1384 | "plt.legend(loc='best')\n", 1385 | "plt.show()" 1386 | ] 1387 | }, 1388 | { 1389 | "cell_type": "code", 1390 | "execution_count": null, 1391 | "metadata": {}, 1392 | "outputs": [], 1393 | "source": [] 1394 | } 1395 | ], 1396 | "metadata": { 1397 | "kernelspec": { 1398 | "display_name": "pytorch", 1399 | "language": "python", 1400 | "name": "pytorch" 1401 | }, 1402 | "language_info": { 1403 | "codemirror_mode": { 1404 | "name": "ipython", 1405 | "version": 3 1406 | }, 1407 | "file_extension": ".py", 1408 | "mimetype": "text/x-python", 1409 | "name": "python", 1410 | "nbconvert_exporter": "python", 1411 | "pygments_lexer": "ipython3", 1412 | "version": "3.6.10" 1413 | } 1414 | }, 1415 | "nbformat": 4, 1416 | "nbformat_minor": 4 1417 | } 1418 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # MSDA 2 | ### Introduction 3 | 4 | Multiple Source Domain Adaptation with Adversarial Learning 5 | GAN is wildly applied in Domain Adaptation, which tries to align data with different distribution into the same. The idea of this research is quite similiar to this paper, with similiar architecture, [https://arxiv.org/abs/1705.09684 ]. 6 | 7 | The code refers code from this repo https://github.com/daoyuan98/MSDA and https://github.com/pumpikano/tf-dann . Actually, the DANN(single-source-DA) is used as a baseline method. 8 | 9 | The dataset is not provided here since it's too large. The dataset I used is called SEED, which is a EEG dataset for emotion classification developed by Shanghai JiaoTong University. It's an open-source dataset, you can refer here.[http://bcmi.sjtu.edu.cn/home/seed/] 10 | All code is provided by jupyter notebook with excuted records. 11 | ### Results 12 | 13 | 14 | ##### 1. The Classfication Accuracy, the Domain Accuracy and Loss.(epoch of 1000) 15 | ![](images/48,1000,p_acc.png)![](images/48,1000,d_acc.png)![](images/48,1000,loss.png) 16 | 17 | ##### 2. Comparision of DANN. (epoch of 100) 18 | ![](images/dann.png) 19 | ##### 3. Visulization of proposed method. 20 | Demision Decomposition by both S-tne and PCA into two demension space. 21 | ![](images/visulization.png) 22 | -------------------------------------------------------------------------------- /images/48,1000,d_acc.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dingkmC/MSDA/2b997b40b37cc268c316a8ae3e98e80862c2ec4f/images/48,1000,d_acc.png -------------------------------------------------------------------------------- /images/48,1000,loss.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dingkmC/MSDA/2b997b40b37cc268c316a8ae3e98e80862c2ec4f/images/48,1000,loss.png -------------------------------------------------------------------------------- /images/48,1000,p_acc.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dingkmC/MSDA/2b997b40b37cc268c316a8ae3e98e80862c2ec4f/images/48,1000,p_acc.png -------------------------------------------------------------------------------- /images/DC_DA_10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dingkmC/MSDA/2b997b40b37cc268c316a8ae3e98e80862c2ec4f/images/DC_DA_10.png -------------------------------------------------------------------------------- /images/DC_original_10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dingkmC/MSDA/2b997b40b37cc268c316a8ae3e98e80862c2ec4f/images/DC_original_10.png -------------------------------------------------------------------------------- /images/dann.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dingkmC/MSDA/2b997b40b37cc268c316a8ae3e98e80862c2ec4f/images/dann.png -------------------------------------------------------------------------------- /images/init: -------------------------------------------------------------------------------- 1 | init 2 | -------------------------------------------------------------------------------- /images/visulization.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dingkmC/MSDA/2b997b40b37cc268c316a8ae3e98e80862c2ec4f/images/visulization.png --------------------------------------------------------------------------------