diff --git a/README.md b/README.md index da747a1..541dc44 100644 --- a/README.md +++ b/README.md @@ -1,24 +1,10 @@ # Deep Pixel-wise Binary Supervision for Face PAD in Pytorch -# Installation - -```bash -virtualenv -p python3 venv -source venv/bin/activate -pip install -r requirements.txt - -``` - -# Data preparation - - - -# Training - +# Data +You can use NUAA, Celeba. In my branch I use Celeba # Testing - - +Run notebook/CELEBA-CELEBA in jupyter notebook for your database. You wil get metrics, ROC curve, confusion matrix. # Reference [1] Deep Pixel-wise Binary Supervision for Face Presentation Attack Detection diff --git a/notebooks/CELEBA - CELEBA.ipynb b/notebooks/CELEBA - CELEBA.ipynb new file mode 100644 index 0000000..7f698bb --- /dev/null +++ b/notebooks/CELEBA - CELEBA.ipynb @@ -0,0 +1,2047 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "id": "b2489936", + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "from random import randint\n", + "import torch\n", + "import torchvision\n", + "from trainer.base import BaseTrainer\n", + "from utils.meters import AverageMeter\n", + "from utils.eval import predict, calc_acc, add_images_tb\n", + "\n", + "\n", + "class Trainer(BaseTrainer):\n", + " def __init__(self, cfg, network, optimizer, loss, lr_scheduler, device, trainloader, testloader, writer):\n", + " super(Trainer, self).__init__(cfg, network, optimizer, loss, lr_scheduler, device, trainloader, testloader, writer)\n", + " self.network = self.network.to(device)\n", + " self.train_loss_metric = AverageMeter(writer=writer, name='Loss/train', length=len(self.trainloader))\n", + " self.train_acc_metric = AverageMeter(writer=writer, name='Accuracy/train', length=len(self.trainloader))\n", + "\n", + " self.val_loss_metric = AverageMeter(writer=writer, name='Loss/val', length=len(self.testloader))\n", + " self.val_acc_metric = AverageMeter(writer=writer, name='Accuracy/val', length=len(self.testloader))\n", + " self.best_val_acc = 0\n", + "\n", + "\n", + " def load_model(self):\n", + " saved_name = os.path.join(self.cfg['output_dir'], '{}_{}.pth'.format(self.cfg['model']['base'], self.cfg['dataset']['name']))\n", + " state = torch.load(saved_name)\n", + "\n", + " self.optimizer.load_state_dict(state['optimizer'])\n", + " self.network.load_state_dict(state['state_dict'])\n", + "\n", + "\n", + " def save_model(self, epoch):\n", + " if not os.path.exists(self.cfg['output_dir']):\n", + " os.makedirs(self.cfg['output_dir'])\n", + "\n", + " saved_name = os.path.join(self.cfg['output_dir'], '{}_{}.pth'.format(self.cfg['model']['base'], self.cfg['dataset']['name']))\n", + "\n", + " state = {\n", + " 'epoch': epoch,\n", + " 'state_dict': self.network.state_dict(),\n", + " 'optimizer': self.optimizer.state_dict()\n", + " }\n", + " \n", + " torch.save(state, saved_name)\n", + "\n", + "\n", + " def train_one_epoch(self, epoch):\n", + "\n", + " self.network.train()\n", + " self.train_loss_metric.reset(epoch)\n", + " self.train_acc_metric.reset(epoch)\n", + "\n", + " for i, (img, mask, label) in enumerate(self.trainloader):\n", + " img, mask, label = img.to(self.device), mask.to(self.device), label.to(self.device)\n", + " net_mask, net_label = self.network(img)\n", + " self.optimizer.zero_grad()\n", + " loss = self.loss(net_mask, net_label, mask, label)\n", + " loss.backward()\n", + " self.optimizer.step()\n", + "\n", + " # Calculate predictions\n", + " preds, _ = predict(net_mask, net_label, score_type=self.cfg['test']['score_type'])\n", + " targets, _ = predict(mask, label, score_type=self.cfg['test']['score_type'])\n", + " acc = calc_acc(preds, targets)\n", + " # Update metrics\n", + " self.train_loss_metric.update(loss.item())\n", + " self.train_acc_metric.update(acc)\n", + "\n", + " print('Epoch: {}, iter: {}, loss: {}, acc: {}'.format(epoch + 1, epoch * len(self.trainloader) + i + 1, self.train_loss_metric.avg, self.train_acc_metric.avg))\n", + "\n", + "\n", + " def train(self):\n", + "\n", + " for epoch in range(self.cfg['train']['num_epochs']):\n", + " self.train_one_epoch(epoch)\n", + " epoch_acc = self.validate(epoch)\n", + " # if epoch_acc > self.best_val_acc:\n", + " # self.best_val_acc = epoch_acc\n", + " self.save_model(epoch)\n", + "\n", + "\n", + " def validate(self, epoch):\n", + " self.network.eval()\n", + " self.val_loss_metric.reset(epoch)\n", + " self.val_acc_metric.reset(epoch)\n", + "\n", + " seed = randint(0, len(self.testloader)-1)\n", + "\n", + " for i, (img, mask, label) in enumerate(self.testloader):\n", + " img, mask, label = img.to(self.device), mask.to(self.device), label.to(self.device)\n", + " net_mask, net_label = self.network(img)\n", + " loss = self.loss(net_mask, net_label, mask, label)\n", + "\n", + " # Calculate predictions\n", + " preds, score = predict(net_mask, net_label, score_type=self.cfg['test']['score_type'])\n", + " targets, _ = predict(mask, label, score_type=self.cfg['test']['score_type'])\n", + " acc = calc_acc(preds, targets)\n", + " # Update metrics\n", + " self.val_loss_metric.update(loss.item())\n", + " self.val_acc_metric.update(acc)\n", + "\n", + " \n", + " if i == seed:\n", + " add_images_tb(self.cfg, epoch, img, preds, targets, score, self.writer)\n", + "\n", + " return self.val_acc_metric.avg\n" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "14a05364", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "C:\\ProgramData\\Anaconda3\\envs\\0\\lib\\site-packages\\torch\\nn\\functional.py:1806: UserWarning: nn.functional.sigmoid is deprecated. Use torch.sigmoid instead.\n", + " warnings.warn(\"nn.functional.sigmoid is deprecated. Use torch.sigmoid instead.\")\n", + "C:\\ProgramData\\Anaconda3\\envs\\0\\lib\\site-packages\\torch\\nn\\functional.py:1806: UserWarning: nn.functional.sigmoid is deprecated. Use torch.sigmoid instead.\n", + " warnings.warn(\"nn.functional.sigmoid is deprecated. Use torch.sigmoid instead.\")\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 1, iter: 1, loss: 0.7527894973754883, acc: 0.4583333432674408\n", + "Epoch: 1, iter: 2, loss: 0.7930410802364349, acc: 0.375\n", + "Epoch: 1, iter: 3, loss: 0.7943640947341919, acc: 0.4861111044883728\n", + "Epoch: 1, iter: 4, loss: 0.7722362577915192, acc: 0.5416666567325592\n", + "Epoch: 1, iter: 5, loss: 0.7666640639305115, acc: 0.5666666626930237\n", + "Epoch: 1, iter: 6, loss: 0.7519637842973074, acc: 0.5763888855775198\n", + "Epoch: 1, iter: 7, loss: 0.7344611542565482, acc: 0.6011904733521598\n", + "Epoch: 1, iter: 8, loss: 0.7266063839197159, acc: 0.609375\n", + "Epoch: 1, iter: 9, loss: 0.7239363723331027, acc: 0.6111111111111112\n", + "Epoch: 1, iter: 10, loss: 0.7149448394775391, acc: 0.625\n", + "Epoch: 1, iter: 11, loss: 0.7105919935486533, acc: 0.6287878805940802\n", + "Epoch: 1, iter: 12, loss: 0.7066123137871424, acc: 0.6388888905445734\n", + "Epoch: 1, iter: 13, loss: 0.7061071350024297, acc: 0.637820514348837\n", + "Epoch: 1, iter: 14, loss: 0.7047214550631387, acc: 0.6398809552192688\n", + "Epoch: 1, iter: 15, loss: 0.6991948167483012, acc: 0.6444444457689921\n", + "Epoch: 1, iter: 16, loss: 0.6984505243599415, acc: 0.640625\n", + "Epoch: 1, iter: 17, loss: 0.6985500805518207, acc: 0.634803922737346\n", + "Epoch: 1, iter: 18, loss: 0.6958302425013648, acc: 0.6365740762816535\n", + "Epoch: 1, iter: 19, loss: 0.689811132456127, acc: 0.646929825607099\n", + "Epoch: 1, iter: 20, loss: 0.6884172260761261, acc: 0.652083334326744\n", + "Epoch: 1, iter: 21, loss: 0.6859425760450817, acc: 0.6567460326921373\n", + "Epoch: 1, iter: 22, loss: 0.6843499541282654, acc: 0.6647727272727273\n", + "Epoch: 1, iter: 23, loss: 0.6820353995198789, acc: 0.6684782608695652\n", + "Epoch: 1, iter: 24, loss: 0.6778855870167414, acc: 0.6805555547277132\n", + "Epoch: 1, iter: 25, loss: 0.6766923093795776, acc: 0.6766666650772095\n", + "Epoch: 1, iter: 26, loss: 0.6763339592860296, acc: 0.6810897428255814\n", + "Epoch: 1, iter: 27, loss: 0.6728286566557707, acc: 0.6929012338320414\n", + "Epoch: 1, iter: 28, loss: 0.6718999147415161, acc: 0.7008928571428571\n", + "Epoch: 1, iter: 29, loss: 0.6698122291729368, acc: 0.7025862068965517\n", + "Epoch: 1, iter: 30, loss: 0.6680505732695262, acc: 0.7069444437821706\n", + "Epoch: 1, iter: 31, loss: 0.6664485892941875, acc: 0.7096774193548387\n", + "Epoch: 1, iter: 32, loss: 0.6652086861431599, acc: 0.709635416045785\n", + "Epoch: 1, iter: 33, loss: 0.6636498444008104, acc: 0.7133838371797041\n", + "Epoch: 1, iter: 34, loss: 0.6609199502888847, acc: 0.71936274451368\n", + "Epoch: 1, iter: 35, loss: 0.6596211092812675, acc: 0.7238095232418605\n", + "Epoch: 1, iter: 36, loss: 0.6588184336821238, acc: 0.7245370364851422\n", + "Epoch: 1, iter: 37, loss: 0.6580872793455381, acc: 0.7252252246882465\n", + "Epoch: 1, iter: 38, loss: 0.6571370347550041, acc: 0.7247807007086905\n", + "Epoch: 1, iter: 39, loss: 0.6562121235407316, acc: 0.7211538446255219\n", + "Epoch: 1, iter: 40, loss: 0.6540020391345024, acc: 0.7249999985098838\n", + "Epoch: 1, iter: 41, loss: 0.6532074067650772, acc: 0.7256097546437892\n", + "Epoch: 1, iter: 42, loss: 0.6514614621798197, acc: 0.7311507917585827\n", + "Epoch: 1, iter: 43, loss: 0.6507193016451459, acc: 0.7335271294726882\n", + "Epoch: 1, iter: 44, loss: 0.6502126753330231, acc: 0.7357954518361525\n", + "Epoch: 1, iter: 45, loss: 0.6484324269824557, acc: 0.7388888862397935\n", + "Epoch: 1, iter: 46, loss: 0.6480504054090251, acc: 0.7382246346577354\n", + "Epoch: 1, iter: 47, loss: 0.6457424201863877, acc: 0.7420212740593768\n", + "Epoch: 1, iter: 48, loss: 0.645947859932979, acc: 0.7413194415469965\n", + "Epoch: 1, iter: 49, loss: 0.6455067615119778, acc: 0.7414965958011394\n", + "Epoch: 1, iter: 50, loss: 0.6444821214675903, acc: 0.7433333301544189\n", + "Epoch: 1, iter: 51, loss: 0.6431355347820357, acc: 0.7459150295631558\n", + "Epoch: 1, iter: 52, loss: 0.6423975848234617, acc: 0.7443910229664582\n", + "Epoch: 1, iter: 53, loss: 0.6413551164123247, acc: 0.7460691793909613\n", + "Epoch: 1, iter: 54, loss: 0.6393791922816524, acc: 0.7499999966886308\n", + "Epoch: 1, iter: 55, loss: 0.6382825634696266, acc: 0.7507575728676535\n", + "Epoch: 1, iter: 56, loss: 0.6371414363384247, acc: 0.7522321396640369\n", + "Epoch: 1, iter: 57, loss: 0.6359894171095731, acc: 0.7536549672745821\n", + "Epoch: 1, iter: 58, loss: 0.6354715495273985, acc: 0.7543103417445873\n", + "Epoch: 1, iter: 59, loss: 0.6346419504133322, acc: 0.7556497141466303\n", + "Epoch: 1, iter: 60, loss: 0.6335884312788646, acc: 0.7576388855775197\n", + "Epoch: 1, iter: 61, loss: 0.6339069018598462, acc: 0.7581967183800994\n", + "Epoch: 1, iter: 62, loss: 0.634910721932688, acc: 0.7567204275438862\n", + "Epoch: 1, iter: 63, loss: 0.6341730422443814, acc: 0.7579365050981915\n", + "Epoch: 1, iter: 64, loss: 0.633330169133842, acc: 0.7591145802289248\n", + "Epoch: 1, iter: 65, loss: 0.6325342820240901, acc: 0.7621794838171739\n", + "Epoch: 1, iter: 66, loss: 0.6322120527426401, acc: 0.7632575721451731\n", + "Epoch: 1, iter: 67, loss: 0.6316760733946046, acc: 0.7643034787320379\n", + "Epoch: 1, iter: 68, loss: 0.6312216494013282, acc: 0.7647058788467856\n", + "Epoch: 1, iter: 69, loss: 0.6303326461626135, acc: 0.7657004793485006\n", + "Epoch: 1, iter: 70, loss: 0.6296883319105421, acc: 0.7660714251654489\n", + "Epoch: 1, iter: 71, loss: 0.6293301624311528, acc: 0.7670187757048809\n", + "Epoch: 1, iter: 72, loss: 0.6282737594511774, acc: 0.769097218910853\n", + "Epoch: 1, iter: 73, loss: 0.6270135886048618, acc: 0.7711187184673466\n", + "Epoch: 1, iter: 74, loss: 0.626137506317448, acc: 0.7730855829006916\n", + "Epoch: 1, iter: 75, loss: 0.6265908416112264, acc: 0.7727777751286825\n", + "Epoch: 1, iter: 76, loss: 0.6253442952507421, acc: 0.7757675412454104\n", + "Epoch: 1, iter: 77, loss: 0.6254241242037191, acc: 0.775974023651767\n", + "Epoch: 1, iter: 78, loss: 0.6253649630607703, acc: 0.774572647534884\n", + "Epoch: 1, iter: 79, loss: 0.625053822239743, acc: 0.7758438798445689\n", + "Epoch: 1, iter: 80, loss: 0.6242767944931984, acc: 0.7770833313465119\n", + "Epoch: 1, iter: 81, loss: 0.6238363157083959, acc: 0.7772633727685905\n", + "Epoch: 1, iter: 82, loss: 0.6231183278851393, acc: 0.7779471525331823\n", + "Epoch: 1, iter: 83, loss: 0.6228148111377854, acc: 0.7776104398520596\n", + "Epoch: 1, iter: 84, loss: 0.6219968036526725, acc: 0.7787698393776303\n", + "Epoch: 1, iter: 85, loss: 0.6217465877532959, acc: 0.778921566991245\n", + "Epoch: 1, iter: 86, loss: 0.6214370602785155, acc: 0.7800387580727421\n", + "Epoch: 1, iter: 87, loss: 0.6208698776946671, acc: 0.7811302666006417\n", + "Epoch: 1, iter: 88, loss: 0.6206170157952742, acc: 0.7821969681165435\n", + "Epoch: 1, iter: 89, loss: 0.6196737831897949, acc: 0.7832396988118633\n", + "Epoch: 1, iter: 90, loss: 0.6189700126647949, acc: 0.7842592577139537\n", + "Epoch: 1, iter: 91, loss: 0.6186579832663903, acc: 0.7847985330518785\n", + "Epoch: 1, iter: 92, loss: 0.619030633698339, acc: 0.785326085012892\n", + "Epoch: 1, iter: 93, loss: 0.6186702392434561, acc: 0.7862903206579147\n", + "Epoch: 1, iter: 94, loss: 0.618675282660951, acc: 0.7863475160395845\n", + "Epoch: 1, iter: 95, loss: 0.6181472489708348, acc: 0.786842103380906\n", + "Epoch: 1, iter: 96, loss: 0.617899107436339, acc: 0.7873263868192831\n", + "Epoch: 1, iter: 97, loss: 0.6174019636567106, acc: 0.7876444839939629\n", + "Epoch: 2, iter: 98, loss: 0.6261789798736572, acc: 0.75\n", + "Epoch: 2, iter: 99, loss: 0.5929798483848572, acc: 0.75\n", + "Epoch: 2, iter: 100, loss: 0.5777126550674438, acc: 0.8055555621782938\n", + "Epoch: 2, iter: 101, loss: 0.5737382173538208, acc: 0.8229166716337204\n", + "Epoch: 2, iter: 102, loss: 0.568644666671753, acc: 0.8416666746139526\n", + "Epoch: 2, iter: 103, loss: 0.5673894882202148, acc: 0.8472222288449606\n", + "Epoch: 2, iter: 104, loss: 0.5660788672310966, acc: 0.8571428656578064\n", + "Epoch: 2, iter: 105, loss: 0.5637334287166595, acc: 0.8645833432674408\n", + "Epoch: 2, iter: 106, loss: 0.5665110879474216, acc: 0.8611111177338494\n", + "Epoch: 2, iter: 107, loss: 0.5656630456447601, acc: 0.8625000059604645\n", + "Epoch: 2, iter: 108, loss: 0.5683087435635653, acc: 0.8598484884608876\n", + "Epoch: 2, iter: 109, loss: 0.5724073847134908, acc: 0.8541666716337204\n", + "Epoch: 2, iter: 110, loss: 0.5686380633941064, acc: 0.8557692353542035\n", + "Epoch: 2, iter: 111, loss: 0.5699323798928942, acc: 0.851190481867109\n", + "Epoch: 2, iter: 112, loss: 0.566405181090037, acc: 0.8583333373069764\n", + "Epoch: 2, iter: 113, loss: 0.5629101544618607, acc: 0.8619791716337204\n", + "Epoch: 2, iter: 114, loss: 0.5649390431011424, acc: 0.8578431430984946\n", + "Epoch: 2, iter: 115, loss: 0.5665154059727987, acc: 0.854166673289405\n", + "Epoch: 2, iter: 116, loss: 0.5665954163199977, acc: 0.8464912332986531\n", + "Epoch: 2, iter: 117, loss: 0.5659460604190827, acc: 0.8479166716337204\n", + "Epoch: 2, iter: 118, loss: 0.5674880232129779, acc: 0.8472222260066441\n", + "Epoch: 2, iter: 119, loss: 0.5685108466581865, acc: 0.8465909118002112\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 2, iter: 120, loss: 0.5665583506874416, acc: 0.8532608721567236\n", + "Epoch: 2, iter: 121, loss: 0.565674846371015, acc: 0.855902781089147\n", + "Epoch: 2, iter: 122, loss: 0.5639314126968383, acc: 0.856666669845581\n", + "Epoch: 2, iter: 123, loss: 0.5644901922115912, acc: 0.8573717979284433\n", + "Epoch: 2, iter: 124, loss: 0.5636905409671642, acc: 0.856481483689061\n", + "Epoch: 2, iter: 125, loss: 0.5620359693254743, acc: 0.8616071449858802\n", + "Epoch: 2, iter: 126, loss: 0.5612888027881754, acc: 0.8606321852782677\n", + "Epoch: 2, iter: 127, loss: 0.5608103315035502, acc: 0.8597222228844961\n", + "Epoch: 2, iter: 128, loss: 0.5594998559644145, acc: 0.860215054404351\n", + "Epoch: 2, iter: 129, loss: 0.5587358977645636, acc: 0.859375\n", + "Epoch: 2, iter: 130, loss: 0.5576315449945854, acc: 0.8623737367716703\n", + "Epoch: 2, iter: 131, loss: 0.5575596900547252, acc: 0.8615196066744187\n", + "Epoch: 2, iter: 132, loss: 0.5552542311804635, acc: 0.8630952375275748\n", + "Epoch: 2, iter: 133, loss: 0.5541097223758698, acc: 0.8645833333333334\n", + "Epoch: 2, iter: 134, loss: 0.5552995527112806, acc: 0.8614864864864865\n", + "Epoch: 2, iter: 135, loss: 0.5562031112219158, acc: 0.8596491233298653\n", + "Epoch: 2, iter: 136, loss: 0.5553651742446117, acc: 0.8589743589743589\n", + "Epoch: 2, iter: 137, loss: 0.5542613804340363, acc: 0.859375\n", + "Epoch: 2, iter: 138, loss: 0.5551662386917486, acc: 0.857723577720363\n", + "Epoch: 2, iter: 139, loss: 0.5548501667522249, acc: 0.8591269850730896\n", + "Epoch: 2, iter: 140, loss: 0.5542968303658241, acc: 0.8624031016992968\n", + "Epoch: 2, iter: 141, loss: 0.5543994144959883, acc: 0.8607954559001055\n", + "Epoch: 2, iter: 142, loss: 0.5557530906465319, acc: 0.8574074082904392\n", + "Epoch: 2, iter: 143, loss: 0.5561244021291318, acc: 0.8559782621653184\n", + "Epoch: 2, iter: 144, loss: 0.5562040311224917, acc: 0.8554964547461652\n", + "Epoch: 2, iter: 145, loss: 0.5556968773404757, acc: 0.85590277860562\n", + "Epoch: 2, iter: 146, loss: 0.5554222172620346, acc: 0.8554421772762221\n", + "Epoch: 2, iter: 147, loss: 0.5545570731163025, acc: 0.8558333337306976\n", + "Epoch: 2, iter: 148, loss: 0.5545939674564436, acc: 0.8545751641778385\n", + "Epoch: 2, iter: 149, loss: 0.5538060057621735, acc: 0.8565705132025939\n", + "Epoch: 2, iter: 150, loss: 0.553479753575235, acc: 0.8569182393685827\n", + "Epoch: 2, iter: 151, loss: 0.5534182566183584, acc: 0.857253086787683\n", + "Epoch: 2, iter: 152, loss: 0.5529823129827326, acc: 0.8583333340558139\n", + "Epoch: 2, iter: 153, loss: 0.552296903516565, acc: 0.8586309530905315\n", + "Epoch: 2, iter: 154, loss: 0.5511317362910823, acc: 0.8603801173076295\n", + "Epoch: 2, iter: 155, loss: 0.5518207791550406, acc: 0.8599137931034483\n", + "Epoch: 2, iter: 156, loss: 0.5524439766245374, acc: 0.8601694915254238\n", + "Epoch: 2, iter: 157, loss: 0.551939906179905, acc: 0.8611111114422481\n", + "Epoch: 2, iter: 158, loss: 0.5522118342704461, acc: 0.8620218585749142\n", + "Epoch: 2, iter: 159, loss: 0.5519865659936782, acc: 0.8608870977355588\n", + "Epoch: 2, iter: 160, loss: 0.5505282013189225, acc: 0.8630952390413436\n", + "Epoch: 2, iter: 161, loss: 0.5513821286149323, acc: 0.8619791679084301\n", + "Epoch: 2, iter: 162, loss: 0.5510977254464076, acc: 0.8608974374257601\n", + "Epoch: 2, iter: 163, loss: 0.5523539027481368, acc: 0.8585858597899928\n", + "Epoch: 2, iter: 164, loss: 0.5521689942523614, acc: 0.8582089561135021\n", + "Epoch: 2, iter: 165, loss: 0.5524934639825541, acc: 0.8560049025451436\n", + "Epoch: 2, iter: 166, loss: 0.5527210049871085, acc: 0.8556763287903606\n", + "Epoch: 2, iter: 167, loss: 0.5521171190908977, acc: 0.8559523812362126\n", + "Epoch: 2, iter: 168, loss: 0.551437218004549, acc: 0.8568075122967572\n", + "Epoch: 2, iter: 169, loss: 0.5508123193350103, acc: 0.8576388897167312\n", + "Epoch: 2, iter: 170, loss: 0.5499611272387308, acc: 0.8590182653845173\n", + "Epoch: 2, iter: 171, loss: 0.5490683413840629, acc: 0.859234234771213\n", + "Epoch: 2, iter: 172, loss: 0.5484383845329285, acc: 0.8600000007947286\n", + "Epoch: 2, iter: 173, loss: 0.5488876676873157, acc: 0.859100878238678\n", + "Epoch: 2, iter: 174, loss: 0.5483978715809908, acc: 0.8593073603394744\n", + "Epoch: 2, iter: 175, loss: 0.5485444175891387, acc: 0.8600427363163385\n", + "Epoch: 2, iter: 176, loss: 0.548965962627266, acc: 0.8597046423561966\n", + "Epoch: 2, iter: 177, loss: 0.5487279765307903, acc: 0.860937500745058\n", + "Epoch: 2, iter: 178, loss: 0.548570661633103, acc: 0.8605967083095033\n", + "Epoch: 2, iter: 179, loss: 0.5478014233635693, acc: 0.8617886181284742\n", + "Epoch: 2, iter: 180, loss: 0.5479791997426964, acc: 0.8614457831325302\n", + "Epoch: 2, iter: 181, loss: 0.547837556827636, acc: 0.862103174839701\n", + "Epoch: 2, iter: 182, loss: 0.5474509007790509, acc: 0.862254902194528\n", + "Epoch: 2, iter: 183, loss: 0.5466033310391182, acc: 0.8628875973612763\n", + "Epoch: 2, iter: 184, loss: 0.546384943627763, acc: 0.8625478929486768\n", + "Epoch: 2, iter: 185, loss: 0.5460022247650407, acc: 0.8622159090909091\n", + "Epoch: 2, iter: 186, loss: 0.5470062527763709, acc: 0.8614232211970212\n", + "Epoch: 2, iter: 187, loss: 0.5463966091473897, acc: 0.8620370374785529\n", + "Epoch: 2, iter: 188, loss: 0.5453921150375198, acc: 0.8635531139897776\n", + "Epoch: 2, iter: 189, loss: 0.5450974080873572, acc: 0.8636775366638018\n", + "Epoch: 2, iter: 190, loss: 0.5452229938199443, acc: 0.8642473124688671\n", + "Epoch: 2, iter: 191, loss: 0.5446143105943152, acc: 0.8652482273730826\n", + "Epoch: 2, iter: 192, loss: 0.5444922604058918, acc: 0.8657894743116279\n", + "Epoch: 2, iter: 193, loss: 0.5446797721087933, acc: 0.8658854172875484\n", + "Epoch: 2, iter: 194, loss: 0.545212638132351, acc: 0.8663308350081297\n", + "Epoch: 3, iter: 195, loss: 0.48555484414100647, acc: 0.9583333134651184\n", + "Epoch: 3, iter: 196, loss: 0.5109468251466751, acc: 0.9166666567325592\n", + "Epoch: 3, iter: 197, loss: 0.518746425708135, acc: 0.875\n", + "Epoch: 3, iter: 198, loss: 0.513394720852375, acc: 0.8854166716337204\n", + "Epoch: 3, iter: 199, loss: 0.5124873697757721, acc: 0.8916666746139527\n", + "Epoch: 3, iter: 200, loss: 0.5145043383042017, acc: 0.8888888955116272\n", + "Epoch: 3, iter: 201, loss: 0.5101369704519, acc: 0.8988095266478402\n", + "Epoch: 3, iter: 202, loss: 0.5072705671191216, acc: 0.8958333358168602\n", + "Epoch: 3, iter: 203, loss: 0.5023887488577101, acc: 0.9027777777777778\n", + "Epoch: 3, iter: 204, loss: 0.504289197921753, acc: 0.9\n", + "Epoch: 3, iter: 205, loss: 0.5123896815560081, acc: 0.8863636363636364\n", + "Epoch: 3, iter: 206, loss: 0.5108576739827791, acc: 0.8854166666666666\n", + "Epoch: 3, iter: 207, loss: 0.5096883636254531, acc: 0.887820514348837\n", + "Epoch: 3, iter: 208, loss: 0.5132645411150796, acc: 0.8869047633239201\n", + "Epoch: 3, iter: 209, loss: 0.5123815337816874, acc: 0.8861111124356588\n", + "Epoch: 3, iter: 210, loss: 0.508055018261075, acc: 0.8932291679084301\n", + "Epoch: 3, iter: 211, loss: 0.5056723408839282, acc: 0.894607845474692\n", + "Epoch: 3, iter: 212, loss: 0.5111272318495644, acc: 0.8912037048074934\n", + "Epoch: 3, iter: 213, loss: 0.5098601563980705, acc: 0.890350878238678\n", + "Epoch: 3, iter: 214, loss: 0.5084497883915902, acc: 0.8916666686534882\n", + "Epoch: 3, iter: 215, loss: 0.5084946992851439, acc: 0.8869047647430783\n", + "Epoch: 3, iter: 216, loss: 0.5109304663809863, acc: 0.8863636390729384\n", + "Epoch: 3, iter: 217, loss: 0.5108584878237351, acc: 0.8876811628756316\n", + "Epoch: 3, iter: 218, loss: 0.5125811460117499, acc: 0.887152781089147\n", + "Epoch: 3, iter: 219, loss: 0.5136594355106354, acc: 0.8866666698455811\n", + "Epoch: 3, iter: 220, loss: 0.5140671879053116, acc: 0.884615386907871\n", + "Epoch: 3, iter: 221, loss: 0.5104990126910033, acc: 0.8888888910964683\n", + "Epoch: 3, iter: 222, loss: 0.5112015871065003, acc: 0.8869047633239201\n", + "Epoch: 3, iter: 223, loss: 0.5132160073724287, acc: 0.8864942542437849\n", + "Epoch: 3, iter: 224, loss: 0.5121694793303807, acc: 0.8902777791023254\n", + "Epoch: 3, iter: 225, loss: 0.512028177899699, acc: 0.8924731189204801\n", + "Epoch: 3, iter: 226, loss: 0.5118841445073485, acc: 0.888020833954215\n", + "Epoch: 3, iter: 227, loss: 0.513391732266455, acc: 0.8863636363636364\n", + "Epoch: 3, iter: 228, loss: 0.5142221687471166, acc: 0.8860294117647058\n", + "Epoch: 3, iter: 229, loss: 0.5152029148169927, acc: 0.8845238089561462\n", + "Epoch: 3, iter: 230, loss: 0.5154535099864006, acc: 0.8865740729702843\n", + "Epoch: 3, iter: 231, loss: 0.5152292114657324, acc: 0.8862612601873037\n", + "Epoch: 3, iter: 232, loss: 0.5149977199341121, acc: 0.8870614029859242\n", + "Epoch: 3, iter: 233, loss: 0.5149574256860293, acc: 0.8878205128205128\n", + "Epoch: 3, iter: 234, loss: 0.5138330839574337, acc: 0.888541667163372\n", + "Epoch: 3, iter: 235, loss: 0.5124226815816832, acc: 0.8902439024390244\n", + "Epoch: 3, iter: 236, loss: 0.5107544057425999, acc: 0.8908730163460686\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 3, iter: 237, loss: 0.510252398806949, acc: 0.8905038764310438\n", + "Epoch: 3, iter: 238, loss: 0.5113082778724757, acc: 0.8901515156030655\n", + "Epoch: 3, iter: 239, loss: 0.5102871080239614, acc: 0.8916666666666667\n", + "Epoch: 3, iter: 240, loss: 0.5088458521210629, acc: 0.8931159415970678\n", + "Epoch: 3, iter: 241, loss: 0.508390393028868, acc: 0.8918439707857497\n", + "Epoch: 3, iter: 242, loss: 0.5068529266864061, acc: 0.8923611106971899\n", + "Epoch: 3, iter: 243, loss: 0.5067722377728443, acc: 0.8920068023156147\n", + "Epoch: 3, iter: 244, loss: 0.505544371008873, acc: 0.8933333325386047\n", + "Epoch: 3, iter: 245, loss: 0.503920822166929, acc: 0.8946078419685364\n", + "Epoch: 3, iter: 246, loss: 0.5031867319574723, acc: 0.8942307680845261\n", + "Epoch: 3, iter: 247, loss: 0.501394510269165, acc: 0.8962264139697237\n", + "Epoch: 3, iter: 248, loss: 0.5009538741023453, acc: 0.8966049375357451\n", + "Epoch: 3, iter: 249, loss: 0.5000358332287181, acc: 0.8969696966084567\n", + "Epoch: 3, iter: 250, loss: 0.4990679419466427, acc: 0.8973214285714286\n", + "Epoch: 3, iter: 251, loss: 0.4983140031496684, acc: 0.8976608190620154\n", + "Epoch: 3, iter: 252, loss: 0.4977347429456382, acc: 0.896551724137931\n", + "Epoch: 3, iter: 253, loss: 0.49846380949020386, acc: 0.8947740116361844\n", + "Epoch: 3, iter: 254, loss: 0.49681808849175774, acc: 0.8965277781089147\n", + "Epoch: 3, iter: 255, loss: 0.49742663883772054, acc: 0.8961748637136866\n", + "Epoch: 3, iter: 256, loss: 0.49635864553912995, acc: 0.8965053769849962\n", + "Epoch: 3, iter: 257, loss: 0.49691926770740086, acc: 0.895502645818014\n", + "Epoch: 3, iter: 258, loss: 0.49764043278992176, acc: 0.89453125\n", + "Epoch: 3, iter: 259, loss: 0.4987256536116967, acc: 0.8935897432840787\n", + "Epoch: 3, iter: 260, loss: 0.4987688561280568, acc: 0.8933080805070472\n", + "Epoch: 3, iter: 261, loss: 0.49838932147666587, acc: 0.8949004972158973\n", + "Epoch: 3, iter: 262, loss: 0.4973163227824604, acc: 0.895833332748974\n", + "Epoch: 3, iter: 263, loss: 0.4968129418034484, acc: 0.8943236712096394\n", + "Epoch: 3, iter: 264, loss: 0.49706626151289257, acc: 0.8946428571428572\n", + "Epoch: 3, iter: 265, loss: 0.49738172620115145, acc: 0.8949530519230265\n", + "Epoch: 3, iter: 266, loss: 0.4978279732167721, acc: 0.8940972222222222\n", + "Epoch: 3, iter: 267, loss: 0.4990856463778509, acc: 0.8921232876712328\n", + "Epoch: 3, iter: 268, loss: 0.499891669766323, acc: 0.8918918918918919\n", + "Epoch: 3, iter: 269, loss: 0.502252056201299, acc: 0.89\n", + "Epoch: 3, iter: 270, loss: 0.5022044660229432, acc: 0.8908991225455937\n", + "Epoch: 3, iter: 271, loss: 0.5018508016289055, acc: 0.8901515146354576\n", + "Epoch: 3, iter: 272, loss: 0.5028934134886816, acc: 0.8883547003452594\n", + "Epoch: 3, iter: 273, loss: 0.5026774655414533, acc: 0.88871307991728\n", + "Epoch: 3, iter: 274, loss: 0.5022617679089307, acc: 0.8890625\n", + "Epoch: 3, iter: 275, loss: 0.5022082052848957, acc: 0.8888888888888888\n", + "Epoch: 3, iter: 276, loss: 0.5018861784440715, acc: 0.8892276425187181\n", + "Epoch: 3, iter: 277, loss: 0.50150983520301, acc: 0.8885542168674698\n", + "Epoch: 3, iter: 278, loss: 0.5017439091489428, acc: 0.8874007938873201\n", + "Epoch: 3, iter: 279, loss: 0.5014373397125917, acc: 0.8877450985067031\n", + "Epoch: 3, iter: 280, loss: 0.5014901933974998, acc: 0.8880813960419145\n", + "Epoch: 3, iter: 281, loss: 0.501745652535866, acc: 0.8879310351678695\n", + "Epoch: 3, iter: 282, loss: 0.5009480189870704, acc: 0.8887310610576109\n", + "Epoch: 3, iter: 283, loss: 0.500718741939309, acc: 0.888576779472694\n", + "Epoch: 3, iter: 284, loss: 0.49975346260600617, acc: 0.8898148152563307\n", + "Epoch: 3, iter: 285, loss: 0.500224042069781, acc: 0.8901098907648862\n", + "Epoch: 3, iter: 286, loss: 0.49966024380663165, acc: 0.8899456528217896\n", + "Epoch: 3, iter: 287, loss: 0.5003682759500319, acc: 0.8893369179899975\n", + "Epoch: 3, iter: 288, loss: 0.5003387338303505, acc: 0.8900709221971795\n", + "Epoch: 3, iter: 289, loss: 0.4998273071489836, acc: 0.8903508776112606\n", + "Epoch: 3, iter: 290, loss: 0.4994275535767277, acc: 0.8910590279847383\n", + "Epoch: 3, iter: 291, loss: 0.5006623228186184, acc: 0.8912449239455548\n", + "Epoch: 4, iter: 292, loss: 0.448716938495636, acc: 0.9583333134651184\n", + "Epoch: 4, iter: 293, loss: 0.42357316613197327, acc: 0.9791666567325592\n", + "Epoch: 4, iter: 294, loss: 0.44845237334569293, acc: 0.9722222089767456\n", + "Epoch: 4, iter: 295, loss: 0.4616529792547226, acc: 0.9270833283662796\n", + "Epoch: 4, iter: 296, loss: 0.45399045944213867, acc: 0.925\n", + "Epoch: 4, iter: 297, loss: 0.45162445803483325, acc: 0.9236111144224802\n", + "Epoch: 4, iter: 298, loss: 0.4549954618726458, acc: 0.9166666695049831\n", + "Epoch: 4, iter: 299, loss: 0.45950402691960335, acc: 0.90625\n", + "Epoch: 4, iter: 300, loss: 0.46131482389238143, acc: 0.8981481459405687\n", + "Epoch: 4, iter: 301, loss: 0.4631558895111084, acc: 0.8958333313465119\n", + "Epoch: 4, iter: 302, loss: 0.46696820042350073, acc: 0.8977272727272727\n", + "Epoch: 4, iter: 303, loss: 0.4641332800189654, acc: 0.8993055572112402\n", + "Epoch: 4, iter: 304, loss: 0.4647976870720203, acc: 0.900641028697674\n", + "Epoch: 4, iter: 305, loss: 0.46604723802634646, acc: 0.904761906181063\n", + "Epoch: 4, iter: 306, loss: 0.46878151297569276, acc: 0.9055555582046508\n", + "Epoch: 4, iter: 307, loss: 0.4681529477238655, acc: 0.9062500037252903\n", + "Epoch: 4, iter: 308, loss: 0.4668642001993516, acc: 0.9068627497729134\n", + "Epoch: 4, iter: 309, loss: 0.4678044186698066, acc: 0.9050925970077515\n", + "Epoch: 4, iter: 310, loss: 0.46703566689240306, acc: 0.9078947399791918\n", + "Epoch: 4, iter: 311, loss: 0.46510662138462067, acc: 0.9104166686534881\n", + "Epoch: 4, iter: 312, loss: 0.4611092734904516, acc: 0.9146825415747506\n", + "Epoch: 4, iter: 313, loss: 0.46133909306742926, acc: 0.9166666675697673\n", + "Epoch: 4, iter: 314, loss: 0.4624435422213181, acc: 0.9130434782608695\n", + "Epoch: 4, iter: 315, loss: 0.46105275427301723, acc: 0.9149305547277132\n", + "Epoch: 4, iter: 316, loss: 0.4604651343822479, acc: 0.9166666650772095\n", + "Epoch: 4, iter: 317, loss: 0.46150285120193774, acc: 0.9134615361690521\n", + "Epoch: 4, iter: 318, loss: 0.45981508934939347, acc: 0.9135802454418607\n", + "Epoch: 4, iter: 319, loss: 0.4613231122493744, acc: 0.9107142835855484\n", + "Epoch: 4, iter: 320, loss: 0.4599181167010603, acc: 0.9109195388596634\n", + "Epoch: 4, iter: 321, loss: 0.4589013357957204, acc: 0.9083333313465118\n", + "Epoch: 4, iter: 322, loss: 0.4584324427189366, acc: 0.9099462339954991\n", + "Epoch: 4, iter: 323, loss: 0.4577968930825591, acc: 0.9114583302289248\n", + "Epoch: 4, iter: 324, loss: 0.45923639698462054, acc: 0.9103535323431997\n", + "Epoch: 4, iter: 325, loss: 0.4582415319540921, acc: 0.9129901931566351\n", + "Epoch: 4, iter: 326, loss: 0.4574986347130367, acc: 0.9142857108797345\n", + "Epoch: 4, iter: 327, loss: 0.4558635908696387, acc: 0.9166666633552976\n", + "Epoch: 4, iter: 328, loss: 0.4553404555127427, acc: 0.9177927890339413\n", + "Epoch: 4, iter: 329, loss: 0.4563782081792229, acc: 0.9166666630067324\n", + "Epoch: 4, iter: 330, loss: 0.45505823003940093, acc: 0.9177350386595114\n", + "Epoch: 4, iter: 331, loss: 0.4540580280125141, acc: 0.9187499955296516\n", + "Epoch: 4, iter: 332, loss: 0.4553596253802137, acc: 0.9166666618207606\n", + "Epoch: 4, iter: 333, loss: 0.4546490865094321, acc: 0.9176587249551501\n", + "Epoch: 4, iter: 334, loss: 0.4569168908651485, acc: 0.9156976688739865\n", + "Epoch: 4, iter: 335, loss: 0.4571635113521056, acc: 0.9138257517056032\n", + "Epoch: 4, iter: 336, loss: 0.4562108079592387, acc: 0.9148148086335924\n", + "Epoch: 4, iter: 337, loss: 0.45650998600151227, acc: 0.9157608630864517\n", + "Epoch: 4, iter: 338, loss: 0.45642813976774826, acc: 0.91578013592578\n", + "Epoch: 4, iter: 339, loss: 0.45566572186847526, acc: 0.9157986057301363\n", + "Epoch: 4, iter: 340, loss: 0.4561716111338868, acc: 0.9149659811233988\n", + "Epoch: 4, iter: 341, loss: 0.4550857311487198, acc: 0.9166666615009308\n", + "Epoch: 4, iter: 342, loss: 0.4549686663291034, acc: 0.9158496681381675\n", + "Epoch: 4, iter: 343, loss: 0.45538658935290116, acc: 0.915865380030412\n", + "Epoch: 4, iter: 344, loss: 0.4544746628347433, acc: 0.9166666617933309\n", + "Epoch: 4, iter: 345, loss: 0.4555985287383751, acc: 0.9158950569453063\n", + "Epoch: 4, iter: 346, loss: 0.4555058858611367, acc: 0.9166666616093029\n", + "Epoch: 4, iter: 347, loss: 0.4547047976936613, acc: 0.917410708963871\n", + "Epoch: 4, iter: 348, loss: 0.4539496673826586, acc: 0.9188596438943294\n", + "Epoch: 4, iter: 349, loss: 0.45289612895455855, acc: 0.9195402244041706\n", + "Epoch: 4, iter: 350, loss: 0.4534032996428215, acc: 0.9194915203724877\n", + "Epoch: 4, iter: 351, loss: 0.45349478473265964, acc: 0.9187499950329463\n", + "Epoch: 4, iter: 352, loss: 0.4529876669899362, acc: 0.9193989018924901\n", + "Epoch: 4, iter: 353, loss: 0.4546767838539616, acc: 0.9159946182081776\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 4, iter: 354, loss: 0.45482691649406676, acc: 0.915343909982651\n", + "Epoch: 4, iter: 355, loss: 0.45454436680302024, acc: 0.9147135363891721\n", + "Epoch: 4, iter: 356, loss: 0.45475605726242063, acc: 0.9141025589062617\n", + "Epoch: 4, iter: 357, loss: 0.45430607597033185, acc: 0.9154040352864699\n", + "Epoch: 4, iter: 358, loss: 0.4532324725122594, acc: 0.9160447707816736\n", + "Epoch: 4, iter: 359, loss: 0.45223164470756755, acc: 0.9166666611152536\n", + "Epoch: 4, iter: 360, loss: 0.4531939038331958, acc: 0.9154589314391648\n", + "Epoch: 4, iter: 361, loss: 0.45244339917387283, acc: 0.9154761850833892\n", + "Epoch: 4, iter: 362, loss: 0.45151046422165886, acc: 0.9166666613498204\n", + "Epoch: 4, iter: 363, loss: 0.4502161637776428, acc: 0.9178240688310729\n", + "Epoch: 4, iter: 364, loss: 0.4496335905708679, acc: 0.9178082142790703\n", + "Epoch: 4, iter: 365, loss: 0.44941180179247986, acc: 0.9177927882284731\n", + "Epoch: 4, iter: 366, loss: 0.4515652104218801, acc: 0.916666661898295\n", + "Epoch: 4, iter: 367, loss: 0.45230572827552495, acc: 0.9161184163470018\n", + "Epoch: 4, iter: 368, loss: 0.4534078143633805, acc: 0.9155844109398978\n", + "Epoch: 4, iter: 369, loss: 0.4524492480051823, acc: 0.916666662081694\n", + "Epoch: 4, iter: 370, loss: 0.45222285767144793, acc: 0.9156118095675602\n", + "Epoch: 4, iter: 371, loss: 0.4524539839476347, acc: 0.9151041619479656\n", + "Epoch: 4, iter: 372, loss: 0.45238048316519935, acc: 0.9151234523749646\n", + "Epoch: 4, iter: 373, loss: 0.45160549624664026, acc: 0.9156504019004542\n", + "Epoch: 4, iter: 374, loss: 0.4522255411349147, acc: 0.9141566221972546\n", + "Epoch: 4, iter: 375, loss: 0.4524295713220324, acc: 0.9136904719330016\n", + "Epoch: 4, iter: 376, loss: 0.45194134501849903, acc: 0.9142156818333794\n", + "Epoch: 4, iter: 377, loss: 0.4515230184377626, acc: 0.9147286775500275\n", + "Epoch: 4, iter: 378, loss: 0.4506017528046137, acc: 0.9157088076931307\n", + "Epoch: 4, iter: 379, loss: 0.45175884088332, acc: 0.9152462076057087\n", + "Epoch: 4, iter: 380, loss: 0.45140057768714564, acc: 0.9157303323906459\n", + "Epoch: 4, iter: 381, loss: 0.4512642092174954, acc: 0.9166666620307499\n", + "Epoch: 4, iter: 382, loss: 0.4508646517009525, acc: 0.9171245373212374\n", + "Epoch: 4, iter: 383, loss: 0.450285365400107, acc: 0.9175724588010622\n", + "Epoch: 4, iter: 384, loss: 0.44989447311688496, acc: 0.9184587764483626\n", + "Epoch: 4, iter: 385, loss: 0.44952012313173173, acc: 0.9179964490393375\n", + "Epoch: 4, iter: 386, loss: 0.44913710104791743, acc: 0.9184210476122404\n", + "Epoch: 4, iter: 387, loss: 0.4486097814515233, acc: 0.9184027730176846\n", + "Epoch: 4, iter: 388, loss: 0.4482872645879529, acc: 0.9192439815432755\n", + "Epoch: 5, iter: 389, loss: 0.32518574595451355, acc: 0.9583333134651184\n", + "Epoch: 5, iter: 390, loss: 0.39909636974334717, acc: 0.9375\n", + "Epoch: 5, iter: 391, loss: 0.4191481073697408, acc: 0.9166666666666666\n", + "Epoch: 5, iter: 392, loss: 0.45872919261455536, acc: 0.875\n", + "Epoch: 5, iter: 393, loss: 0.4634744644165039, acc: 0.875\n", + "Epoch: 5, iter: 394, loss: 0.45379067460695904, acc: 0.8958333333333334\n", + "Epoch: 5, iter: 395, loss: 0.4500534917627062, acc: 0.9047619019235883\n", + "Epoch: 5, iter: 396, loss: 0.4479406997561455, acc: 0.8958333283662796\n", + "Epoch: 5, iter: 397, loss: 0.4451850288444095, acc: 0.9027777711550394\n", + "Epoch: 5, iter: 398, loss: 0.43930279910564424, acc: 0.9083333253860474\n", + "Epoch: 5, iter: 399, loss: 0.4455280601978302, acc: 0.9015151424841448\n", + "Epoch: 5, iter: 400, loss: 0.44637275238831836, acc: 0.8958333233992258\n", + "Epoch: 5, iter: 401, loss: 0.44475109302080595, acc: 0.8942307600608239\n", + "Epoch: 5, iter: 402, loss: 0.4430014193058014, acc: 0.8958333262375423\n", + "Epoch: 5, iter: 403, loss: 0.44118642012278236, acc: 0.8999999920527141\n", + "Epoch: 5, iter: 404, loss: 0.4385414347052574, acc: 0.9036458246409893\n", + "Epoch: 5, iter: 405, loss: 0.43474771345362945, acc: 0.906862735748291\n", + "Epoch: 5, iter: 406, loss: 0.43359970384173924, acc: 0.9074073996808794\n", + "Epoch: 5, iter: 407, loss: 0.4300421350880673, acc: 0.9122806944345173\n", + "Epoch: 5, iter: 408, loss: 0.4334616482257843, acc: 0.9083333253860474\n", + "Epoch: 5, iter: 409, loss: 0.43477958582696463, acc: 0.9087301521074205\n", + "Epoch: 5, iter: 410, loss: 0.4374537305398421, acc: 0.9071969633752649\n", + "Epoch: 5, iter: 411, loss: 0.43580688341804175, acc: 0.9076086904691614\n", + "Epoch: 5, iter: 412, loss: 0.43407440061370534, acc: 0.9079861069718996\n", + "Epoch: 5, iter: 413, loss: 0.43246041297912596, acc: 0.908333330154419\n", + "Epoch: 5, iter: 414, loss: 0.4332401821246514, acc: 0.9086538438613598\n", + "Epoch: 5, iter: 415, loss: 0.43574979570176864, acc: 0.908950615812231\n", + "Epoch: 5, iter: 416, loss: 0.43804646389825, acc: 0.9047619040523257\n", + "Epoch: 5, iter: 417, loss: 0.438585312202059, acc: 0.9066091940320772\n", + "Epoch: 5, iter: 418, loss: 0.43738244473934174, acc: 0.9083333313465118\n", + "Epoch: 5, iter: 419, loss: 0.4388285683047387, acc: 0.9086021492558141\n", + "Epoch: 5, iter: 420, loss: 0.43759688176214695, acc: 0.9075520820915699\n", + "Epoch: 5, iter: 421, loss: 0.4367850585417314, acc: 0.9090909072847078\n", + "Epoch: 5, iter: 422, loss: 0.435497522354126, acc: 0.9093137243214775\n", + "Epoch: 5, iter: 423, loss: 0.4367332509585789, acc: 0.9095238089561463\n", + "Epoch: 5, iter: 424, loss: 0.43818044662475586, acc: 0.9074074063036177\n", + "Epoch: 5, iter: 425, loss: 0.43940842071095026, acc: 0.906531530457574\n", + "Epoch: 5, iter: 426, loss: 0.4388563515324342, acc: 0.907894735273562\n", + "Epoch: 5, iter: 427, loss: 0.4386309530490484, acc: 0.9081196571007754\n", + "Epoch: 5, iter: 428, loss: 0.43789767697453497, acc: 0.9093749985098839\n", + "Epoch: 5, iter: 429, loss: 0.4371662801358758, acc: 0.9105691037526945\n", + "Epoch: 5, iter: 430, loss: 0.4359756757815679, acc: 0.9097222203300113\n", + "Epoch: 5, iter: 431, loss: 0.43472170206003413, acc: 0.9118217035781505\n", + "Epoch: 5, iter: 432, loss: 0.43556393818421796, acc: 0.9109848466786471\n", + "Epoch: 5, iter: 433, loss: 0.4349477681848738, acc: 0.9101851834191217\n", + "Epoch: 5, iter: 434, loss: 0.4328943212395129, acc: 0.9112318818983824\n", + "Epoch: 5, iter: 435, loss: 0.4329603777286854, acc: 0.9122340400168236\n", + "Epoch: 5, iter: 436, loss: 0.4355578242490689, acc: 0.9105902748803297\n", + "Epoch: 5, iter: 437, loss: 0.4348735085555485, acc: 0.9124149631480781\n", + "Epoch: 5, iter: 438, loss: 0.43389343917369844, acc: 0.9141666638851166\n", + "Epoch: 5, iter: 439, loss: 0.4350314631181605, acc: 0.9125816962298225\n", + "Epoch: 5, iter: 440, loss: 0.43380799832252354, acc: 0.9134615350228089\n", + "Epoch: 5, iter: 441, loss: 0.4333728478764588, acc: 0.9135220095796405\n", + "Epoch: 5, iter: 442, loss: 0.43323056896527606, acc: 0.913580244338071\n", + "Epoch: 5, iter: 443, loss: 0.43477185964584353, acc: 0.9113636341961947\n", + "Epoch: 5, iter: 444, loss: 0.4352560745818274, acc: 0.9107142835855484\n", + "Epoch: 5, iter: 445, loss: 0.43562308110688863, acc: 0.9093567227062426\n", + "Epoch: 5, iter: 446, loss: 0.4347558597038532, acc: 0.9102011466848439\n", + "Epoch: 5, iter: 447, loss: 0.43441687094963205, acc: 0.9096045170800161\n", + "Epoch: 5, iter: 448, loss: 0.43399237990379336, acc: 0.9090277751286825\n", + "Epoch: 5, iter: 449, loss: 0.43337083253704134, acc: 0.9091530031845217\n", + "Epoch: 5, iter: 450, loss: 0.4321818745905353, acc: 0.910618277326707\n", + "Epoch: 5, iter: 451, loss: 0.4306718603013054, acc: 0.9120370348294576\n", + "Epoch: 5, iter: 452, loss: 0.4295466924086213, acc: 0.9127604141831398\n", + "Epoch: 5, iter: 453, loss: 0.4289322816408597, acc: 0.9134615357105549\n", + "Epoch: 5, iter: 454, loss: 0.42772026947050384, acc: 0.9147727245634253\n", + "Epoch: 5, iter: 455, loss: 0.42746313917103096, acc: 0.9154228826067341\n", + "Epoch: 5, iter: 456, loss: 0.42677583151003895, acc: 0.9160539183546516\n", + "Epoch: 5, iter: 457, loss: 0.4254391176113184, acc: 0.916666663211325\n", + "Epoch: 5, iter: 458, loss: 0.42478874368327, acc: 0.9178571394511632\n", + "Epoch: 5, iter: 459, loss: 0.4234934772404147, acc: 0.919014081149034\n", + "Epoch: 5, iter: 460, loss: 0.42320578090018696, acc: 0.9189814784460597\n", + "Epoch: 5, iter: 461, loss: 0.4224109514935376, acc: 0.9195205446791975\n", + "Epoch: 5, iter: 462, loss: 0.42321424266776525, acc: 0.9189189156970462\n", + "Epoch: 5, iter: 463, loss: 0.4221851793924967, acc: 0.9194444410006205\n", + "Epoch: 5, iter: 464, loss: 0.421737739914342, acc: 0.9199561366909429\n", + "Epoch: 5, iter: 465, loss: 0.4204940176629401, acc: 0.9209956673832683\n", + "Epoch: 5, iter: 466, loss: 0.421209644812804, acc: 0.9204059793398931\n", + "Epoch: 5, iter: 467, loss: 0.42083912786049177, acc: 0.9198312201077425\n", + "Epoch: 5, iter: 468, loss: 0.4202773839235306, acc: 0.9203124962747097\n", + "Epoch: 5, iter: 469, loss: 0.41923748159114227, acc: 0.9212962926169972\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 5, iter: 470, loss: 0.4196362953360488, acc: 0.9202235733590475\n", + "Epoch: 5, iter: 471, loss: 0.4186788097203496, acc: 0.9206827268543014\n", + "Epoch: 5, iter: 472, loss: 0.41848270559594747, acc: 0.9206349168504987\n", + "Epoch: 5, iter: 473, loss: 0.4179677840541391, acc: 0.921078427398906\n", + "Epoch: 5, iter: 474, loss: 0.4180253834225411, acc: 0.9200581353764201\n", + "Epoch: 5, iter: 475, loss: 0.4185330590297436, acc: 0.9195402257743923\n", + "Epoch: 5, iter: 476, loss: 0.41768814250826836, acc: 0.9195075719193979\n", + "Epoch: 5, iter: 477, loss: 0.4170027328341195, acc: 0.9204119812236743\n", + "Epoch: 5, iter: 478, loss: 0.4167555338806576, acc: 0.9203703668382432\n", + "Epoch: 5, iter: 479, loss: 0.4162980494918404, acc: 0.9212454177521088\n", + "Epoch: 5, iter: 480, loss: 0.41576872020959854, acc: 0.9216485470533371\n", + "Epoch: 5, iter: 481, loss: 0.41520421543428976, acc: 0.9220430069072272\n", + "Epoch: 5, iter: 482, loss: 0.41389927204619065, acc: 0.9228723366209801\n", + "Epoch: 5, iter: 483, loss: 0.4141006538742467, acc: 0.9228070139884949\n", + "Epoch: 5, iter: 484, loss: 0.41284125826011103, acc: 0.9236111075927814\n", + "Epoch: 5, iter: 485, loss: 0.4130628880151768, acc: 0.9234614151040303\n", + "Epoch: 6, iter: 486, loss: 0.3518325686454773, acc: 0.9583333134651184\n", + "Epoch: 6, iter: 487, loss: 0.3645044267177582, acc: 0.9583333134651184\n", + "Epoch: 6, iter: 488, loss: 0.36059897144635517, acc: 0.9583333134651184\n", + "Epoch: 6, iter: 489, loss: 0.36509180814027786, acc: 0.9583333134651184\n", + "Epoch: 6, iter: 490, loss: 0.3714363515377045, acc: 0.949999988079071\n", + "Epoch: 6, iter: 491, loss: 0.36319728195667267, acc: 0.9513888756434122\n", + "Epoch: 6, iter: 492, loss: 0.35857162731034414, acc: 0.9523809381893703\n", + "Epoch: 6, iter: 493, loss: 0.36231575533747673, acc: 0.9479166567325592\n", + "Epoch: 6, iter: 494, loss: 0.3540920118490855, acc: 0.9537036948733859\n", + "Epoch: 6, iter: 495, loss: 0.3548039823770523, acc: 0.9499999940395355\n", + "Epoch: 6, iter: 496, loss: 0.3577925535765561, acc: 0.9431818127632141\n", + "Epoch: 6, iter: 497, loss: 0.36367881546417874, acc: 0.940972218910853\n", + "Epoch: 6, iter: 498, loss: 0.3638021945953369, acc: 0.9391025625742399\n", + "Epoch: 6, iter: 499, loss: 0.3631880113056728, acc: 0.9375\n", + "Epoch: 6, iter: 500, loss: 0.36687666177749634, acc: 0.9361111124356588\n", + "Epoch: 6, iter: 501, loss: 0.36151105910539627, acc: 0.9401041679084301\n", + "Epoch: 6, iter: 502, loss: 0.3596249117570765, acc: 0.9411764705882353\n", + "Epoch: 6, iter: 503, loss: 0.3698859347237481, acc: 0.9351851840813955\n", + "Epoch: 6, iter: 504, loss: 0.3704304444162469, acc: 0.9364035066805387\n", + "Epoch: 6, iter: 505, loss: 0.3717495918273926, acc: 0.9374999970197677\n", + "Epoch: 6, iter: 506, loss: 0.3763535675548372, acc: 0.9345238066854931\n", + "Epoch: 6, iter: 507, loss: 0.37483231858773663, acc: 0.9356060569936578\n", + "Epoch: 6, iter: 508, loss: 0.3745537089264911, acc: 0.9365941985793735\n", + "Epoch: 6, iter: 509, loss: 0.37370122224092484, acc: 0.9357638855775198\n", + "Epoch: 6, iter: 510, loss: 0.37225056052207944, acc: 0.9366666626930237\n", + "Epoch: 6, iter: 511, loss: 0.37572750793053555, acc: 0.9342948679740612\n", + "Epoch: 6, iter: 512, loss: 0.37490908415229235, acc: 0.9367283913824294\n", + "Epoch: 6, iter: 513, loss: 0.37402969279459547, acc: 0.9389880916901997\n", + "Epoch: 6, iter: 514, loss: 0.37333533578905564, acc: 0.9382183880641543\n", + "Epoch: 6, iter: 515, loss: 0.3733208308617274, acc: 0.9388888855775197\n", + "Epoch: 6, iter: 516, loss: 0.37355556507264415, acc: 0.938172040447112\n", + "Epoch: 6, iter: 517, loss: 0.37419960740953684, acc: 0.9361979141831398\n", + "Epoch: 6, iter: 518, loss: 0.3758782283826308, acc: 0.9356060587998593\n", + "Epoch: 6, iter: 519, loss: 0.3743738593424068, acc: 0.9362745074664846\n", + "Epoch: 6, iter: 520, loss: 0.37427781735147747, acc: 0.9369047590664454\n", + "Epoch: 6, iter: 521, loss: 0.37406235850519604, acc: 0.9374999966886308\n", + "Epoch: 6, iter: 522, loss: 0.37632593190347824, acc: 0.936936934252043\n", + "Epoch: 6, iter: 523, loss: 0.37522562632435247, acc: 0.9385964886138314\n", + "Epoch: 6, iter: 524, loss: 0.3733001160315978, acc: 0.9391025610459156\n", + "Epoch: 6, iter: 525, loss: 0.371991490572691, acc: 0.9406249970197678\n", + "Epoch: 6, iter: 526, loss: 0.37197095519158896, acc: 0.9410569071769714\n", + "Epoch: 6, iter: 527, loss: 0.3722147125573385, acc: 0.9404761876378741\n", + "Epoch: 6, iter: 528, loss: 0.371886950592662, acc: 0.9408914696338565\n", + "Epoch: 6, iter: 529, loss: 0.37169976058331405, acc: 0.9412878751754761\n", + "Epoch: 6, iter: 530, loss: 0.37143314745691086, acc: 0.9416666626930237\n", + "Epoch: 6, iter: 531, loss: 0.3722765102334645, acc: 0.9411231849504553\n", + "Epoch: 6, iter: 532, loss: 0.37178365474051617, acc: 0.9423758831429989\n", + "Epoch: 6, iter: 533, loss: 0.37101675135393936, acc: 0.9427083296080431\n", + "Epoch: 6, iter: 534, loss: 0.37071172497710403, acc: 0.9413265269629809\n", + "Epoch: 6, iter: 535, loss: 0.37074402868747713, acc: 0.9416666626930237\n", + "Epoch: 6, iter: 536, loss: 0.36997736260002734, acc: 0.9428104536206114\n", + "Epoch: 6, iter: 537, loss: 0.369204618036747, acc: 0.9439102525894458\n", + "Epoch: 6, iter: 538, loss: 0.36945740456851023, acc: 0.9441823858135151\n", + "Epoch: 6, iter: 539, loss: 0.37175068921513027, acc: 0.9405864157058574\n", + "Epoch: 6, iter: 540, loss: 0.3704360983588479, acc: 0.9416666626930237\n", + "Epoch: 6, iter: 541, loss: 0.3703889532813004, acc: 0.9412202345473426\n", + "Epoch: 6, iter: 542, loss: 0.3693137419851203, acc: 0.9422514585026524\n", + "Epoch: 6, iter: 543, loss: 0.36930347362468985, acc: 0.9410919505974342\n", + "Epoch: 6, iter: 544, loss: 0.3709521551253432, acc: 0.9399717480449353\n", + "Epoch: 6, iter: 545, loss: 0.3710893531640371, acc: 0.939583330353101\n", + "Epoch: 6, iter: 546, loss: 0.3704662283913034, acc: 0.9398907071254292\n", + "Epoch: 6, iter: 547, loss: 0.37062205326172615, acc: 0.9401881685180049\n", + "Epoch: 6, iter: 548, loss: 0.3696454810717749, acc: 0.9411375626685128\n", + "Epoch: 6, iter: 549, loss: 0.36988934222608805, acc: 0.9407552052289248\n", + "Epoch: 6, iter: 550, loss: 0.3691940325957078, acc: 0.9416666636100182\n", + "Epoch: 6, iter: 551, loss: 0.3701789541677995, acc: 0.9412878760785768\n", + "Epoch: 6, iter: 552, loss: 0.3700324901893957, acc: 0.9415422855918087\n", + "Epoch: 6, iter: 553, loss: 0.3703948338242138, acc: 0.9411764679586186\n", + "Epoch: 6, iter: 554, loss: 0.37080187080562976, acc: 0.9414251178934954\n", + "Epoch: 6, iter: 555, loss: 0.37267672036375316, acc: 0.9392857117312295\n", + "Epoch: 6, iter: 556, loss: 0.3725963251691469, acc: 0.9389671339115626\n", + "Epoch: 6, iter: 557, loss: 0.37274475312895244, acc: 0.9386574054757754\n", + "Epoch: 6, iter: 558, loss: 0.3720579857695593, acc: 0.9389269384619308\n", + "Epoch: 6, iter: 559, loss: 0.3716026037125974, acc: 0.9391891867727846\n", + "Epoch: 6, iter: 560, loss: 0.3723682538668315, acc: 0.9377777751286824\n", + "Epoch: 6, iter: 561, loss: 0.37129690694181544, acc: 0.9385964886138314\n", + "Epoch: 6, iter: 562, loss: 0.37082740741890746, acc: 0.9393939368136517\n", + "Epoch: 6, iter: 563, loss: 0.37020444984619433, acc: 0.9401709376237332\n", + "Epoch: 6, iter: 564, loss: 0.3695701885072491, acc: 0.9404008411153962\n", + "Epoch: 6, iter: 565, loss: 0.3687905874103308, acc: 0.9411458306014537\n", + "Epoch: 6, iter: 566, loss: 0.3695125693892255, acc: 0.9398148118713756\n", + "Epoch: 6, iter: 567, loss: 0.36971304511151665, acc: 0.9400406472566651\n", + "Epoch: 6, iter: 568, loss: 0.3704875445509531, acc: 0.9387550167290561\n", + "Epoch: 6, iter: 569, loss: 0.3701039268856957, acc: 0.9384920604172207\n", + "Epoch: 6, iter: 570, loss: 0.3695260629934423, acc: 0.9387254869236665\n", + "Epoch: 6, iter: 571, loss: 0.3687943005284598, acc: 0.9389534849067067\n", + "Epoch: 6, iter: 572, loss: 0.36882349369169654, acc: 0.9386973148104788\n", + "Epoch: 6, iter: 573, loss: 0.3681631843474778, acc: 0.9384469667618925\n", + "Epoch: 6, iter: 574, loss: 0.36863612961233333, acc: 0.937734079494905\n", + "Epoch: 6, iter: 575, loss: 0.36804751853148143, acc: 0.9384259230560726\n", + "Epoch: 6, iter: 576, loss: 0.36740410458910594, acc: 0.9386446855880402\n", + "Epoch: 6, iter: 577, loss: 0.3666828093321427, acc: 0.9393115911794745\n", + "Epoch: 6, iter: 578, loss: 0.3669282370998013, acc: 0.9390680975811456\n", + "Epoch: 6, iter: 579, loss: 0.3685664807228332, acc: 0.9374999974636321\n", + "Epoch: 6, iter: 580, loss: 0.3675979200162386, acc: 0.9381578922271728\n", + "Epoch: 6, iter: 581, loss: 0.3670379277318716, acc: 0.9388020808498064\n", + "Epoch: 6, iter: 582, loss: 0.3665640692120975, acc: 0.9394329872327981\n", + "Epoch: 7, iter: 583, loss: 0.28975117206573486, acc: 1.0\n", + "Epoch: 7, iter: 584, loss: 0.29903602600097656, acc: 0.9791666567325592\n", + "Epoch: 7, iter: 585, loss: 0.30591532588005066, acc: 0.9861111044883728\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 7, iter: 586, loss: 0.3196141943335533, acc: 0.96875\n", + "Epoch: 7, iter: 587, loss: 0.32387712597846985, acc: 0.9666666626930237\n", + "Epoch: 7, iter: 588, loss: 0.322371040781339, acc: 0.972222218910853\n", + "Epoch: 7, iter: 589, loss: 0.3170433299882071, acc: 0.9702380895614624\n", + "Epoch: 7, iter: 590, loss: 0.31997984647750854, acc: 0.9687499925494194\n", + "Epoch: 7, iter: 591, loss: 0.3468475937843323, acc: 0.9490740696589152\n", + "Epoch: 7, iter: 592, loss: 0.350449675321579, acc: 0.9333333313465119\n", + "Epoch: 7, iter: 593, loss: 0.3419508825648915, acc: 0.939393937587738\n", + "Epoch: 7, iter: 594, loss: 0.3417217681805293, acc: 0.9375\n", + "Epoch: 7, iter: 595, loss: 0.34539809823036194, acc: 0.9326923076923077\n", + "Epoch: 7, iter: 596, loss: 0.360110872558185, acc: 0.9255952366760799\n", + "Epoch: 7, iter: 597, loss: 0.36398277084032693, acc: 0.9194444417953491\n", + "Epoch: 7, iter: 598, loss: 0.36426431871950626, acc: 0.9218749962747097\n", + "Epoch: 7, iter: 599, loss: 0.3612184769967023, acc: 0.9264705847291386\n", + "Epoch: 7, iter: 600, loss: 0.3585352318154441, acc: 0.9282407363255819\n", + "Epoch: 7, iter: 601, loss: 0.357722387502068, acc: 0.9298245561750311\n", + "Epoch: 7, iter: 602, loss: 0.3541224434971809, acc: 0.9333333283662796\n", + "Epoch: 7, iter: 603, loss: 0.35746173631577266, acc: 0.9325396787552607\n", + "Epoch: 7, iter: 604, loss: 0.354448911818591, acc: 0.9356060569936578\n", + "Epoch: 7, iter: 605, loss: 0.350630521774292, acc: 0.9384057936461075\n", + "Epoch: 7, iter: 606, loss: 0.3483421380321185, acc: 0.9392361069718996\n", + "Epoch: 7, iter: 607, loss: 0.34923364520072936, acc: 0.938333330154419\n", + "Epoch: 7, iter: 608, loss: 0.34691267059399533, acc: 0.9407051251484797\n", + "Epoch: 7, iter: 609, loss: 0.3457851663783745, acc: 0.9429012316244619\n", + "Epoch: 7, iter: 610, loss: 0.3451964652964047, acc: 0.9449404733521598\n", + "Epoch: 7, iter: 611, loss: 0.3443090473783427, acc: 0.9468390777193266\n", + "Epoch: 7, iter: 612, loss: 0.3470872888962428, acc: 0.9444444417953491\n", + "Epoch: 7, iter: 613, loss: 0.34695114724097714, acc: 0.9448924699137288\n", + "Epoch: 7, iter: 614, loss: 0.3487962381914258, acc: 0.9440104141831398\n", + "Epoch: 7, iter: 615, loss: 0.3529102684873523, acc: 0.939393937587738\n", + "Epoch: 7, iter: 616, loss: 0.35425833831815157, acc: 0.9387254890273599\n", + "Epoch: 7, iter: 617, loss: 0.35365423219544545, acc: 0.9392857125827244\n", + "Epoch: 7, iter: 618, loss: 0.3519142187303967, acc: 0.9409722205665376\n", + "Epoch: 7, iter: 619, loss: 0.35115443371437693, acc: 0.9414414392935263\n", + "Epoch: 7, iter: 620, loss: 0.34909449047163915, acc: 0.9429824540489599\n", + "Epoch: 7, iter: 621, loss: 0.34800162070836776, acc: 0.9444444424066788\n", + "Epoch: 7, iter: 622, loss: 0.347383975982666, acc: 0.9447916641831398\n", + "Epoch: 7, iter: 623, loss: 0.3459506609090945, acc: 0.9461382089591608\n", + "Epoch: 7, iter: 624, loss: 0.34641043274175554, acc: 0.946428568590255\n", + "Epoch: 7, iter: 625, loss: 0.3464393220668615, acc: 0.9467054231222286\n", + "Epoch: 7, iter: 626, loss: 0.34457857364957983, acc: 0.9479166635058143\n", + "Epoch: 7, iter: 627, loss: 0.3443914320733812, acc: 0.948148144616021\n", + "Epoch: 7, iter: 628, loss: 0.34513639237569727, acc: 0.9474637650925181\n", + "Epoch: 7, iter: 629, loss: 0.34508529368867263, acc: 0.9485815573245922\n", + "Epoch: 7, iter: 630, loss: 0.3447087158759435, acc: 0.9479166641831398\n", + "Epoch: 7, iter: 631, loss: 0.3437330443031934, acc: 0.948979589403892\n", + "Epoch: 7, iter: 632, loss: 0.3426614910364151, acc: 0.9499999976158142\n", + "Epoch: 7, iter: 633, loss: 0.3427119038852991, acc: 0.9501633959658006\n", + "Epoch: 7, iter: 634, loss: 0.34370168585043687, acc: 0.9503205097638644\n", + "Epoch: 7, iter: 635, loss: 0.3460328072871802, acc: 0.9496855319670912\n", + "Epoch: 7, iter: 636, loss: 0.34643445081180996, acc: 0.9498456760689065\n", + "Epoch: 7, iter: 637, loss: 0.34676880782300773, acc: 0.9484848455949263\n", + "Epoch: 7, iter: 638, loss: 0.3457720811877932, acc: 0.9494047590664455\n", + "Epoch: 7, iter: 639, loss: 0.34547095340594913, acc: 0.9480994124161569\n", + "Epoch: 7, iter: 640, loss: 0.3456516296699129, acc: 0.9475574688664798\n", + "Epoch: 7, iter: 641, loss: 0.3448624297723932, acc: 0.94844632532637\n", + "Epoch: 7, iter: 642, loss: 0.346195990840594, acc: 0.9479166646798451\n", + "Epoch: 7, iter: 643, loss: 0.34730619973823673, acc: 0.9460382490861611\n", + "Epoch: 7, iter: 644, loss: 0.34586464157027585, acc: 0.9469085999073521\n", + "Epoch: 7, iter: 645, loss: 0.3467139559132712, acc: 0.9457671935596164\n", + "Epoch: 7, iter: 646, loss: 0.34638497279956937, acc: 0.9459635391831398\n", + "Epoch: 7, iter: 647, loss: 0.3455251592856187, acc: 0.946794869349553\n", + "Epoch: 7, iter: 648, loss: 0.3448861078782515, acc: 0.9469696942603949\n", + "Epoch: 7, iter: 649, loss: 0.3448418063014301, acc: 0.9465174105629992\n", + "Epoch: 7, iter: 650, loss: 0.34477022158748966, acc: 0.9466911738409716\n", + "Epoch: 7, iter: 651, loss: 0.34367521258368006, acc: 0.946859900502191\n", + "Epoch: 7, iter: 652, loss: 0.34333470165729524, acc: 0.9476190447807312\n", + "Epoch: 7, iter: 653, loss: 0.3429082921693023, acc: 0.948356804713397\n", + "Epoch: 7, iter: 654, loss: 0.34323526298006374, acc: 0.9484953673349487\n", + "Epoch: 7, iter: 655, loss: 0.3433129366946547, acc: 0.9474885814810452\n", + "Epoch: 7, iter: 656, loss: 0.3435581072762206, acc: 0.9476351319132624\n", + "Epoch: 7, iter: 657, loss: 0.3437851250171661, acc: 0.9477777743339538\n", + "Epoch: 7, iter: 658, loss: 0.34347106947710637, acc: 0.9479166630067324\n", + "Epoch: 7, iter: 659, loss: 0.3428821610165881, acc: 0.9485930699806708\n", + "Epoch: 7, iter: 660, loss: 0.34160973647466075, acc: 0.9492521331860468\n", + "Epoch: 7, iter: 661, loss: 0.3421882456993755, acc: 0.9488396591778043\n", + "Epoch: 7, iter: 662, loss: 0.34182231668382884, acc: 0.9484374970197678\n", + "Epoch: 7, iter: 663, loss: 0.34298000972212095, acc: 0.9475308612540916\n", + "Epoch: 7, iter: 664, loss: 0.34341681603251434, acc: 0.9476625984761773\n", + "Epoch: 7, iter: 665, loss: 0.3424162888024227, acc: 0.948293169578874\n", + "Epoch: 7, iter: 666, loss: 0.3433756177269277, acc: 0.9479166638283503\n", + "Epoch: 7, iter: 667, loss: 0.3430980245856678, acc: 0.9480392126476064\n", + "Epoch: 7, iter: 668, loss: 0.34290939482838606, acc: 0.9481589114943216\n", + "Epoch: 7, iter: 669, loss: 0.3427001688329653, acc: 0.9487547860748466\n", + "Epoch: 7, iter: 670, loss: 0.3436079572208903, acc: 0.9479166635058143\n", + "Epoch: 7, iter: 671, loss: 0.3432905859826656, acc: 0.948033704516593\n", + "Epoch: 7, iter: 672, loss: 0.34254364454083974, acc: 0.948611107799742\n", + "Epoch: 7, iter: 673, loss: 0.34235460597735184, acc: 0.9491758209008437\n", + "Epoch: 7, iter: 674, loss: 0.34259164511509566, acc: 0.9488224607446919\n", + "Epoch: 7, iter: 675, loss: 0.3441091876837515, acc: 0.9480286708442114\n", + "Epoch: 7, iter: 676, loss: 0.34323781015391047, acc: 0.9485815573245922\n", + "Epoch: 7, iter: 677, loss: 0.3431563115433643, acc: 0.9486842073892292\n", + "Epoch: 7, iter: 678, loss: 0.34289149396742385, acc: 0.948784718910853\n", + "Epoch: 7, iter: 679, loss: 0.3430178664701501, acc: 0.9483755046559363\n", + "Epoch: 8, iter: 680, loss: 0.26896339654922485, acc: 0.9583333134651184\n", + "Epoch: 8, iter: 681, loss: 0.2917333394289017, acc: 0.9375\n", + "Epoch: 8, iter: 682, loss: 0.3028559982776642, acc: 0.9583333333333334\n", + "Epoch: 8, iter: 683, loss: 0.32799992710351944, acc: 0.9583333283662796\n", + "Epoch: 8, iter: 684, loss: 0.31925055384635925, acc: 0.9583333253860473\n", + "Epoch: 8, iter: 685, loss: 0.3190562278032303, acc: 0.9583333233992258\n", + "Epoch: 8, iter: 686, loss: 0.31525143129484995, acc: 0.964285705770765\n", + "Epoch: 8, iter: 687, loss: 0.3188290633261204, acc: 0.9635416567325592\n", + "Epoch: 8, iter: 688, loss: 0.32348450024922687, acc: 0.9537036948733859\n", + "Epoch: 8, iter: 689, loss: 0.3155346930027008, acc: 0.9583333253860473\n", + "Epoch: 8, iter: 690, loss: 0.3247786137190732, acc: 0.9431818127632141\n", + "Epoch: 8, iter: 691, loss: 0.31890082110961276, acc: 0.947916661699613\n", + "Epoch: 8, iter: 692, loss: 0.3145030186726497, acc: 0.9487179426046518\n", + "Epoch: 8, iter: 693, loss: 0.313342992748533, acc: 0.9523809467043195\n", + "Epoch: 8, iter: 694, loss: 0.3115674654642741, acc: 0.9555555502573649\n", + "Epoch: 8, iter: 695, loss: 0.31240780651569366, acc: 0.9531249962747097\n", + "Epoch: 8, iter: 696, loss: 0.31260165046243105, acc: 0.9534313678741455\n", + "Epoch: 8, iter: 697, loss: 0.31200023161040413, acc: 0.9537036981847551\n", + "Epoch: 8, iter: 698, loss: 0.3103381395339966, acc: 0.9561403456487154\n", + "Epoch: 8, iter: 699, loss: 0.3099891185760498, acc: 0.9583333283662796\n", + "Epoch: 8, iter: 700, loss: 0.31264948561078026, acc: 0.9563492025647845\n", + "Epoch: 8, iter: 701, loss: 0.3156368976289576, acc: 0.9564393894238905\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 8, iter: 702, loss: 0.31838052169136377, acc: 0.9547101414721945\n", + "Epoch: 8, iter: 703, loss: 0.3184092938899994, acc: 0.9548611069718996\n", + "Epoch: 8, iter: 704, loss: 0.3164078378677368, acc: 0.9566666626930237\n", + "Epoch: 8, iter: 705, loss: 0.3169080294095553, acc: 0.9551282020715567\n", + "Epoch: 8, iter: 706, loss: 0.3193630476792653, acc: 0.9506172802713182\n", + "Epoch: 8, iter: 707, loss: 0.3214553679738726, acc: 0.9508928528853825\n", + "Epoch: 8, iter: 708, loss: 0.3200970168771415, acc: 0.9511494204915804\n", + "Epoch: 8, iter: 709, loss: 0.31950374841690066, acc: 0.9513888835906983\n", + "Epoch: 8, iter: 710, loss: 0.3195471830906407, acc: 0.95026881271793\n", + "Epoch: 8, iter: 711, loss: 0.3192580183967948, acc: 0.9505208283662796\n", + "Epoch: 8, iter: 712, loss: 0.3165796823573835, acc: 0.952020197203665\n", + "Epoch: 8, iter: 713, loss: 0.31549276762148915, acc: 0.9522058770937079\n", + "Epoch: 8, iter: 714, loss: 0.3160234842981611, acc: 0.9511904716491699\n", + "Epoch: 8, iter: 715, loss: 0.3148392223649555, acc: 0.9525462918811374\n", + "Epoch: 8, iter: 716, loss: 0.3140702771173941, acc: 0.9538288245329986\n", + "Epoch: 8, iter: 717, loss: 0.3121540201337714, acc: 0.9550438554663407\n", + "Epoch: 8, iter: 718, loss: 0.31149923419341063, acc: 0.9551282005432324\n", + "Epoch: 8, iter: 719, loss: 0.31398296132683756, acc: 0.9531249955296517\n", + "Epoch: 8, iter: 720, loss: 0.31340783907145986, acc: 0.9532520276744191\n", + "Epoch: 8, iter: 721, loss: 0.3135318365835008, acc: 0.9533730106694358\n", + "Epoch: 8, iter: 722, loss: 0.314940155245537, acc: 0.9525193752244462\n", + "Epoch: 8, iter: 723, loss: 0.3153382668440992, acc: 0.9526515101844614\n", + "Epoch: 8, iter: 724, loss: 0.3151628288957808, acc: 0.9527777724795872\n", + "Epoch: 8, iter: 725, loss: 0.3152153628027957, acc: 0.9528985451097074\n", + "Epoch: 8, iter: 726, loss: 0.3169539126944035, acc: 0.9512411292563093\n", + "Epoch: 8, iter: 727, loss: 0.3173295470575492, acc: 0.9513888830939928\n", + "Epoch: 8, iter: 728, loss: 0.31694591288663904, acc: 0.9515306061627914\n", + "Epoch: 8, iter: 729, loss: 0.31597654342651366, acc: 0.9524999940395356\n", + "Epoch: 8, iter: 730, loss: 0.31670838477564794, acc: 0.9517973801668953\n", + "Epoch: 8, iter: 731, loss: 0.3167317784749545, acc: 0.951923071191861\n", + "Epoch: 8, iter: 732, loss: 0.31582005293864124, acc: 0.9528301830561656\n", + "Epoch: 8, iter: 733, loss: 0.3150322371058994, acc: 0.9529320928785536\n", + "Epoch: 8, iter: 734, loss: 0.3146992119875821, acc: 0.9530302968892184\n", + "Epoch: 8, iter: 735, loss: 0.3142928513033049, acc: 0.9531249936137881\n", + "Epoch: 8, iter: 736, loss: 0.31353583879638136, acc: 0.9539473621468795\n", + "Epoch: 8, iter: 737, loss: 0.3142222911119461, acc: 0.9540229819971939\n", + "Epoch: 8, iter: 738, loss: 0.3137782478736619, acc: 0.954096038462752\n", + "Epoch: 8, iter: 739, loss: 0.31301251153151194, acc: 0.9548611044883728\n", + "Epoch: 8, iter: 740, loss: 0.31328854013661867, acc: 0.954918025947008\n", + "Epoch: 8, iter: 741, loss: 0.31252705041439305, acc: 0.9556451545607659\n", + "Epoch: 8, iter: 742, loss: 0.31203556675759575, acc: 0.9556878237497239\n", + "Epoch: 8, iter: 743, loss: 0.31202762154862285, acc: 0.9557291595265269\n", + "Epoch: 8, iter: 744, loss: 0.3110038161277771, acc: 0.956410249379965\n", + "Epoch: 8, iter: 745, loss: 0.31036658810846735, acc: 0.9564393867145885\n", + "Epoch: 8, iter: 746, loss: 0.30944627923751944, acc: 0.9570895451218334\n", + "Epoch: 8, iter: 747, loss: 0.30960868167526584, acc: 0.9571078358327642\n", + "Epoch: 8, iter: 748, loss: 0.310514257437941, acc: 0.9559178671975067\n", + "Epoch: 8, iter: 749, loss: 0.3097498169967106, acc: 0.9559523735727583\n", + "Epoch: 8, iter: 750, loss: 0.3101966548973406, acc: 0.9548121992970856\n", + "Epoch: 8, iter: 751, loss: 0.3106968080004056, acc: 0.9537036965290705\n", + "Epoch: 8, iter: 752, loss: 0.30989510229189104, acc: 0.9543378924670285\n", + "Epoch: 8, iter: 753, loss: 0.3095827392629675, acc: 0.9543918846426783\n", + "Epoch: 8, iter: 754, loss: 0.3095108004411062, acc: 0.9549999928474426\n", + "Epoch: 8, iter: 755, loss: 0.3091563594184424, acc: 0.9555920982047131\n", + "Epoch: 8, iter: 756, loss: 0.30919811594021784, acc: 0.9556276984029002\n", + "Epoch: 8, iter: 757, loss: 0.30985571444034576, acc: 0.9545940099618374\n", + "Epoch: 8, iter: 758, loss: 0.31002233450925804, acc: 0.9546413429175751\n", + "Epoch: 8, iter: 759, loss: 0.3104415230453014, acc: 0.9541666597127915\n", + "Epoch: 8, iter: 760, loss: 0.3110519500426304, acc: 0.9537036970809654\n", + "Epoch: 8, iter: 761, loss: 0.3098099404355375, acc: 0.9542682861409536\n", + "Epoch: 8, iter: 762, loss: 0.31006086357386714, acc: 0.9538152548203985\n", + "Epoch: 8, iter: 763, loss: 0.31056629742185277, acc: 0.9528769779772985\n", + "Epoch: 8, iter: 764, loss: 0.3118263007963405, acc: 0.9519607782363891\n", + "Epoch: 8, iter: 765, loss: 0.3119331489122191, acc: 0.9520348774832349\n", + "Epoch: 8, iter: 766, loss: 0.31149315166062325, acc: 0.9521072732991186\n", + "Epoch: 8, iter: 767, loss: 0.3117449657822197, acc: 0.9517045393586159\n", + "Epoch: 8, iter: 768, loss: 0.3125222681948308, acc: 0.9508426906017775\n", + "Epoch: 8, iter: 769, loss: 0.3118269263042344, acc: 0.9513888829284244\n", + "Epoch: 8, iter: 770, loss: 0.3123537683552438, acc: 0.9510073203306931\n", + "Epoch: 8, iter: 771, loss: 0.31218463036677113, acc: 0.9515398494575334\n", + "Epoch: 8, iter: 772, loss: 0.31228356704276095, acc: 0.951612897457615\n", + "Epoch: 8, iter: 773, loss: 0.31291890318723437, acc: 0.9512411292563093\n", + "Epoch: 8, iter: 774, loss: 0.3120965102785512, acc: 0.9517543805272956\n", + "Epoch: 8, iter: 775, loss: 0.31213149599110085, acc: 0.9513888837148746\n", + "Epoch: 8, iter: 776, loss: 0.3132732075821493, acc: 0.9509528224001226\n", + "Epoch: 9, iter: 777, loss: 0.3471744954586029, acc: 0.9166666865348816\n", + "Epoch: 9, iter: 778, loss: 0.39319877326488495, acc: 0.8958333432674408\n", + "Epoch: 9, iter: 779, loss: 0.3666958510875702, acc: 0.9027777910232544\n", + "Epoch: 9, iter: 780, loss: 0.35675761848688126, acc: 0.9166666716337204\n", + "Epoch: 9, iter: 781, loss: 0.3467530786991119, acc: 0.925\n", + "Epoch: 9, iter: 782, loss: 0.3296460509300232, acc: 0.9375\n", + "Epoch: 9, iter: 783, loss: 0.32659843138286043, acc: 0.9464285714285714\n", + "Epoch: 9, iter: 784, loss: 0.3261294737458229, acc: 0.9427083358168602\n", + "Epoch: 9, iter: 785, loss: 0.3201579451560974, acc: 0.9490740762816535\n", + "Epoch: 9, iter: 786, loss: 0.31236039102077484, acc: 0.9541666686534882\n", + "Epoch: 9, iter: 787, loss: 0.3068223107944835, acc: 0.9583333351395347\n", + "Epoch: 9, iter: 788, loss: 0.3013914537926515, acc: 0.9618055572112402\n", + "Epoch: 9, iter: 789, loss: 0.3028917828431496, acc: 0.9615384615384616\n", + "Epoch: 9, iter: 790, loss: 0.3032189192516463, acc: 0.9613095223903656\n", + "Epoch: 9, iter: 791, loss: 0.2988701711098353, acc: 0.9638888875643412\n", + "Epoch: 9, iter: 792, loss: 0.29552648309618235, acc: 0.9635416641831398\n", + "Epoch: 9, iter: 793, loss: 0.2922815566553789, acc: 0.9656862721723669\n", + "Epoch: 9, iter: 794, loss: 0.29675184604194427, acc: 0.9606481459405687\n", + "Epoch: 9, iter: 795, loss: 0.2995435838636599, acc: 0.9583333322876378\n", + "Epoch: 9, iter: 796, loss: 0.29840507730841637, acc: 0.9604166656732559\n", + "Epoch: 9, iter: 797, loss: 0.2986302226781845, acc: 0.9583333333333334\n", + "Epoch: 9, iter: 798, loss: 0.29951234229586343, acc: 0.9602272727272727\n", + "Epoch: 9, iter: 799, loss: 0.29932452997435693, acc: 0.9601449266723965\n", + "Epoch: 9, iter: 800, loss: 0.3012069159497817, acc: 0.9583333333333334\n", + "Epoch: 9, iter: 801, loss: 0.2999857658147812, acc: 0.9583333325386048\n", + "Epoch: 9, iter: 802, loss: 0.2976498460540405, acc: 0.9599358966717353\n", + "Epoch: 9, iter: 803, loss: 0.2981669897282565, acc: 0.9583333333333334\n", + "Epoch: 9, iter: 804, loss: 0.2982080009366785, acc: 0.9583333326237542\n", + "Epoch: 9, iter: 805, loss: 0.29927790010797567, acc: 0.9568965517241379\n", + "Epoch: 9, iter: 806, loss: 0.30026613622903825, acc: 0.9555555562178294\n", + "Epoch: 9, iter: 807, loss: 0.29777850979758846, acc: 0.9569892479527381\n", + "Epoch: 9, iter: 808, loss: 0.2973713236860931, acc: 0.95703125\n", + "Epoch: 9, iter: 809, loss: 0.29494063646504376, acc: 0.9583333333333334\n", + "Epoch: 9, iter: 810, loss: 0.29290668885497484, acc: 0.9595588235294118\n", + "Epoch: 9, iter: 811, loss: 0.29313405624457767, acc: 0.9595238089561462\n", + "Epoch: 9, iter: 812, loss: 0.2914164327085018, acc: 0.9606481475962533\n", + "Epoch: 9, iter: 813, loss: 0.2930313231977257, acc: 0.9594594594594594\n", + "Epoch: 9, iter: 814, loss: 0.29205325755633804, acc: 0.9594298240385557\n", + "Epoch: 9, iter: 815, loss: 0.29254083029734784, acc: 0.9594017083828266\n", + "Epoch: 9, iter: 816, loss: 0.29197897128760814, acc: 0.9583333328366279\n", + "Epoch: 9, iter: 817, loss: 0.2924971453300336, acc: 0.9573170731707317\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 9, iter: 818, loss: 0.2909990070121629, acc: 0.9583333333333334\n", + "Epoch: 9, iter: 819, loss: 0.2896163619534914, acc: 0.9593023255813954\n", + "Epoch: 9, iter: 820, loss: 0.28839828581972554, acc: 0.9602272727272727\n", + "Epoch: 9, iter: 821, loss: 0.28798247542646194, acc: 0.9601851847436693\n", + "Epoch: 9, iter: 822, loss: 0.28803343649791635, acc: 0.9592391304347826\n", + "Epoch: 9, iter: 823, loss: 0.28846393335372844, acc: 0.9601063829787234\n", + "Epoch: 9, iter: 824, loss: 0.2905819934482376, acc: 0.9592013893028101\n", + "Epoch: 9, iter: 825, loss: 0.29366127660079877, acc: 0.9574829936027527\n", + "Epoch: 9, iter: 826, loss: 0.29462080329656604, acc: 0.9566666674613953\n", + "Epoch: 9, iter: 827, loss: 0.29369420631259097, acc: 0.9566993467948016\n", + "Epoch: 9, iter: 828, loss: 0.29293554104291475, acc: 0.9567307692307693\n", + "Epoch: 9, iter: 829, loss: 0.2918022325578726, acc: 0.9575471698113207\n", + "Epoch: 9, iter: 830, loss: 0.2967650266709151, acc: 0.9544753090099052\n", + "Epoch: 9, iter: 831, loss: 0.2955651044845581, acc: 0.9553030306642706\n", + "Epoch: 9, iter: 832, loss: 0.2974884291844709, acc: 0.9538690479738372\n", + "Epoch: 9, iter: 833, loss: 0.29778962856844854, acc: 0.9532163749661362\n", + "Epoch: 9, iter: 834, loss: 0.2985341980539519, acc: 0.9533045980437048\n", + "Epoch: 9, iter: 835, loss: 0.29946777477102765, acc: 0.9526836164927078\n", + "Epoch: 9, iter: 836, loss: 0.2992200483878454, acc: 0.9534722228844961\n", + "Epoch: 9, iter: 837, loss: 0.2994198613479489, acc: 0.9528688534361417\n", + "Epoch: 9, iter: 838, loss: 0.2989579458390513, acc: 0.952956989888222\n", + "Epoch: 9, iter: 839, loss: 0.29829741091955275, acc: 0.9537037043344407\n", + "Epoch: 9, iter: 840, loss: 0.29853585734963417, acc: 0.954427083954215\n", + "Epoch: 9, iter: 841, loss: 0.2977446631743358, acc: 0.9551282057395348\n", + "Epoch: 9, iter: 842, loss: 0.2975188640482498, acc: 0.955808081410148\n", + "Epoch: 9, iter: 843, loss: 0.29655249639233544, acc: 0.9564676622846233\n", + "Epoch: 9, iter: 844, loss: 0.2964984487523051, acc: 0.9564950983313953\n", + "Epoch: 9, iter: 845, loss: 0.2966841141814771, acc: 0.9559178749720255\n", + "Epoch: 9, iter: 846, loss: 0.2963933589203017, acc: 0.9559523812362126\n", + "Epoch: 9, iter: 847, loss: 0.2958952165405515, acc: 0.9559859154929577\n", + "Epoch: 9, iter: 848, loss: 0.29656160146825844, acc: 0.9560185182425711\n", + "Epoch: 9, iter: 849, loss: 0.2963458301678096, acc: 0.9566210042940427\n", + "Epoch: 9, iter: 850, loss: 0.2976965994851009, acc: 0.956081081081081\n", + "Epoch: 9, iter: 851, loss: 0.2977592271566391, acc: 0.9561111108462016\n", + "Epoch: 9, iter: 852, loss: 0.2981295469952257, acc: 0.9555921052631579\n", + "Epoch: 9, iter: 853, loss: 0.29844325103543023, acc: 0.9550865803446088\n", + "Epoch: 9, iter: 854, loss: 0.2994895269855475, acc: 0.9540598293145498\n", + "Epoch: 9, iter: 855, loss: 0.2993644432553762, acc: 0.9546413504624669\n", + "Epoch: 9, iter: 856, loss: 0.2994766028597951, acc: 0.9546875\n", + "Epoch: 9, iter: 857, loss: 0.2983114053437739, acc: 0.9552469135802469\n", + "Epoch: 9, iter: 858, loss: 0.2977783803532763, acc: 0.9557926829268293\n", + "Epoch: 9, iter: 859, loss: 0.2970292191189456, acc: 0.9563253012048193\n", + "Epoch: 9, iter: 860, loss: 0.2964543987597738, acc: 0.9568452380952381\n", + "Epoch: 9, iter: 861, loss: 0.2961429981624379, acc: 0.9568627448642955\n", + "Epoch: 9, iter: 862, loss: 0.2961772714936456, acc: 0.9568798444991888\n", + "Epoch: 9, iter: 863, loss: 0.2955663005510966, acc: 0.9573754784704624\n", + "Epoch: 9, iter: 864, loss: 0.2947803715413267, acc: 0.9578598480332982\n", + "Epoch: 9, iter: 865, loss: 0.2952837977516517, acc: 0.9578651678696107\n", + "Epoch: 9, iter: 866, loss: 0.2951559417777591, acc: 0.9578703694873386\n", + "Epoch: 9, iter: 867, loss: 0.29512990307021925, acc: 0.9574175817625863\n", + "Epoch: 9, iter: 868, loss: 0.29483189207056293, acc: 0.9574275353680486\n", + "Epoch: 9, iter: 869, loss: 0.29418034483027716, acc: 0.9578853038049513\n", + "Epoch: 9, iter: 870, loss: 0.2932031913957697, acc: 0.9583333324878773\n", + "Epoch: 9, iter: 871, loss: 0.29354642425712785, acc: 0.9578947362146879\n", + "Epoch: 9, iter: 872, loss: 0.29339893146728474, acc: 0.9578993047277132\n", + "Epoch: 9, iter: 873, loss: 0.29359114093264355, acc: 0.9573961256705609\n", + "Epoch: 10, iter: 874, loss: 0.2628408968448639, acc: 1.0\n", + "Epoch: 10, iter: 875, loss: 0.27240656316280365, acc: 0.9791666567325592\n", + "Epoch: 10, iter: 876, loss: 0.26956047614415485, acc: 0.9861111044883728\n", + "Epoch: 10, iter: 877, loss: 0.276724249124527, acc: 0.9791666567325592\n", + "Epoch: 10, iter: 878, loss: 0.2818173706531525, acc: 0.9833333253860473\n", + "Epoch: 10, iter: 879, loss: 0.2817313075065613, acc: 0.9861111044883728\n", + "Epoch: 10, iter: 880, loss: 0.27329179857458386, acc: 0.9880952324186053\n", + "Epoch: 10, iter: 881, loss: 0.2730101514607668, acc: 0.9843749925494194\n", + "Epoch: 10, iter: 882, loss: 0.272122742401229, acc: 0.9814814726511637\n", + "Epoch: 10, iter: 883, loss: 0.2705309227108955, acc: 0.9833333253860473\n", + "Epoch: 10, iter: 884, loss: 0.2719739743254401, acc: 0.9772727218541232\n", + "Epoch: 10, iter: 885, loss: 0.2668999743958314, acc: 0.979166661699613\n", + "Epoch: 10, iter: 886, loss: 0.26702201481048876, acc: 0.9807692261842581\n", + "Epoch: 10, iter: 887, loss: 0.2651844695210457, acc: 0.9821428528853825\n", + "Epoch: 10, iter: 888, loss: 0.27061420579751333, acc: 0.980555550257365\n", + "Epoch: 10, iter: 889, loss: 0.27230855356901884, acc: 0.9765624962747097\n", + "Epoch: 10, iter: 890, loss: 0.2722301860066021, acc: 0.9754901914035573\n", + "Epoch: 10, iter: 891, loss: 0.2709884900185797, acc: 0.9745370315180885\n", + "Epoch: 10, iter: 892, loss: 0.27410434343312917, acc: 0.9714912238873934\n", + "Epoch: 10, iter: 893, loss: 0.27074343487620356, acc: 0.9729166626930237\n", + "Epoch: 10, iter: 894, loss: 0.2722667306661606, acc: 0.9722222174916949\n", + "Epoch: 10, iter: 895, loss: 0.2722792239351706, acc: 0.971590903672305\n", + "Epoch: 10, iter: 896, loss: 0.27078991674858593, acc: 0.9728260817735092\n", + "Epoch: 10, iter: 897, loss: 0.2695397815356652, acc: 0.9739583283662796\n", + "Epoch: 10, iter: 898, loss: 0.2680089223384857, acc: 0.9749999952316284\n", + "Epoch: 10, iter: 899, loss: 0.26980964151712566, acc: 0.9727564064355997\n", + "Epoch: 10, iter: 900, loss: 0.2691818288079015, acc: 0.9737654284194663\n", + "Epoch: 10, iter: 901, loss: 0.2702998284782682, acc: 0.9732142814568111\n", + "Epoch: 10, iter: 902, loss: 0.26786105899975216, acc: 0.9741379269238176\n", + "Epoch: 10, iter: 903, loss: 0.2717737525701523, acc: 0.9708333293596904\n", + "Epoch: 10, iter: 904, loss: 0.2710303721889373, acc: 0.9717741897029262\n", + "Epoch: 10, iter: 905, loss: 0.27315298840403557, acc: 0.9687499962747097\n", + "Epoch: 10, iter: 906, loss: 0.2746209213227937, acc: 0.9671717141613816\n", + "Epoch: 10, iter: 907, loss: 0.27369748888646855, acc: 0.9681372519801644\n", + "Epoch: 10, iter: 908, loss: 0.2713968468563897, acc: 0.9690476162093026\n", + "Epoch: 10, iter: 909, loss: 0.2704106341633532, acc: 0.9699074046479331\n", + "Epoch: 10, iter: 910, loss: 0.2688274145931811, acc: 0.9707207180358268\n", + "Epoch: 10, iter: 911, loss: 0.2675481571962959, acc: 0.9714912254559366\n", + "Epoch: 10, iter: 912, loss: 0.2664978053325262, acc: 0.9722222196750152\n", + "Epoch: 10, iter: 913, loss: 0.2658503338694572, acc: 0.9729166641831398\n", + "Epoch: 10, iter: 914, loss: 0.2669001330689686, acc: 0.9725609727022124\n", + "Epoch: 10, iter: 915, loss: 0.26795937830493566, acc: 0.9712301563648951\n", + "Epoch: 10, iter: 916, loss: 0.2693982477798018, acc: 0.9699612384618714\n", + "Epoch: 10, iter: 917, loss: 0.27362662756984885, acc: 0.9668560583483089\n", + "Epoch: 10, iter: 918, loss: 0.27419630818896823, acc: 0.9657407389746772\n", + "Epoch: 10, iter: 919, loss: 0.27656662593717163, acc: 0.9646739117477251\n", + "Epoch: 10, iter: 920, loss: 0.27569135643066245, acc: 0.9654255306467097\n", + "Epoch: 10, iter: 921, loss: 0.27554418829580146, acc: 0.96440972139438\n", + "Epoch: 10, iter: 922, loss: 0.2753970288500494, acc: 0.9651360536108211\n", + "Epoch: 10, iter: 923, loss: 0.27528962552547454, acc: 0.9641666662693024\n", + "Epoch: 10, iter: 924, loss: 0.27469591065949084, acc: 0.9640522868025536\n", + "Epoch: 10, iter: 925, loss: 0.2743196877149435, acc: 0.9639423065460645\n", + "Epoch: 10, iter: 926, loss: 0.274344765352753, acc: 0.9638364764879335\n", + "Epoch: 10, iter: 927, loss: 0.2734211147935302, acc: 0.9645061713677866\n", + "Epoch: 10, iter: 928, loss: 0.27458288832144306, acc: 0.9636363625526428\n", + "Epoch: 10, iter: 929, loss: 0.27467904186674524, acc: 0.9635416652475085\n", + "Epoch: 10, iter: 930, loss: 0.27507592868386654, acc: 0.9627192971999186\n", + "Epoch: 10, iter: 931, loss: 0.27475488648332397, acc: 0.9626436767906978\n", + "Epoch: 10, iter: 932, loss: 0.2739952691530777, acc: 0.9632768348111944\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 10, iter: 933, loss: 0.27392017990350725, acc: 0.9638888875643412\n", + "Epoch: 10, iter: 934, loss: 0.27367107887737085, acc: 0.9644808730141061\n", + "Epoch: 10, iter: 935, loss: 0.2727817205652114, acc: 0.9650537621590399\n", + "Epoch: 10, iter: 936, loss: 0.2720744548335908, acc: 0.9656084643469917\n", + "Epoch: 10, iter: 937, loss: 0.2711525857448578, acc: 0.9661458320915699\n", + "Epoch: 10, iter: 938, loss: 0.2703566294450026, acc: 0.9666666654440073\n", + "Epoch: 10, iter: 939, loss: 0.26943280186617014, acc: 0.9671717159675829\n", + "Epoch: 10, iter: 940, loss: 0.2692596420868119, acc: 0.9676616903561265\n", + "Epoch: 10, iter: 941, loss: 0.269198644468013, acc: 0.9675245083430234\n", + "Epoch: 10, iter: 942, loss: 0.26955521689808887, acc: 0.966787438461746\n", + "Epoch: 10, iter: 943, loss: 0.26900734709841867, acc: 0.9672619036265782\n", + "Epoch: 10, iter: 944, loss: 0.26852271905247593, acc: 0.9677230035754997\n", + "Epoch: 10, iter: 945, loss: 0.2686676103621721, acc: 0.9675925912128555\n", + "Epoch: 10, iter: 946, loss: 0.2675824465408717, acc: 0.9680365283195287\n", + "Epoch: 10, iter: 947, loss: 0.26703182003788045, acc: 0.9684684671260215\n", + "Epoch: 10, iter: 948, loss: 0.2673319564263026, acc: 0.9683333317438761\n", + "Epoch: 10, iter: 949, loss: 0.26670812207617256, acc: 0.9682017525559977\n", + "Epoch: 10, iter: 950, loss: 0.2658640964851751, acc: 0.9686147168085173\n", + "Epoch: 10, iter: 951, loss: 0.2654798502723376, acc: 0.9690170922340491\n", + "Epoch: 10, iter: 952, loss: 0.26477317059341865, acc: 0.9694092809399472\n", + "Epoch: 10, iter: 953, loss: 0.2670345505699515, acc: 0.9682291649281979\n", + "Epoch: 10, iter: 954, loss: 0.26659937423688396, acc: 0.9681069939224808\n", + "Epoch: 10, iter: 955, loss: 0.2655828387998953, acc: 0.9684959330209871\n", + "Epoch: 10, iter: 956, loss: 0.26619981678135424, acc: 0.9678714842681425\n", + "Epoch: 10, iter: 957, loss: 0.26617758721113205, acc: 0.9682539665982837\n", + "Epoch: 10, iter: 958, loss: 0.2672314458033618, acc: 0.9676470574210672\n", + "Epoch: 10, iter: 959, loss: 0.26760697330153266, acc: 0.9675387580727421\n", + "Epoch: 10, iter: 960, loss: 0.2679288791513991, acc: 0.966954021618284\n", + "Epoch: 10, iter: 961, loss: 0.26776869425719435, acc: 0.9673295440998945\n", + "Epoch: 10, iter: 962, loss: 0.2676253700524234, acc: 0.967696627874053\n", + "Epoch: 10, iter: 963, loss: 0.2671295354763667, acc: 0.9680555542310079\n", + "Epoch: 10, iter: 964, loss: 0.26746447990228844, acc: 0.9674908413991823\n", + "Epoch: 10, iter: 965, loss: 0.2668007725606794, acc: 0.9678442018187564\n", + "Epoch: 10, iter: 966, loss: 0.26647370925513647, acc: 0.9681899630895225\n", + "Epoch: 10, iter: 967, loss: 0.2655104512863971, acc: 0.9685283677375063\n", + "Epoch: 10, iter: 968, loss: 0.26498969479611045, acc: 0.9688596480771114\n", + "Epoch: 10, iter: 969, loss: 0.2650019147743781, acc: 0.9687499987582365\n", + "Epoch: 10, iter: 970, loss: 0.2659164369106293, acc: 0.9681349568760272\n", + "Epoch: 11, iter: 971, loss: 0.25741177797317505, acc: 0.9583333134651184\n", + "Epoch: 11, iter: 972, loss: 0.22681254148483276, acc: 0.9791666567325592\n", + "Epoch: 11, iter: 973, loss: 0.269775927066803, acc: 0.9722222089767456\n", + "Epoch: 11, iter: 974, loss: 0.24915797263383865, acc: 0.9791666567325592\n", + "Epoch: 11, iter: 975, loss: 0.24130698740482331, acc: 0.9833333253860473\n", + "Epoch: 11, iter: 976, loss: 0.2369916414221128, acc: 0.9861111044883728\n", + "Epoch: 11, iter: 977, loss: 0.24342267640999385, acc: 0.9821428486279079\n", + "Epoch: 11, iter: 978, loss: 0.24659192003309727, acc: 0.9843749925494194\n", + "Epoch: 11, iter: 979, loss: 0.24112654394573635, acc: 0.9861111044883728\n", + "Epoch: 11, iter: 980, loss: 0.24343969225883483, acc: 0.9833333253860473\n", + "Epoch: 11, iter: 981, loss: 0.24431345137682828, acc: 0.9810605970295992\n", + "Epoch: 11, iter: 982, loss: 0.2466449315349261, acc: 0.9791666567325592\n", + "Epoch: 11, iter: 983, loss: 0.24158692016051367, acc: 0.9807692215992854\n", + "Epoch: 11, iter: 984, loss: 0.24170940582241332, acc: 0.9821428486279079\n", + "Epoch: 11, iter: 985, loss: 0.2533653646707535, acc: 0.9777777711550395\n", + "Epoch: 11, iter: 986, loss: 0.251863325946033, acc: 0.9765624925494194\n", + "Epoch: 11, iter: 987, loss: 0.2521071881055832, acc: 0.9754901878974017\n", + "Epoch: 11, iter: 988, loss: 0.2547869111100833, acc: 0.9745370282067193\n", + "Epoch: 11, iter: 989, loss: 0.25328669971541357, acc: 0.975877184616892\n", + "Epoch: 11, iter: 990, loss: 0.249431774020195, acc: 0.9770833253860474\n", + "Epoch: 11, iter: 991, loss: 0.24828109712827773, acc: 0.9781745956057594\n", + "Epoch: 11, iter: 992, loss: 0.2490151754834435, acc: 0.9791666594418612\n", + "Epoch: 11, iter: 993, loss: 0.24591776210328806, acc: 0.9800724568574325\n", + "Epoch: 11, iter: 994, loss: 0.24835565189520517, acc: 0.979166659216086\n", + "Epoch: 11, iter: 995, loss: 0.24973453044891358, acc: 0.9783333253860473\n", + "Epoch: 11, iter: 996, loss: 0.2487908618954512, acc: 0.9791666590250455\n", + "Epoch: 11, iter: 997, loss: 0.24829243675426202, acc: 0.9783950536339371\n", + "Epoch: 11, iter: 998, loss: 0.25085142095174107, acc: 0.9761904690946851\n", + "Epoch: 11, iter: 999, loss: 0.2493289796442821, acc: 0.977011487401765\n", + "Epoch: 11, iter: 1000, loss: 0.250611653427283, acc: 0.9749999940395355\n", + "Epoch: 11, iter: 1001, loss: 0.25330909557880893, acc: 0.9717741877801956\n", + "Epoch: 11, iter: 1002, loss: 0.25395224755629897, acc: 0.9713541604578495\n", + "Epoch: 11, iter: 1003, loss: 0.2527781612042225, acc: 0.972222216201551\n", + "Epoch: 11, iter: 1004, loss: 0.25396815424456315, acc: 0.9705882300348843\n", + "Epoch: 11, iter: 1005, loss: 0.2545311395611082, acc: 0.9702380895614624\n", + "Epoch: 11, iter: 1006, loss: 0.2595876020689805, acc: 0.965277772810724\n", + "Epoch: 11, iter: 1007, loss: 0.2583405854734215, acc: 0.9662162113834072\n", + "Epoch: 11, iter: 1008, loss: 0.25779063254594803, acc: 0.9671052584522649\n", + "Epoch: 11, iter: 1009, loss: 0.25715741782616347, acc: 0.9668803367859278\n", + "Epoch: 11, iter: 1010, loss: 0.25573932118713855, acc: 0.9677083283662796\n", + "Epoch: 11, iter: 1011, loss: 0.25426218022660513, acc: 0.9684959301134435\n", + "Epoch: 11, iter: 1012, loss: 0.25415985676504316, acc: 0.9682539630503881\n", + "Epoch: 11, iter: 1013, loss: 0.2542731495097626, acc: 0.9689922429794489\n", + "Epoch: 11, iter: 1014, loss: 0.26087909496643324, acc: 0.9659090854904868\n", + "Epoch: 11, iter: 1015, loss: 0.25927123493618437, acc: 0.966666661368476\n", + "Epoch: 11, iter: 1016, loss: 0.26003384330998297, acc: 0.9655797053938326\n", + "Epoch: 11, iter: 1017, loss: 0.2624136742125166, acc: 0.9636524776194958\n", + "Epoch: 11, iter: 1018, loss: 0.2625547833740711, acc: 0.9644097176690897\n", + "Epoch: 11, iter: 1019, loss: 0.2617750727400488, acc: 0.964285709420029\n", + "Epoch: 11, iter: 1020, loss: 0.26066832363605497, acc: 0.9649999952316284\n", + "Epoch: 11, iter: 1021, loss: 0.26018745379120695, acc: 0.9648692759813047\n", + "Epoch: 11, iter: 1022, loss: 0.2617661159199018, acc: 0.963942303107335\n", + "Epoch: 11, iter: 1023, loss: 0.2623491335027623, acc: 0.9646226370109702\n", + "Epoch: 11, iter: 1024, loss: 0.2621932943110113, acc: 0.9645061680564174\n", + "Epoch: 11, iter: 1025, loss: 0.26267880228432744, acc: 0.9636363593014804\n", + "Epoch: 11, iter: 1026, loss: 0.2619592523468392, acc: 0.9642857100282397\n", + "Epoch: 11, iter: 1027, loss: 0.2627955991448018, acc: 0.963450288563444\n", + "Epoch: 11, iter: 1028, loss: 0.2625126224653474, acc: 0.9640804560020052\n", + "Epoch: 11, iter: 1029, loss: 0.2624867106393232, acc: 0.9632768327906981\n", + "Epoch: 11, iter: 1030, loss: 0.26393245682120325, acc: 0.9624999970197677\n", + "Epoch: 11, iter: 1031, loss: 0.2634830228129371, acc: 0.9624316907319866\n", + "Epoch: 11, iter: 1032, loss: 0.2629874824516235, acc: 0.9630376312040514\n", + "Epoch: 11, iter: 1033, loss: 0.26313706759422545, acc: 0.9636243354706537\n", + "Epoch: 11, iter: 1034, loss: 0.2624670653603971, acc: 0.9641927052289248\n", + "Epoch: 11, iter: 1035, loss: 0.26295812542621905, acc: 0.9647435866869413\n", + "Epoch: 11, iter: 1036, loss: 0.2626796572497397, acc: 0.9652777747674421\n", + "Epoch: 11, iter: 1037, loss: 0.26249059456497875, acc: 0.965174126091288\n", + "Epoch: 11, iter: 1038, loss: 0.26406090224490447, acc: 0.9632352906114915\n", + "Epoch: 11, iter: 1039, loss: 0.26355557683585346, acc: 0.9637681124866873\n", + "Epoch: 11, iter: 1040, loss: 0.2631081649235317, acc: 0.9642857108797346\n", + "Epoch: 11, iter: 1041, loss: 0.2637717379650599, acc: 0.9630281656560763\n", + "Epoch: 11, iter: 1042, loss: 0.2631433842082818, acc: 0.9635416633552976\n", + "Epoch: 11, iter: 1043, loss: 0.26334747141354703, acc: 0.9634703160965279\n", + "Epoch: 11, iter: 1044, loss: 0.26653428657634837, acc: 0.9622747712844127\n", + "Epoch: 11, iter: 1045, loss: 0.26671735366185506, acc: 0.9627777743339538\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 11, iter: 1046, loss: 0.26685215689634023, acc: 0.9627192945856797\n", + "Epoch: 11, iter: 1047, loss: 0.26627725943342434, acc: 0.9632034595910605\n", + "Epoch: 11, iter: 1048, loss: 0.2655102060391353, acc: 0.9636752101091238\n", + "Epoch: 11, iter: 1049, loss: 0.2652007224439066, acc: 0.964135017576097\n", + "Epoch: 11, iter: 1050, loss: 0.26651288419961927, acc: 0.9635416634380818\n", + "Epoch: 11, iter: 1051, loss: 0.2659789603433491, acc: 0.9639917663585993\n", + "Epoch: 11, iter: 1052, loss: 0.26530090846666476, acc: 0.9644308911591042\n", + "Epoch: 11, iter: 1053, loss: 0.2651856218475893, acc: 0.9643574263676103\n", + "Epoch: 11, iter: 1054, loss: 0.2658936892236982, acc: 0.9632936474822816\n", + "Epoch: 11, iter: 1055, loss: 0.26545878140365375, acc: 0.9627450950005475\n", + "Epoch: 11, iter: 1056, loss: 0.26583576462296554, acc: 0.9626937952152518\n", + "Epoch: 11, iter: 1057, loss: 0.2658405202901226, acc: 0.9626436747353653\n", + "Epoch: 11, iter: 1058, loss: 0.26534069617363537, acc: 0.9630681784315542\n", + "Epoch: 11, iter: 1059, loss: 0.26445332403933064, acc: 0.9634831427188402\n", + "Epoch: 11, iter: 1060, loss: 0.26453181405862175, acc: 0.9634259223937989\n", + "Epoch: 11, iter: 1061, loss: 0.26413824663057434, acc: 0.9638278353345263\n", + "Epoch: 11, iter: 1062, loss: 0.2639456588936889, acc: 0.9637681122707284\n", + "Epoch: 11, iter: 1063, loss: 0.26520139587822783, acc: 0.9623655875523885\n", + "Epoch: 11, iter: 1064, loss: 0.26517142735897226, acc: 0.9623226910195453\n", + "Epoch: 11, iter: 1065, loss: 0.26526433700009394, acc: 0.961842101498654\n", + "Epoch: 11, iter: 1066, loss: 0.26437771568695706, acc: 0.9622395796080431\n", + "Epoch: 11, iter: 1067, loss: 0.26637387029903453, acc: 0.960754447991086\n", + "Epoch: 12, iter: 1068, loss: 0.2653837502002716, acc: 0.9583333134651184\n", + "Epoch: 12, iter: 1069, loss: 0.26803620159626007, acc: 0.9583333134651184\n", + "Epoch: 12, iter: 1070, loss: 0.24521909157435098, acc: 0.9722222089767456\n", + "Epoch: 12, iter: 1071, loss: 0.22976727038621902, acc: 0.9791666567325592\n", + "Epoch: 12, iter: 1072, loss: 0.23798849582672119, acc: 0.9749999880790711\n", + "Epoch: 12, iter: 1073, loss: 0.23180504143238068, acc: 0.9791666567325592\n", + "Epoch: 12, iter: 1074, loss: 0.2531686808381762, acc: 0.9761904648372105\n", + "Epoch: 12, iter: 1075, loss: 0.2445327378809452, acc: 0.9791666567325592\n", + "Epoch: 12, iter: 1076, loss: 0.24835975302590263, acc: 0.972222215599484\n", + "Epoch: 12, iter: 1077, loss: 0.24406242668628692, acc: 0.9749999940395355\n", + "Epoch: 12, iter: 1078, loss: 0.2487283484502272, acc: 0.969696966084567\n", + "Epoch: 12, iter: 1079, loss: 0.2491502488652865, acc: 0.9652777761220932\n", + "Epoch: 12, iter: 1080, loss: 0.24742789108019608, acc: 0.9679487164203937\n", + "Epoch: 12, iter: 1081, loss: 0.25363835373095106, acc: 0.9613095223903656\n", + "Epoch: 12, iter: 1082, loss: 0.2508881737788518, acc: 0.9638888875643412\n", + "Epoch: 12, iter: 1083, loss: 0.2531522111967206, acc: 0.9661458320915699\n", + "Epoch: 12, iter: 1084, loss: 0.2511420153519687, acc: 0.9681372537332422\n", + "Epoch: 12, iter: 1085, loss: 0.2501676107446353, acc: 0.9675925903850131\n", + "Epoch: 12, iter: 1086, loss: 0.246222743078282, acc: 0.969298243522644\n", + "Epoch: 12, iter: 1087, loss: 0.24406916424632072, acc: 0.9708333313465118\n", + "Epoch: 12, iter: 1088, loss: 0.241766889890035, acc: 0.9722222203300113\n", + "Epoch: 12, iter: 1089, loss: 0.24051803350448608, acc: 0.9734848466786471\n", + "Epoch: 12, iter: 1090, loss: 0.24177424285722815, acc: 0.9728260843650155\n", + "Epoch: 12, iter: 1091, loss: 0.24199464544653893, acc: 0.9739583308498064\n", + "Epoch: 12, iter: 1092, loss: 0.24230849266052246, acc: 0.9733333301544189\n", + "Epoch: 12, iter: 1093, loss: 0.24069918176302543, acc: 0.974358971302326\n", + "Epoch: 12, iter: 1094, loss: 0.23920851007655816, acc: 0.9753086390318694\n", + "Epoch: 12, iter: 1095, loss: 0.23847109558326857, acc: 0.9761904733521598\n", + "Epoch: 12, iter: 1096, loss: 0.23870569724461127, acc: 0.9755747092181238\n", + "Epoch: 12, iter: 1097, loss: 0.24078702876965205, acc: 0.974999996026357\n", + "Epoch: 12, iter: 1098, loss: 0.24083478075842704, acc: 0.9744623611050267\n", + "Epoch: 12, iter: 1099, loss: 0.2383026285097003, acc: 0.9752604123204947\n", + "Epoch: 12, iter: 1100, loss: 0.2377248830867536, acc: 0.9760100967956312\n", + "Epoch: 12, iter: 1101, loss: 0.2372585333445493, acc: 0.976715682183995\n", + "Epoch: 12, iter: 1102, loss: 0.23707443731171743, acc: 0.9773809484073094\n", + "Epoch: 12, iter: 1103, loss: 0.2385160658094618, acc: 0.9756944411330752\n", + "Epoch: 12, iter: 1104, loss: 0.23736186245003263, acc: 0.9763513481294787\n", + "Epoch: 12, iter: 1105, loss: 0.23910830562051974, acc: 0.9747806991401472\n", + "Epoch: 12, iter: 1106, loss: 0.2386447859880252, acc: 0.974358971302326\n", + "Epoch: 12, iter: 1107, loss: 0.23800707645714284, acc: 0.9749999970197678\n", + "Epoch: 12, iter: 1108, loss: 0.23773815028551148, acc: 0.9756097531900173\n", + "Epoch: 12, iter: 1109, loss: 0.23749730452185586, acc: 0.9761904733521598\n", + "Epoch: 12, iter: 1110, loss: 0.2371495113123295, acc: 0.9767441832742025\n", + "Epoch: 12, iter: 1111, loss: 0.23634840852834962, acc: 0.9772727245634253\n", + "Epoch: 12, iter: 1112, loss: 0.2350917634036806, acc: 0.9777777751286825\n", + "Epoch: 12, iter: 1113, loss: 0.23652469496364179, acc: 0.9773550694403441\n", + "Epoch: 12, iter: 1114, loss: 0.23556202681774788, acc: 0.9778368764735282\n", + "Epoch: 12, iter: 1115, loss: 0.23433892211566368, acc: 0.9782986082136631\n", + "Epoch: 12, iter: 1116, loss: 0.23481207751497932, acc: 0.9778911532187948\n", + "Epoch: 12, iter: 1117, loss: 0.23428795486688614, acc: 0.9783333301544189\n", + "Epoch: 12, iter: 1118, loss: 0.234627990453851, acc: 0.9771241802795261\n", + "Epoch: 12, iter: 1119, loss: 0.23520534571546775, acc: 0.9767628174561721\n", + "Epoch: 12, iter: 1120, loss: 0.23531413106423504, acc: 0.9756289281935062\n", + "Epoch: 12, iter: 1121, loss: 0.2360376630116392, acc: 0.976080244338071\n", + "Epoch: 12, iter: 1122, loss: 0.23668928769501774, acc: 0.9749999978325584\n", + "Epoch: 12, iter: 1123, loss: 0.23775042886180536, acc: 0.9747023784688541\n", + "Epoch: 12, iter: 1124, loss: 0.23645436920617757, acc: 0.9751461963904532\n", + "Epoch: 12, iter: 1125, loss: 0.23588828023137717, acc: 0.9755747102457901\n", + "Epoch: 12, iter: 1126, loss: 0.23599323024184016, acc: 0.9759886982077259\n", + "Epoch: 12, iter: 1127, loss: 0.23656937231620154, acc: 0.9756944417953491\n", + "Epoch: 12, iter: 1128, loss: 0.235539936628498, acc: 0.9760928935691958\n", + "Epoch: 12, iter: 1129, loss: 0.23547585308551788, acc: 0.9764784920600152\n", + "Epoch: 12, iter: 1130, loss: 0.23501522815416728, acc: 0.9768518493289039\n", + "Epoch: 12, iter: 1131, loss: 0.23452390171587467, acc: 0.9772135391831398\n", + "Epoch: 12, iter: 1132, loss: 0.23388332311923687, acc: 0.9775641001187838\n", + "Epoch: 12, iter: 1133, loss: 0.23443492434241556, acc: 0.9772727245634253\n", + "Epoch: 12, iter: 1134, loss: 0.23367393239220577, acc: 0.9776119376296428\n", + "Epoch: 12, iter: 1135, loss: 0.23355983526391141, acc: 0.9779411738409716\n", + "Epoch: 12, iter: 1136, loss: 0.23297026602254398, acc: 0.9782608669737111\n", + "Epoch: 12, iter: 1137, loss: 0.23230869940349033, acc: 0.9785714260169438\n", + "Epoch: 12, iter: 1138, loss: 0.23357976532318223, acc: 0.9776995282777599\n", + "Epoch: 12, iter: 1139, loss: 0.23371785216861302, acc: 0.9780092570516798\n", + "Epoch: 12, iter: 1140, loss: 0.23328664449796285, acc: 0.9783105001057664\n", + "Epoch: 12, iter: 1141, loss: 0.23315582766726212, acc: 0.978040538124136\n", + "Epoch: 12, iter: 1142, loss: 0.23449967662493387, acc: 0.9777777751286825\n", + "Epoch: 12, iter: 1143, loss: 0.23405286924619423, acc: 0.9780701728243577\n", + "Epoch: 12, iter: 1144, loss: 0.23522877402893907, acc: 0.9767315991513141\n", + "Epoch: 12, iter: 1145, loss: 0.2349084980594806, acc: 0.9770299119827075\n", + "Epoch: 12, iter: 1146, loss: 0.2348864714178858, acc: 0.9762658205213426\n", + "Epoch: 12, iter: 1147, loss: 0.2343926504254341, acc: 0.9765624977648258\n", + "Epoch: 12, iter: 1148, loss: 0.23379659983846876, acc: 0.9768518496442724\n", + "Epoch: 12, iter: 1149, loss: 0.23337872544439828, acc: 0.9771341441608057\n", + "Epoch: 12, iter: 1150, loss: 0.23337335112583207, acc: 0.9769076281283275\n", + "Epoch: 12, iter: 1151, loss: 0.23292802487100875, acc: 0.977182537317276\n", + "Epoch: 12, iter: 1152, loss: 0.23365851395270404, acc: 0.9764705861316008\n", + "Epoch: 12, iter: 1153, loss: 0.23282409701929535, acc: 0.9767441839672798\n", + "Epoch: 12, iter: 1154, loss: 0.23246016276293788, acc: 0.977011492197541\n", + "Epoch: 12, iter: 1155, loss: 0.2322363741695881, acc: 0.9767992401664908\n", + "Epoch: 12, iter: 1156, loss: 0.23345371812916874, acc: 0.9765917578440034\n", + "Epoch: 12, iter: 1157, loss: 0.23269136365916993, acc: 0.9768518494235144\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 12, iter: 1158, loss: 0.2330654026060314, acc: 0.9766483490283673\n", + "Epoch: 12, iter: 1159, loss: 0.2328064501609491, acc: 0.9764492725548537\n", + "Epoch: 12, iter: 1160, loss: 0.23284223787887123, acc: 0.9767025061832961\n", + "Epoch: 12, iter: 1161, loss: 0.232917032818845, acc: 0.9765070892394857\n", + "Epoch: 12, iter: 1162, loss: 0.23316680459599745, acc: 0.9767543830369648\n", + "Epoch: 12, iter: 1163, loss: 0.23276830169682702, acc: 0.9769965248803297\n", + "Epoch: 12, iter: 1164, loss: 0.23310042733384162, acc: 0.9762964672649029\n", + "Epoch: 13, iter: 1165, loss: 0.2133173942565918, acc: 1.0\n", + "Epoch: 13, iter: 1166, loss: 0.24824121594429016, acc: 0.9791666567325592\n", + "Epoch: 13, iter: 1167, loss: 0.2614864110946655, acc: 0.9722222089767456\n", + "Epoch: 13, iter: 1168, loss: 0.2705765664577484, acc: 0.9687499850988388\n", + "Epoch: 13, iter: 1169, loss: 0.27337695360183717, acc: 0.9666666507720947\n", + "Epoch: 13, iter: 1170, loss: 0.2710868219534556, acc: 0.965277761220932\n", + "Epoch: 13, iter: 1171, loss: 0.264158947127206, acc: 0.9702380810465131\n", + "Epoch: 13, iter: 1172, loss: 0.26146675273776054, acc: 0.9687499850988388\n", + "Epoch: 13, iter: 1173, loss: 0.26028693715731305, acc: 0.9722222089767456\n", + "Epoch: 13, iter: 1174, loss: 0.2555639028549194, acc: 0.9749999880790711\n", + "Epoch: 13, iter: 1175, loss: 0.24763014777140183, acc: 0.9772727164355192\n", + "Epoch: 13, iter: 1176, loss: 0.24534688765803972, acc: 0.9791666567325592\n", + "Epoch: 13, iter: 1177, loss: 0.24992419091554788, acc: 0.9743589667173532\n", + "Epoch: 13, iter: 1178, loss: 0.25279891810246874, acc: 0.9732142771993365\n", + "Epoch: 13, iter: 1179, loss: 0.25274639825026196, acc: 0.9722222129503886\n", + "Epoch: 13, iter: 1180, loss: 0.25192037876695395, acc: 0.9713541567325592\n", + "Epoch: 13, iter: 1181, loss: 0.24853753955925212, acc: 0.9730392063365263\n", + "Epoch: 13, iter: 1182, loss: 0.24549951238764656, acc: 0.9745370282067193\n", + "Epoch: 13, iter: 1183, loss: 0.24668311523763756, acc: 0.973684201115056\n", + "Epoch: 13, iter: 1184, loss: 0.2494904063642025, acc: 0.9687499910593033\n", + "Epoch: 13, iter: 1185, loss: 0.2459327174084527, acc: 0.9702380867231459\n", + "Epoch: 13, iter: 1186, loss: 0.2432111921635541, acc: 0.9715909009630029\n", + "Epoch: 13, iter: 1187, loss: 0.2430174331302228, acc: 0.9710144841152689\n", + "Epoch: 13, iter: 1188, loss: 0.24331572962303957, acc: 0.9687499925494194\n", + "Epoch: 13, iter: 1189, loss: 0.24073207914829253, acc: 0.9699999928474426\n", + "Epoch: 13, iter: 1190, loss: 0.23805092217830512, acc: 0.9711538392763871\n", + "Epoch: 13, iter: 1191, loss: 0.23653519043215998, acc: 0.972222215599484\n", + "Epoch: 13, iter: 1192, loss: 0.23801516741514206, acc: 0.9702380895614624\n", + "Epoch: 13, iter: 1193, loss: 0.23644061232435293, acc: 0.9712643623352051\n", + "Epoch: 13, iter: 1194, loss: 0.23637041250864665, acc: 0.9722222169240315\n", + "Epoch: 13, iter: 1195, loss: 0.23606771615243727, acc: 0.9717741877801956\n", + "Epoch: 13, iter: 1196, loss: 0.23475022614002228, acc: 0.9726562444120646\n", + "Epoch: 13, iter: 1197, loss: 0.23645377791289127, acc: 0.972222216201551\n", + "Epoch: 13, iter: 1198, loss: 0.23594998655950322, acc: 0.9730392098426819\n", + "Epoch: 13, iter: 1199, loss: 0.23463557916028158, acc: 0.973809518132891\n", + "Epoch: 13, iter: 1200, loss: 0.2333958860900667, acc: 0.9745370315180885\n", + "Epoch: 13, iter: 1201, loss: 0.23333163680257024, acc: 0.9740990931923325\n", + "Epoch: 13, iter: 1202, loss: 0.23313651586833753, acc: 0.9736842042521426\n", + "Epoch: 13, iter: 1203, loss: 0.23369184136390686, acc: 0.9743589682456775\n", + "Epoch: 13, iter: 1204, loss: 0.23644472733139993, acc: 0.9729166612029075\n", + "Epoch: 13, iter: 1205, loss: 0.23509388435177686, acc: 0.9735772304418611\n", + "Epoch: 13, iter: 1206, loss: 0.2344614238966079, acc: 0.9742063440027691\n", + "Epoch: 13, iter: 1207, loss: 0.23356969689213952, acc: 0.974806196467821\n", + "Epoch: 13, iter: 1208, loss: 0.2325801947577433, acc: 0.9753787829117342\n", + "Epoch: 13, iter: 1209, loss: 0.23269737561543782, acc: 0.9749999947018093\n", + "Epoch: 13, iter: 1210, loss: 0.2316877200551655, acc: 0.9755434730778569\n", + "Epoch: 13, iter: 1211, loss: 0.23234377389258526, acc: 0.9742907754918362\n", + "Epoch: 13, iter: 1212, loss: 0.2333912489314874, acc: 0.9730902736385664\n", + "Epoch: 13, iter: 1213, loss: 0.2334879004225439, acc: 0.9727891111860469\n", + "Epoch: 13, iter: 1214, loss: 0.23290500462055205, acc: 0.973333328962326\n", + "Epoch: 13, iter: 1215, loss: 0.23229684724527247, acc: 0.9738562048650256\n", + "Epoch: 13, iter: 1216, loss: 0.23108748403879312, acc: 0.9743589701560827\n", + "Epoch: 13, iter: 1217, loss: 0.23088224429004597, acc: 0.9740565992751211\n", + "Epoch: 13, iter: 1218, loss: 0.23019610234984644, acc: 0.9745370326218782\n", + "Epoch: 13, iter: 1219, loss: 0.22956630099903452, acc: 0.9749999956651167\n", + "Epoch: 13, iter: 1220, loss: 0.22865529358386993, acc: 0.9754464243139539\n", + "Epoch: 13, iter: 1221, loss: 0.2294246418434277, acc: 0.9751461942990621\n", + "Epoch: 13, iter: 1222, loss: 0.23032959268010897, acc: 0.9748563170433044\n", + "Epoch: 13, iter: 1223, loss: 0.2327257920119722, acc: 0.9738700521194329\n", + "Epoch: 13, iter: 1224, loss: 0.23239457781116168, acc: 0.9729166626930237\n", + "Epoch: 13, iter: 1225, loss: 0.23150227304364815, acc: 0.9733606518292036\n", + "Epoch: 13, iter: 1226, loss: 0.23109169905224153, acc: 0.9737903187351842\n", + "Epoch: 13, iter: 1227, loss: 0.23047752489173223, acc: 0.9742063454219273\n", + "Epoch: 13, iter: 1228, loss: 0.23017336684279144, acc: 0.9739583292976022\n", + "Epoch: 13, iter: 1229, loss: 0.22936515601781698, acc: 0.9743589703853314\n", + "Epoch: 13, iter: 1230, loss: 0.22947652412183356, acc: 0.9741161574016918\n", + "Epoch: 13, iter: 1231, loss: 0.22886772342582248, acc: 0.9745024834106217\n", + "Epoch: 13, iter: 1232, loss: 0.22767605150447173, acc: 0.9748774468898773\n", + "Epoch: 13, iter: 1233, loss: 0.22769156595071158, acc: 0.9752415418624878\n", + "Epoch: 13, iter: 1234, loss: 0.22797679283789227, acc: 0.9744047582149505\n", + "Epoch: 13, iter: 1235, loss: 0.22818301282298398, acc: 0.9741783998381923\n", + "Epoch: 13, iter: 1236, loss: 0.2286669100738234, acc: 0.9739583291941218\n", + "Epoch: 13, iter: 1237, loss: 0.22835895153757643, acc: 0.9743150644106408\n", + "Epoch: 13, iter: 1238, loss: 0.22767257630019574, acc: 0.9746621581348213\n", + "Epoch: 13, iter: 1239, loss: 0.227192791501681, acc: 0.974999996026357\n", + "Epoch: 13, iter: 1240, loss: 0.22656614235357234, acc: 0.9753289434470629\n", + "Epoch: 13, iter: 1241, loss: 0.2262291863754198, acc: 0.9756493467789191\n", + "Epoch: 13, iter: 1242, loss: 0.22685796805681327, acc: 0.9748931588270725\n", + "Epoch: 13, iter: 1243, loss: 0.22751728435860405, acc: 0.9746835405313516\n", + "Epoch: 13, iter: 1244, loss: 0.22740758378058673, acc: 0.9744791626930237\n", + "Epoch: 13, iter: 1245, loss: 0.22725235955950654, acc: 0.9747942347585419\n", + "Epoch: 13, iter: 1246, loss: 0.22682755113374897, acc: 0.9751016221395353\n", + "Epoch: 13, iter: 1247, loss: 0.22626377013792476, acc: 0.9754016025956854\n", + "Epoch: 13, iter: 1248, loss: 0.2262729402808916, acc: 0.9751984086774644\n", + "Epoch: 13, iter: 1249, loss: 0.22595574925927556, acc: 0.9749999957926133\n", + "Epoch: 13, iter: 1250, loss: 0.22536920115005138, acc: 0.975290693515955\n", + "Epoch: 13, iter: 1251, loss: 0.22529384904894337, acc: 0.975574708533013\n", + "Epoch: 13, iter: 1252, loss: 0.22469722073186527, acc: 0.9758522686633196\n", + "Epoch: 13, iter: 1253, loss: 0.22430952747216384, acc: 0.9761235914873273\n", + "Epoch: 13, iter: 1254, loss: 0.22493685682614645, acc: 0.975462959210078\n", + "Epoch: 13, iter: 1255, loss: 0.2252934611105657, acc: 0.9752747213447487\n", + "Epoch: 13, iter: 1256, loss: 0.224715914901184, acc: 0.9755434743736101\n", + "Epoch: 13, iter: 1257, loss: 0.22451010041980332, acc: 0.9758064477674423\n", + "Epoch: 13, iter: 1258, loss: 0.22419074986209261, acc: 0.9756205633599707\n", + "Epoch: 13, iter: 1259, loss: 0.22402168904480182, acc: 0.9758771890088132\n", + "Epoch: 13, iter: 1260, loss: 0.22364760764564076, acc: 0.9761284682899714\n", + "Epoch: 13, iter: 1261, loss: 0.22346257287816904, acc: 0.9763745665550232\n", + "Epoch: 14, iter: 1262, loss: 0.1791946440935135, acc: 1.0\n", + "Epoch: 14, iter: 1263, loss: 0.20562855154275894, acc: 1.0\n", + "Epoch: 14, iter: 1264, loss: 0.19268798331419626, acc: 1.0\n", + "Epoch: 14, iter: 1265, loss: 0.18952619656920433, acc: 0.9895833283662796\n", + "Epoch: 14, iter: 1266, loss: 0.2044092148542404, acc: 0.9833333253860473\n", + "Epoch: 14, iter: 1267, loss: 0.19707166403532028, acc: 0.9861111044883728\n", + "Epoch: 14, iter: 1268, loss: 0.19119497495038168, acc: 0.9880952324186053\n", + "Epoch: 14, iter: 1269, loss: 0.2119977381080389, acc: 0.9791666641831398\n", + "Epoch: 14, iter: 1270, loss: 0.20896166563034058, acc: 0.9814814792739021\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 14, iter: 1271, loss: 0.2062214970588684, acc: 0.9791666626930237\n", + "Epoch: 14, iter: 1272, loss: 0.20512438091364774, acc: 0.9772727218541232\n", + "Epoch: 14, iter: 1273, loss: 0.20553229997555414, acc: 0.979166661699613\n", + "Epoch: 14, iter: 1274, loss: 0.22205891746741074, acc: 0.974358971302326\n", + "Epoch: 14, iter: 1275, loss: 0.22326670374189103, acc: 0.970238093818937\n", + "Epoch: 14, iter: 1276, loss: 0.2202989826599757, acc: 0.9722222208976745\n", + "Epoch: 14, iter: 1277, loss: 0.22059480007737875, acc: 0.9713541641831398\n", + "Epoch: 14, iter: 1278, loss: 0.2223887101692312, acc: 0.970588231787962\n", + "Epoch: 14, iter: 1279, loss: 0.22033064398500654, acc: 0.972222218910853\n", + "Epoch: 14, iter: 1280, loss: 0.2230422041918102, acc: 0.9714912238873934\n", + "Epoch: 14, iter: 1281, loss: 0.22055736631155015, acc: 0.9729166626930237\n", + "Epoch: 14, iter: 1282, loss: 0.22015988259088426, acc: 0.9722222174916949\n", + "Epoch: 14, iter: 1283, loss: 0.21908151561563666, acc: 0.9734848439693451\n", + "Epoch: 14, iter: 1284, loss: 0.2166061142216558, acc: 0.9746376768402432\n", + "Epoch: 14, iter: 1285, loss: 0.21563302787641683, acc: 0.9739583283662796\n", + "Epoch: 14, iter: 1286, loss: 0.21605151057243346, acc: 0.9733333277702332\n", + "Epoch: 14, iter: 1287, loss: 0.21473715683588615, acc: 0.9743589690098395\n", + "Epoch: 14, iter: 1288, loss: 0.2144254837875013, acc: 0.9753086368242899\n", + "Epoch: 14, iter: 1289, loss: 0.21410483281527246, acc: 0.9761904712234225\n", + "Epoch: 14, iter: 1290, loss: 0.2127174298311102, acc: 0.9770114894570976\n", + "Epoch: 14, iter: 1291, loss: 0.2108942225575447, acc: 0.977777773141861\n", + "Epoch: 14, iter: 1292, loss: 0.20921653028457396, acc: 0.9784946191695428\n", + "Epoch: 14, iter: 1293, loss: 0.21161767654120922, acc: 0.9778645783662796\n", + "Epoch: 14, iter: 1294, loss: 0.21048769174200116, acc: 0.9785353487188165\n", + "Epoch: 14, iter: 1295, loss: 0.20865705346359925, acc: 0.9791666619917926\n", + "Epoch: 14, iter: 1296, loss: 0.21060045446668352, acc: 0.9785714234624591\n", + "Epoch: 14, iter: 1297, loss: 0.20993675374322468, acc: 0.979166661699613\n", + "Epoch: 14, iter: 1298, loss: 0.20898007581362854, acc: 0.9797297248969207\n", + "Epoch: 14, iter: 1299, loss: 0.20945190716730921, acc: 0.980263153189107\n", + "Epoch: 14, iter: 1300, loss: 0.21067478526861239, acc: 0.9797008496064407\n", + "Epoch: 14, iter: 1301, loss: 0.21013128943741322, acc: 0.9802083283662796\n", + "Epoch: 14, iter: 1302, loss: 0.21054278168736434, acc: 0.9796747914174708\n", + "Epoch: 14, iter: 1303, loss: 0.21198465391283944, acc: 0.9771825344789595\n", + "Epoch: 14, iter: 1304, loss: 0.210684169517007, acc: 0.977713173212007\n", + "Epoch: 14, iter: 1305, loss: 0.21242423050782896, acc: 0.9753787829117342\n", + "Epoch: 14, iter: 1306, loss: 0.21206107040246328, acc: 0.9759259210692511\n", + "Epoch: 14, iter: 1307, loss: 0.21157576985981152, acc: 0.976449270611224\n", + "Epoch: 14, iter: 1308, loss: 0.2121531348279182, acc: 0.9760638247144983\n", + "Epoch: 14, iter: 1309, loss: 0.21140346520890793, acc: 0.9765624950329462\n", + "Epoch: 14, iter: 1310, loss: 0.21153981740377387, acc: 0.9770408114608453\n", + "Epoch: 14, iter: 1311, loss: 0.21105726003646852, acc: 0.9774999952316284\n", + "Epoch: 14, iter: 1312, loss: 0.20967571700320525, acc: 0.9779411717957142\n", + "Epoch: 14, iter: 1313, loss: 0.2107098360474293, acc: 0.9775640975970489\n", + "Epoch: 14, iter: 1314, loss: 0.21044847931502, acc: 0.9779874165103121\n", + "Epoch: 14, iter: 1315, loss: 0.21097844507959154, acc: 0.9783950569453063\n", + "Epoch: 14, iter: 1316, loss: 0.21016364774920723, acc: 0.9787878740917553\n", + "Epoch: 14, iter: 1317, loss: 0.20940735962774074, acc: 0.9791666620544025\n", + "Epoch: 14, iter: 1318, loss: 0.2113039412519388, acc: 0.9788011647107309\n", + "Epoch: 14, iter: 1319, loss: 0.21049314403328404, acc: 0.9791666618708906\n", + "Epoch: 14, iter: 1320, loss: 0.2096192735736653, acc: 0.9795197692968077\n", + "Epoch: 14, iter: 1321, loss: 0.20873242219289143, acc: 0.9798611064751943\n", + "Epoch: 14, iter: 1322, loss: 0.20810190087459127, acc: 0.9801912522706829\n", + "Epoch: 14, iter: 1323, loss: 0.2078767212167863, acc: 0.980510748201801\n", + "Epoch: 14, iter: 1324, loss: 0.20782866695570568, acc: 0.9808201014049469\n", + "Epoch: 14, iter: 1325, loss: 0.2076514910440892, acc: 0.9811197873204947\n", + "Epoch: 14, iter: 1326, loss: 0.2074613406107976, acc: 0.9814102521309486\n", + "Epoch: 14, iter: 1327, loss: 0.20909396762197668, acc: 0.9804292890158567\n", + "Epoch: 14, iter: 1328, loss: 0.2091626791811701, acc: 0.9800994983359949\n", + "Epoch: 14, iter: 1329, loss: 0.20959771117743323, acc: 0.9797794073820114\n", + "Epoch: 14, iter: 1330, loss: 0.20870844911837924, acc: 0.9800724594489388\n", + "Epoch: 14, iter: 1331, loss: 0.20805220433643887, acc: 0.9803571385996682\n", + "Epoch: 14, iter: 1332, loss: 0.20760608328060365, acc: 0.9806337986193913\n", + "Epoch: 14, iter: 1333, loss: 0.20684992480609152, acc: 0.9809027736385664\n", + "Epoch: 14, iter: 1334, loss: 0.20609965797973007, acc: 0.9811643794791339\n", + "Epoch: 14, iter: 1335, loss: 0.20534532919928833, acc: 0.9814189148915781\n", + "Epoch: 14, iter: 1336, loss: 0.2060685835282008, acc: 0.9811111068725586\n", + "Epoch: 14, iter: 1337, loss: 0.20555654187735758, acc: 0.9813596449400249\n", + "Epoch: 14, iter: 1338, loss: 0.20538455731682964, acc: 0.9816017274732713\n", + "Epoch: 14, iter: 1339, loss: 0.20540446558823952, acc: 0.9818376027620755\n", + "Epoch: 14, iter: 1340, loss: 0.2055177830065353, acc: 0.981540080112747\n", + "Epoch: 14, iter: 1341, loss: 0.20756121631711721, acc: 0.9796874955296516\n", + "Epoch: 14, iter: 1342, loss: 0.2074456967321443, acc: 0.9799382671897794\n", + "Epoch: 14, iter: 1343, loss: 0.20729547411930271, acc: 0.9801829224679528\n", + "Epoch: 14, iter: 1344, loss: 0.20758879310395345, acc: 0.9799196741667139\n", + "Epoch: 14, iter: 1345, loss: 0.2072496497560115, acc: 0.9801587256647292\n", + "Epoch: 14, iter: 1346, loss: 0.20689435759011437, acc: 0.9803921524216147\n", + "Epoch: 14, iter: 1347, loss: 0.20681810812201612, acc: 0.9806201506492703\n", + "Epoch: 14, iter: 1348, loss: 0.2064006436487724, acc: 0.9808429075383592\n", + "Epoch: 14, iter: 1349, loss: 0.2065820177509026, acc: 0.9805871166966178\n", + "Epoch: 14, iter: 1350, loss: 0.20656190444244427, acc: 0.9803370739636796\n", + "Epoch: 14, iter: 1351, loss: 0.20604500273863474, acc: 0.9805555509196388\n", + "Epoch: 14, iter: 1352, loss: 0.2060902803153782, acc: 0.9807692261842581\n", + "Epoch: 14, iter: 1353, loss: 0.20556373197747313, acc: 0.9809782563344293\n", + "Epoch: 14, iter: 1354, loss: 0.2051941345455826, acc: 0.9811827912125536\n", + "Epoch: 14, iter: 1355, loss: 0.20451838982866166, acc: 0.9813829742847605\n", + "Epoch: 14, iter: 1356, loss: 0.20445457994937896, acc: 0.9815789429764998\n", + "Epoch: 14, iter: 1357, loss: 0.20417248193795481, acc: 0.9813368010024229\n", + "Epoch: 14, iter: 1358, loss: 0.2039968369855094, acc: 0.9815292051158\n", + "Epoch: 15, iter: 1359, loss: 0.34811121225357056, acc: 0.875\n", + "Epoch: 15, iter: 1360, loss: 0.2700677514076233, acc: 0.9375\n", + "Epoch: 15, iter: 1361, loss: 0.25208871563275653, acc: 0.9444444378217062\n", + "Epoch: 15, iter: 1362, loss: 0.25302591174840927, acc: 0.9375\n", + "Epoch: 15, iter: 1363, loss: 0.23764416575431824, acc: 0.95\n", + "Epoch: 15, iter: 1364, loss: 0.22493368883927664, acc: 0.9583333333333334\n", + "Epoch: 15, iter: 1365, loss: 0.28538346716335844, acc: 0.9404761876378741\n", + "Epoch: 15, iter: 1366, loss: 0.2685461975634098, acc: 0.9479166641831398\n", + "Epoch: 15, iter: 1367, loss: 0.2620007362630632, acc: 0.9490740696589152\n", + "Epoch: 15, iter: 1368, loss: 0.2663570582866669, acc: 0.9333333313465119\n", + "Epoch: 15, iter: 1369, loss: 0.27110113338990643, acc: 0.9318181818181818\n", + "Epoch: 15, iter: 1370, loss: 0.26464009036620456, acc: 0.9375\n", + "Epoch: 15, iter: 1371, loss: 0.256344206058062, acc: 0.9423076923076923\n", + "Epoch: 15, iter: 1372, loss: 0.2495868823357991, acc: 0.9464285714285714\n", + "Epoch: 15, iter: 1373, loss: 0.24410340785980225, acc: 0.95\n", + "Epoch: 15, iter: 1374, loss: 0.24066134169697762, acc: 0.953125\n", + "Epoch: 15, iter: 1375, loss: 0.23866377595592947, acc: 0.9558823529411765\n", + "Epoch: 15, iter: 1376, loss: 0.23548544860548443, acc: 0.9583333333333334\n", + "Epoch: 15, iter: 1377, loss: 0.23241129909691058, acc: 0.9605263157894737\n", + "Epoch: 15, iter: 1378, loss: 0.23141995668411255, acc: 0.9625\n", + "Epoch: 15, iter: 1379, loss: 0.2296389483270191, acc: 0.9642857142857143\n", + "Epoch: 15, iter: 1380, loss: 0.226105005226352, acc: 0.9659090909090909\n", + "Epoch: 15, iter: 1381, loss: 0.22641959462476813, acc: 0.9655797092810922\n", + "Epoch: 15, iter: 1382, loss: 0.22487761142353216, acc: 0.9670138880610466\n", + "Epoch: 15, iter: 1383, loss: 0.22451107919216157, acc: 0.9666666650772094\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch: 15, iter: 1384, loss: 0.22294219296712142, acc: 0.9679487164203937\n", + "Epoch: 15, iter: 1385, loss: 0.22182499368985495, acc: 0.9691358009974161\n", + "Epoch: 15, iter: 1386, loss: 0.2207776414496558, acc: 0.970238093818937\n", + "Epoch: 15, iter: 1387, loss: 0.2188083565440671, acc: 0.9712643664458702\n", + "Epoch: 15, iter: 1388, loss: 0.22127770831187565, acc: 0.9694444437821707\n", + "Epoch: 15, iter: 1389, loss: 0.22189692191539273, acc: 0.969086020223556\n", + "Epoch: 15, iter: 1390, loss: 0.22100322553887963, acc: 0.9687499981373549\n", + "Epoch: 15, iter: 1391, loss: 0.22181839337854675, acc: 0.9696969678907683\n", + "Epoch: 15, iter: 1392, loss: 0.21993669473073063, acc: 0.9705882335410398\n", + "Epoch: 15, iter: 1393, loss: 0.21887088247707912, acc: 0.9714285697255816\n", + "Epoch: 15, iter: 1394, loss: 0.22006966256433064, acc: 0.9710648126072354\n", + "Epoch: 15, iter: 1395, loss: 0.21896897941022306, acc: 0.9718468446989317\n", + "Epoch: 15, iter: 1396, loss: 0.2171367430373242, acc: 0.9725877172068546\n", + "Epoch: 15, iter: 1397, loss: 0.21598229308923086, acc: 0.9732905962528327\n", + "Epoch: 15, iter: 1398, loss: 0.21600236557424068, acc: 0.9729166641831398\n", + "Epoch: 15, iter: 1399, loss: 0.21568834963368205, acc: 0.9725609727022124\n", + "Epoch: 15, iter: 1400, loss: 0.21441408459629333, acc: 0.9732142828759693\n", + "Epoch: 15, iter: 1401, loss: 0.2130526505237402, acc: 0.9738372065300165\n", + "Epoch: 15, iter: 1402, loss: 0.21168781715360555, acc: 0.9744318154725161\n", + "Epoch: 15, iter: 1403, loss: 0.2108935515085856, acc: 0.9749999973509047\n", + "Epoch: 15, iter: 1404, loss: 0.21137141403944595, acc: 0.9746376781359963\n", + "Epoch: 15, iter: 1405, loss: 0.21058950620762845, acc: 0.9751773020054432\n", + "Epoch: 15, iter: 1406, loss: 0.2097740943233172, acc: 0.9756944415469965\n", + "Epoch: 15, iter: 1407, loss: 0.20955789819055673, acc: 0.9761904733521598\n", + "Epoch: 15, iter: 1408, loss: 0.20892977118492126, acc: 0.9766666638851166\n", + "Epoch: 15, iter: 1409, loss: 0.20807846854714787, acc: 0.9771241802795261\n", + "Epoch: 15, iter: 1410, loss: 0.20784146195420852, acc: 0.9767628174561721\n", + "Epoch: 15, iter: 1411, loss: 0.20725185381916333, acc: 0.9772012548626594\n", + "Epoch: 15, iter: 1412, loss: 0.20668492521400805, acc: 0.9776234538466843\n", + "Epoch: 15, iter: 1413, loss: 0.20569528964432804, acc: 0.9780303001403808\n", + "Epoch: 15, iter: 1414, loss: 0.20655981318226882, acc: 0.9761904733521598\n", + "Epoch: 15, iter: 1415, loss: 0.2066098449000141, acc: 0.9758771898453695\n", + "Epoch: 15, iter: 1416, loss: 0.20732696585614105, acc: 0.9755747092181238\n", + "Epoch: 15, iter: 1417, loss: 0.20675051692178695, acc: 0.9759886971974777\n", + "Epoch: 15, iter: 1418, loss: 0.20623745794097584, acc: 0.9763888855775197\n", + "Epoch: 15, iter: 1419, loss: 0.20597833492716805, acc: 0.9760928925920705\n", + "Epoch: 15, iter: 1420, loss: 0.20533351431931218, acc: 0.97647849109865\n", + "Epoch: 15, iter: 1421, loss: 0.2055271246603557, acc: 0.9761904724060543\n", + "Epoch: 15, iter: 1422, loss: 0.2045913627371192, acc: 0.9765624962747097\n", + "Epoch: 15, iter: 1423, loss: 0.20459847496106073, acc: 0.9762820473084083\n", + "Epoch: 15, iter: 1424, loss: 0.20363551197629987, acc: 0.9766414102279779\n", + "Epoch: 15, iter: 1425, loss: 0.204573609046082, acc: 0.9763681550524128\n", + "Epoch: 15, iter: 1426, loss: 0.20366963481201844, acc: 0.976715682183995\n", + "Epoch: 15, iter: 1427, loss: 0.20422839816065802, acc: 0.9770531360653864\n", + "Epoch: 15, iter: 1428, loss: 0.20408253350428174, acc: 0.9773809484073094\n", + "Epoch: 15, iter: 1429, loss: 0.20396229435860272, acc: 0.9771126718588279\n", + "Epoch: 15, iter: 1430, loss: 0.20771255364848507, acc: 0.975694440305233\n", + "Epoch: 15, iter: 1431, loss: 0.20715197369660418, acc: 0.9760273931777641\n", + "Epoch: 15, iter: 1432, loss: 0.20668397582060583, acc: 0.9763513473240105\n", + "Epoch: 15, iter: 1433, loss: 0.20596170047918955, acc: 0.9766666626930237\n", + "Epoch: 15, iter: 1434, loss: 0.20541764854600555, acc: 0.9769736802891681\n", + "Epoch: 15, iter: 1435, loss: 0.20491877894896965, acc: 0.9772727234022958\n", + "Epoch: 15, iter: 1436, loss: 0.20536151891335463, acc: 0.9759615346407279\n", + "Epoch: 15, iter: 1437, loss: 0.20496827797799172, acc: 0.9762658190123642\n", + "Epoch: 15, iter: 1438, loss: 0.2051920285448432, acc: 0.9755208298563958\n", + "Epoch: 15, iter: 1439, loss: 0.20635935204264558, acc: 0.974279831956934\n", + "Epoch: 15, iter: 1440, loss: 0.20571273110988664, acc: 0.9745934925428251\n", + "Epoch: 15, iter: 1441, loss: 0.205212839037539, acc: 0.9748995950423092\n", + "Epoch: 15, iter: 1442, loss: 0.20557380290258498, acc: 0.9747023774044854\n", + "Epoch: 15, iter: 1443, loss: 0.2056825413423426, acc: 0.9745098001816693\n", + "Epoch: 15, iter: 1444, loss: 0.2057358639877896, acc: 0.9743217014989187\n", + "Epoch: 15, iter: 1445, loss: 0.20614505910325323, acc: 0.9736590001774931\n", + "Epoch: 15, iter: 1446, loss: 0.20592634092000398, acc: 0.9739583297209307\n", + "Epoch: 15, iter: 1447, loss: 0.2068345511562369, acc: 0.9733146033929975\n", + "Epoch: 15, iter: 1448, loss: 0.20626442895995245, acc: 0.9736111077997419\n", + "Epoch: 15, iter: 1449, loss: 0.20645849586843135, acc: 0.9734432199499109\n", + "Epoch: 15, iter: 1450, loss: 0.20585697565389716, acc: 0.9737318806026293\n", + "Epoch: 15, iter: 1451, loss: 0.20743343714744814, acc: 0.9731182763653417\n", + "Epoch: 15, iter: 1452, loss: 0.20740535490690393, acc: 0.9734042521486891\n", + "Epoch: 15, iter: 1453, loss: 0.2069721033698634, acc: 0.9736842073892292\n", + "Epoch: 15, iter: 1454, loss: 0.20646245994915566, acc: 0.9739583302289248\n", + "Epoch: 15, iter: 1455, loss: 0.20633955422750452, acc: 0.974226801051307\n" + ] + } + ], + "source": [ + "import os\n", + "import torch\n", + "from torchvision import transforms, datasets\n", + "#from trainer.Trainer import Trainer\n", + "from torch.utils.tensorboard import SummaryWriter\n", + "from models.loss import PixWiseBCELoss\n", + "from datasets.PixWiseDataset import PixWiseDataset\n", + "from utils.utils import read_cfg, get_optimizer, build_network, get_device\n", + "\n", + "os.environ[\"CUDA_DEVICE_ORDER\"]=\"PCI_BUS_ID\" # see issue #152\n", + "os.environ[\"CUDA_VISIBLE_DEVICES\"]=\"1\"\n", + "\n", + "cfg = read_cfg(cfg_file='config/densenet_161_adam_lr1e-3.yaml')\n", + "\n", + "device = get_device(cfg)\n", + "\n", + "network = build_network(cfg)\n", + "\n", + "optimizer = get_optimizer(cfg, network)\n", + "\n", + "loss = PixWiseBCELoss(beta=cfg['train']['loss']['beta'])\n", + "\n", + "writer = SummaryWriter(cfg['log_dir'])\n", + "\n", + "dump_input = torch.randn(1,3,224,224)\n", + "\n", + "writer.add_graph(network, (dump_input, ))\n", + "\n", + "# Without Resize transform, images are of different sizes and it causes an error\n", + "train_transform = transforms.Compose([\n", + " transforms.Resize(cfg['model']['image_size']),\n", + " transforms.RandomRotation(cfg['dataset']['augmentation']['rotation']),\n", + " transforms.RandomHorizontalFlip(),\n", + " transforms.ToTensor(),\n", + " transforms.Normalize(cfg['dataset']['mean'], cfg['dataset']['sigma'])\n", + "])\n", + "\n", + "test_transform = transforms.Compose([\n", + " transforms.Resize(cfg['model']['image_size']),\n", + " transforms.ToTensor(),\n", + " transforms.Normalize(cfg['dataset']['mean'], cfg['dataset']['sigma'])\n", + "])\n", + "\n", + "trainset = PixWiseDataset(\n", + " root_dir=cfg['dataset']['root'],\n", + " csv_file=cfg['dataset']['train_set'],\n", + " map_size=cfg['model']['map_size'],\n", + " transform=train_transform,\n", + " smoothing=cfg['model']['smoothing']\n", + ")\n", + "\n", + "testset = PixWiseDataset(\n", + " root_dir=cfg['dataset']['root'],\n", + " csv_file=cfg['dataset']['test_set'],\n", + " map_size=cfg['model']['map_size'],\n", + " transform=test_transform,\n", + " smoothing=cfg['model']['smoothing']\n", + ")\n", + "\n", + "trainloader = torch.utils.data.DataLoader(\n", + " dataset=trainset,\n", + " batch_size=cfg['train']['batch_size'],\n", + " shuffle=True,\n", + " num_workers=0\n", + ")\n", + "\n", + "testloader = torch.utils.data.DataLoader(\n", + " dataset=testset,\n", + " batch_size=cfg['test']['batch_size'],\n", + " shuffle=True,\n", + " num_workers=0\n", + ")\n", + "\n", + "trainer = Trainer(\n", + " cfg=cfg,\n", + " network=network,\n", + " optimizer=optimizer,\n", + " loss=loss,\n", + " lr_scheduler=None,\n", + " device=device,\n", + " trainloader=trainloader,\n", + " testloader=testloader,\n", + " writer=writer\n", + ")\n", + "\n", + "trainer.train()\n", + "writer.close()" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "b24f958f", + "metadata": {}, + "outputs": [], + "source": [ + "import numpy as np\n", + "\n", + "'''\n", + "labels = []\n", + "scores = []\n", + "\n", + "for img, mask, label in val_dl:\n", + " net_mask, net_label = model(img)\n", + " pred, score = predict(net_mask, net_label)\n", + " labels.extend(label.tolist())\n", + " scores.extend(score.tolist())\n", + "labels = np.array(labels)\n", + "scores = np.array(scores)\n", + "'''\n", + "labels = []\n", + "scores = []\n", + "\n", + "for i, (img, mask, label) in enumerate(testloader):\n", + " img, mask, label = img.to(device), mask.to(device), label.to(device)\n", + " net_mask, net_label = network(img)\n", + " preds, score = predict(net_mask, net_label, score_type=cfg['test']['score_type'])\n", + " labels.extend(label.tolist())\n", + " scores.extend(score.tolist())\n", + "labels = np.array(labels)\n", + "scores = np.array(scores)" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "f5992f16", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "0.4084402322769165\n", + "0.017879948914431672\n" + ] + }, + { + "data": { + "image/png": "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cD799FNatGhBy5YtAahWrVrh31sB2BmFMSbiTJo0iR49epCSkkK1atVYsGBBvq9ZuXIlderU4Ygjjsh33euvv57U1NTDHo899thh627YsIHaycnQrBkkJJCUlMSGJUvgr78OrlO9enUyMzMPXiaaMGEC69e74tktW7Zk4sSJAMydO5e1a9eSnp5Os2bNmD17Nps3b2bXrl1MnTr14GvysmLFCkSEM844g9atW/PEEyUzhI+dURhj8pTfN/9wGTt27MFLNP369WPs2LG0adMmzzt6Cnqnz/DhwwseVNY+VF0J8xUrXON3UhJSrhzjxo3j+uuvZ+/evXTv3p2yZcsCcNttt3HttdeSmppK8+bNadWqFWXLlqVx48bceuutdO/enYSEBFJTUw++Ji+ZmZl89dVXzJs3j/j4eLp160abNm3o1q1bwd9PAViiMMZElC1btjBjxgyWLFmCiLB//35EhGHDhlGtWjW2bt162PrVq1enYcOGrFu3jr/++ivfs4rrr7+emTNnHja/X79+By8TZalVq9Yh3/TTN2yg1uDBcMwx7s6o7duhTh06dOjA7NmzAXeJaMWKFQAcccQRvPHGG4DrEFe/fn0aNGgAwODBgxk8eDAAd9xxB0lJwcduS0pKomPHjlT37s7q2bMnCxcuDHuiQFWj6lG5chs1xoTPsmXLfN3/K6+8okOGDDlkXseOHfWLL77QPXv2aL169Q7GuGbNGq1Tp45u27ZNVVVvvvlmHTRokO7du1dVVX///XcdP358keJZunSptmjRQvfs2aOrVq3S+vXra2ZmpluYkaGalqa6YIH+lp6uqqp79uzRrl276vTp01VVdevWrQfjGTFihF544YUHt/3bb7+pquratWu1UaNGunXr1kP23alTJ503b97B6S1btmirVq10586dum/fPu3WrZt+9NFHh8Wc2+8QmK+F/Nz1/YO/oA9LFMaEl9+JonPnzvrxxx8fMu+ZZ57Ryy+/XFVVv/rqK23fvr22bNlS27Ztq59++unB9fbu3as333yzHn/88dq0aVNt166dfvLJJ0WO6aGHHtIGDRpoSkqKTp069eD8M888UzesX6+akaE33XSTnnDCCZrSsKEOf+qpg+t88803mpycrCkpKXruuefqli1bDi475ZRTtHHjxtqiRQv9/PPPD86fOHGi1qpVS+Pi4rRGjRravXv3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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "from sklearn.metrics import roc_curve, auc\n", + "import matplotlib.pyplot as plt\n", + "\n", + "fpr, tpr, thresholds = roc_curve(labels, scores, pos_label=1)\n", + "roc_auc = auc(fpr, tpr)\n", + "\n", + "# рассчитываем значение EER - при котором доля ошибок первого и второго рода примерно равны\n", + "fnr = 1 - tpr\n", + "eer_threshold = thresholds[np.nanargmin(np.absolute((fnr - fpr)))]\n", + "eer = fpr[np.nanargmin(np.absolute(fnr - fpr))]\n", + "\n", + "print(eer_threshold)\n", + "print(eer)\n", + "\n", + "plt.title('Receiver Operating Characteristic')\n", + "plt.plot(fpr, tpr, 'b', label = 'AUC = %0.05f' % roc_auc)\n", + "plt.plot(eer,1 - eer, 'ro', label = 'EER = %0.05f' % eer)\n", + "plt.legend(loc = 'lower right')\n", + "plt.plot([1, 0], [0, 1],'r--')\n", + "plt.xlim([0, 1])\n", + "plt.ylim([0, 1])\n", + "plt.ylabel('True Positive Rate')\n", + "plt.xlabel('False Positive Rate')\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "9c9462a9", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "APCER 0.017879948914431672\n", + "BPCER 0.016129032258064516\n", + "ACER 0.017004490586248096\n", + "FRR 0.016129032258064516\n", + "FAR 0.017879948914431672\n", + "HTER 0.017004490586248096\n" + ] + } + ], + "source": [ + "from sklearn.metrics import confusion_matrix\n", + "\n", + "y_pred = (scores >= eer_threshold).astype(np.float32)\n", + "\n", + "# формулы расчета метрик https://sites.google.com/qq.com/face-anti-spoofing/evaluation\n", + "tn, fp, fn, tp = confusion_matrix(labels, y_pred).ravel()\n", + "\n", + "apcer = fp/(tn + fp)\n", + "bpcer = fn/(fn + tp)\n", + "acer = (apcer + bpcer) / 2.0\n", + "frr = fn/(fn + tp)\n", + "far = fp/(fp + tn)\n", + "hter = (frr + far) / 2.0\n", + "\n", + "print('APCER', apcer) \n", + "print('BPCER', bpcer) \n", + "print('ACER', acer)\n", + "print('FRR', frr)\n", + "print('FAR', far)\n", + "print('HTER', hter)" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "cc233be5", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAW4AAAFACAYAAACcBJbJAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8qNh9FAAAACXBIWXMAAAsTAAALEwEAmpwYAAA/00lEQVR4nO3deZxN5R/A8c/3zgxjjG0wEkL2Jbt+imRplUIkpdKqlFTahIr2VWlTWoRKqZB2ZYlE9lTIln1nLMMw2/f3xzkzXWOWO8ydmTPzfXud1z3nOdtzrjvf+9znPM9zRFUxxhjjHb68zoAxxpjsscBtjDEeY4HbGGM8xgK3McZ4jAVuY4zxGAvcxhjjMRa4c5CIDBORj/I6H8EgIt1EZLOIxIpI01M4zt8i0i7ncpb7ROQ8EfknyOeIFZEzM1m/QUQuCPBYN4rIrwFue9Kf4YL8+c9vCmXgFpE2IvKbiBwQkX0iMldEWuZ1vk6ViFQUkfdFZLuIHBKRVSIyXESK58DhXwL6q2qkqi492YOoagNVnZUD+TmOiMwSERWRxmnSJ7vp7QI8jopIzcy2UdU5qlrn5HObNfd9Xu/m6UMReSqY5zPeUugCt4iUBL4BXgeigErAcOBYXuYrLREJyeb2UcA8oBhwjqqWAC4ESgM1ciBLVYG/c+A4wbQauCFlQUTKAucAu3PqBCISmlPHMuZkFbrADdQGUNUJqpqkqnGqOk1Vl6dsICI3i8hKEYkRkR9FpKrfupFulcFBEVksIuelOX64iHzmlniX+JcARaSeWzLc71YZXOG37kMRGSUi34nIYaC9+3P4ARFZ7v46+ExEwjO4roHAIeA6Vd3gXuNmVb0n5dpE5FwRWegea6GInOt3/lki8qT76+OQiEwTkXIiUlREYoEQ4A8RWeduf1zJ1L9U6O73jXud+0Rkjoj43HWpP/HdY78qItvc6VURKequayciW0TkfhHZ5f6KuCmL/9uPgav9vvSuASYD8X75PFtE5rl52y4ib4hIEXfdbHezP9yqiqv98vGwiOwAxqSkufvUcK+xmbt8uojsTq+ELyI3icjXfstrRORzv+XNItLE//0Vkb5Ab+AhN09f+x2ySYCfjbT5OJXP8Oki8qV7jf+KyIAMzhEuIh+JyF73vV4oIhUCyZ/JWmEM3KuBJBEZKyKXikgZ/5Ui0gUYDFwJlAfmABP8NlkINMEprX8CfJ7mD6YL8Lnf+ikiEiYiYcDXwDQgGrgb+FhE/H9yXws8DZQAUuokewKXANWBRsCNGVzXBcAkVU1Ob6U4JfJvgdeAssAI4FtxSqX+57/JzV8R4AFVPaaqke76xqoaSOn9fmALzvtXAef9TG9shSFAK5z3szFwNjDUb/1pQCmcX0W3AG+m/f9KYxuwArjIXb4BGJdmmyTgPqAcTmm8I3AngKq2dbdp7FZVfOaXjyicXx19/Q+mquuAh4GPRCQCGAOMzaA66BfgPBHxicjpOO/xOQDi1GdHAsv9d1DV0ThfSC+4ebrcb3Wgn420TvYz7MP5DP+B83/SEbhXRC5O5xx9cP7vquB83u4A4gLMn8lCoQvcqnoQaIMTSN4FdovIVL/SwB3As6q6UlUTgWdwSjZV3f0/UtW9qpqoqi8DRQH/4LtYVb9Q1QSc4BiOE5xa4fxhPqeq8ao6A6fK5hq/fb9S1bmqmqyqR92011R1m6ruw/mjaZLBpZUFtmdy6ZcBa1R1vJv3CcAqwD8QjFHV1aoaB0zM5FxZSQAqAlVVNcGtE04vcPcGnlDVXaq6G6fK6vo0x3nCPcZ3QCzHv9fpGQfcICJ1gdKqOs9/paouVtX57nuwAXgHOD+LYyYDj7tfYicEH1V9F1gL/O5e95D0DuLWWR/CeV/bAj8C29y8ng/MyeiLNwOBfjbS5uNkP8MtgfKq+oT7GV6P8zfUK53TJOB8Jmu6v2wXu397JgcUusAN4AblG1W1MtAQOB141V1dFRjp/rzbD+wDBKeEgThVFyvdn6f7cUoV5fwOv9nvPMk4Jc/T3Wlzmj/MjSnHTbuvnx1+80dwgn969uIEjYyc7p7PX9rzB3qurLyIE8imich6ERkUYJ42umkp9rpfntnJ0ySgA9AfGJ92pYjUdqtxdojIQZwv5nJpt0tjt98XaUbexfksva6qmd0v+QVohxO4fwFm4QTt893l7Dip/69T+AxXBU5P+dtw9x2M86sqrfE4X0yfutVgL7i/Ok0OKJSB25+qrgI+xPmjA+dDe7uqlvabiqnqb25d4EM4P1HLqGpp4ABOYE9RJWXG/WlZGecn/DagSkpdr+sMYKt/dk7hUn4GuqU5vr9tOH94/tKePzuOABF+y6elzKjqIVW9X1XPBK4ABopIxwDydIabdtJU9QjwPdCPdAI3MArnl0YtVS2JE3gkne2OO2xmK0UkEueL/31gmFstlZGUwH2eO/8LWQfuHBvC8xQ/w5uBf9P8bZRQ1U4nZNj5lTRcVesD5wKd8btxbE5NoQvcIlLXveFV2V2uglNdMd/d5G3gERFp4K4vJSJXuetKAIk4rRRCReQxoGSaUzQXkSvFaX1wL05rlfk4P6OP4NxkCnNvXl0OfJpDlzbCzcvYlGodEakkIiNEpBHwHVBbRK4VkVARuRqoj1NdczKWAdeKSIiIXIJfdYOIdHZvrAlOUEjCqW5IawIwVETKi0g54DEgJ9oBDwbOT7lJm0YJ4CAQ61ZR9EuzfieQYfvpDIwEFqnqrTj3Ed7OZNtfgPZAMVXdgnMP5RKcaoWMmlmeTJ4yciqf4QXAIXFu1BZz/+8bSjpNaUWkvYicJc6N4oM4VSfZqQYymSh0gRunjvF/wO/itN6YD/yFc0MNVZ0MPI/zE++gu+5Sd98fgR9wbnBuBI5yYvXGV8DVQAxOfe2VbukjHidQXwrsAd4CbnBL/KfMrec8F+cP5HcROQRMxwmca1V1L06p536capWHgM6quuckT3kPzvXsx6mrnuK3rhbOL4BYnCaKb6nqzHSO8RSwCOeG3J/AEjftlLj1vhl1OHkA5ybsIZzqjc/SrB+G8+W3X0R6ZnUu92b2Jfz3BTAQaCYivTPI22qc92WOu3wQWA/MVdWkDE7zPlDfzdOUrPKUhVP5DCfhfIaaAP/ifI7fw6lqSes04AucoL0S5wsrvV9A5iRI+veMjDHG5FeFscRtjDGeZoHbGGM8xgK3McZ4jAVuY4zxGAvcxhjjMRa4jTHGYyxwG2OMx1jgNsYYj7HAbYwxHmOB2xhjPMYCtzHGeIwFbmOM8RgL3MYY4zEWuI0xxmMscBtjjMdY4DbGGI+xwG2MMR5jgdsYYzzGArcxxniMBW5jjPEYC9zGGOMxFriNMcZjLHAbY4zHWOA2xhiPscBtjDEeY4HbGGM8xgK3McZ4jAVuY4zxGAvcxhjjMRa4jTHGYyxwG2OMx1jgNsYYj7HAbYwxHmOB2xhjPMYCtzHGeExoXmcgI8Wa9te8zoPJf/YueD2vs2DyoYgwkVM9RnZiTtzSN075fKci3wZuY4zJVb6QvM5BwCxwG2MMgHin5tgCtzHGAJx6bUuuscBtjDFgJW5jjPEcK3EbY4zHWInbGGM8xlqVGGOMx1hViTHGeIxVlRhjjMdYidsYYzzGStzGGOMxFriNMcZjQqxViTHGeIvVcRtjjMd4qKrEOzk1xphgEgl8yvQwUkdElvlNB0XkXhGJEpGfRGSN+1rG3V5E5DURWSsiy0WkWVZZtcBtjDHglLgDnTKhqv+oahNVbQI0B44Ak4FBwHRVrQVMd5cBLgVquVNfYFRWWbXAbYwx4HR5D3QKXEdgnapuBLoAY930sUBXd74LME4d84HSIlIx06xm68KMMaagykZViYj0FZFFflPfDI7aC5jgzldQ1e3u/A6ggjtfCdjst88WNy1DdnPSGGMgWzcnVXU0MDrTw4kUAa4AHklnfxWRk36urpW4jTEGcuzmpJ9LgSWqutNd3plSBeK+7nLTtwJV/Par7KZlyAK3McZAjt2c9HMN/1WTAEwF+rjzfYCv/NJvcFuXtAIO+FWppMuqSowxBnK0HbeIFAcuBG73S34OmCgitwAbgZ5u+ndAJ2AtTguUm7I6vgVuY4yBHH2QgqoeBsqmSduL08ok7bYK3JWd41vgNsYYsC7vxhjjOR7q8m6B2xhjwErcxhjjNWKB2xhjvEV8FriNMcZTrMRtjDEeY4HbGGM8xgK3McZ4jAVuY4zxGu/EbQvcxhgD4PNZBxxjjPEUqyoxxhiPscBdSEWVKs5379wNQIWyJUlOTmZ3TCwA5133IgmJSad8jh/fvYfiEUVp0/sFAJrVP4Nn7+vGxbeNPOVjm+Bo3qg+NWvVTl1+5bU3OL1S5XS3PbdlM35buOSUzvfYkEEsXrSQyMgS+Hw+Bg15lMZNmp7SMQsF78RtC9w5ad+Bw7Tq9RwAQ27vxOEjx3h1/PTU9SEhPpKSkk/5PNFlIrmodX2mzV1xyscywVe0aDiffTklV8957/0PcuFFlzBv7q88PfxxJk6emqvn9yIrcZtUo4dfx9H4RJrUqcy8P9ZzMPbocQF90eeDuXLA22zavo9enVpy1zXnExYWysI/N3DPs5+RnHziY+leGTedh2+5+ITA7fMJTw3oQtsWtSgSFso7E2fz/pdzERFeGXQV7VrWZsvO/SQkJjHuq3lM/nlZbrwFJo0jRw5z3913cfDgQRITE7jz7ntp3+H4YZp3797Fww8M5HBsLElJSQx+9HGaNW/BvLm/Muqt10mIT6BylSoMf+oZIiKKZ3iuZi1asnnzJgDGjx3DV5MnAdCtew96X9+HuCNHeOj++9i5cwfJycncdns/Lr60U/AuPh+zwG2OUym6NO1ufJnkZGXI7en/UdSpXoEeFzWj/U0jSExM5tVHetKrU0s++WbBCdv+vvxfrmjfiLYtahF75Fhq+o1dz+VAbBxtrnuRImGhzPhwID/PW0Wz+lWoenpZmnZ/muioSJZOepRxX80L2vWa4x07dpSru3cFoFKlyrww4lVeHvkGkZGRxMTE0Ofaq2nXvsNxgeP7b7/h3HPbcOvtd5CUlMTRo3HExMTw7ui3eefdMRSLiGDM++8yfuyH3N4v4zH4Z8+aSc1atVnx919MnTKJ8Z98hqJcf83VNG/Rki1bNlM+OprXR70DwKFDh4L6XuRnNlaJOc6kn5emW3L21/7sOjSrfwa/fvQQAMWKhrF7X2yG2z/33o8MuvUShr72VWraBefUpWGtSnS7wKnPLBUZTs0zynNukxpM+mkpqsrOvYeYvXB1DlyVCVTaqpKEhATeGDmCJYsWIT4fu3btZO/ePZQrVz51mwYNz2L4o0NITEygfccLqFO3HosXzuTfdWu58fprU4/TqHGTdM/56ssv8t47b1OmTBSPP/EUC+bPp33HCykWEQFAhwsuZMniRbRucx4jXnyekSNe4rzz29GseYugvQ/5nZW4zXGOxP1XKk5MSsLn980eXiQMcD40H339O4+9Hlhd5C8LVzPsrs6cfVa11DQRYeDzn/PzvJXHbXtJmwankHuT077/9mti9sXw8cQvCQsLo9NFHYg/duy4bZq3aMl7Y8fz6+xfeGzII1x3w42ULFWS/51zLs+9OCLLc6TUcadYMH9+uttVrVadCZ9P4tfZs3nz9Vc5+3/nZFqCL8i8FLiD2uJcRCJE5FERedddriUinYN5zvxu47Z9NKlXBYAmdStTrZLzWLqZC/6h2wVNKF8mEoAyJSM4o2KZTI/13Hs/MLDPBanLP/22kr5XtSE01PlvrXlGNBHhRZi3bD1dOzZBRIiOKsF5LWoF49JMgGIPxVKmbBRhYWEsXDCf7du2nbDNtm1bKVu2HFf26Em37j1YtXIFZzVqwh9Ll7Jp00YA4o4cYeOGfwM6Z9PmzZk1/Wfi4uKIO3KEmdN/plnzFuzatZPw8GJcdvkV9LnxFlatLLw3vEUk4CmAY5UWkS9EZJWIrBSRc0QkSkR+EpE17msZd1sRkddEZK2ILBeRZlkdP9gl7jHAYuAcd3kr8DnwTZDPm29Nmb6M3p3PZvEXQ1j45wbWbNwFwKr1Oxj+5jd8Pao/PhESEpO477mJbNoek+Gxfvx1RWpzQ4Axk3+j6ulRzPtkECKwJyaWngNHM3n6Mtr9rw5LvxzClp37WbZqMwcOHQ36tZr0Xdr5cu7pfwdXdbuc+g0aUr36mSdss2jhAsaN+YDQ0FAiIiJ48pnniYqKYvjTz/LIg/eTEB8PwJ0D7qVqtepZnrNe/QZc3rUb11/jPFi8W/ce1K1Xn9/mzuHVl15EfD5CQ0MZ/OjjOXuxHpLDJe6RwA+q2kNEigARwGBguqo+JyKDgEHAw8ClQC13+h8wyn3NOK/OA4aDQ0QWqWoLEVmqqk3dtD9UtXFW+xZr2j94GSuEihcrwuG4eKJKFWfO+AfocNMIdu713o2ovQtez+ssmHwoIuzUo26lfpMDjjlbR3XL8HwiUgpYBpypfgFWRP4B2qnqdhGpCMxS1Toi8o47PyHtdhmdI9gl7ngRKQaom6EawLHMdzHBMOm1fpQqUYwiYSE8++4PngzaxgRTDpa4qwO7gTEi0hin1uEeoIJfMN4BVHDnKwGb/fbf4qblWeB+HPgBqCIiHwOtgRuDfE6TDutZaUzmshO4RaQv0NcvabSqjnbnQ4FmwN2q+ruIjMSpFkmlqioiJ12rENTArao/icgSoBVOh9J7VHVPMM9pjDEnJRsFbjdIj85g9RZgi6r+7i5/gRO4d4pIRb+qkl3u+q1AFb/9K7tpGQp2q5LWwFFV/RYoDQwWkarBPKfX1KoazfxPB6VOO+e8SP9r2wHQr9f5LJs0lMVfDOHpe7oAEBYawjvDrmPhxMH8/tkgzmtuLUQKg2FDB9Oh7bn06Hr5CevGffgBTRvWJSYm4xvZJms51apEVXcAm0WkjpvUEVgBTAX6uGl9gJROGFOBG9zWJa2AA5nVb0Pwq0pGAY3dep6BwPvAOOD8IJ/XM9Zs3JU6vonPJ6z78WmmzvyDti1q0bndWZx99XPEJySmNhO8+crWALTs+Qzly0Qy5Y07aXPdiwTzJrPJe5d37cbV1/bm0cHH/eJmx/btzP9tLqdVPD2PclZw5HCrkruBj90WJeuBm3AKyhNF5BZgI9DT3fY7oBOwFjjibpupYI8cnujeVe0CvKmqbwIlgnxOz2p/dh3+3bKbTdtj6HvVebw05ifiExIBUpv91T3zNGYt/Cc17cChOJrXPyPP8mxyR/MWLSlVqtQJ6S+98Cz3DHwQD/Udybd8Pl/AU1ZUdZmqtlDVRqraVVVjVHWvqnZU1VqqeoGq7nO3VVW9S1VrqOpZqrooy7zmwPVm5pCIPAJcB3wrIj4gLMjn9KyrLm7OxB8WA1CzajStm9Zg9rgHmPbePanB+c/VW+l8/lmEhPic8UfqV6HyaZl31DEF08wZ04mOrkCdunXzOisFg2RjymPBDtxX4zT/u8Wt96kMvJjRxiLSV0QWiciixD1/Bzlr+UtYaAiXnX8Wk35aCkBoiI+oUsVpe8NLDH5lCh+9cDMAY7+ax9ad+5n78UO8+GB35v/xb44MFWu8JS4ujg/efYd+/QfkdVYKjJzsORlswW5VsgMY4be8CaeOO6PtU+/UFrYOOBe3qc+yVZvZtc9pX711536mTF8GwKK/N5KcrJQrE8memFgeenlS6n4zPxzImk270jukKcC2bN7E1q1buLq7c9N6186dXHvVlYz/dOJxg1WZwOWHgByooARuETmE2+km7SqcKp2SwTivl/W8pEVqNQnA17OWc37L2sxetIaaZ0RTJCyUPTGxFAsPQxCOHI2nw//qkpiUzKr1O/Iw5yYv1Kpdhxmzf0td7nRRBz7+7EvKlLFqs5PlobgdnMCtqnYDMhsiwovQ4X916f/UhNS0sVPm8c6w3iz6fDDxCUnc+th4AMqXKcHXb91FcrKybfd+bhk6Nq+ybXLRoAcHsnjhQvbvj+Hijudzx5130617j7zOVoHipRJ3UMcqST2JSDQQnrLsVplkqrBVlZjA2FglJj05MVZJnYd/DDjm/PP8xXka5YPdAecKEVkD/Av8AmwAvg/mOY0x5mSIBD7ltWC3KnkSp7v7alWtjtODKP0R3Y0xJg/5fBLwlNeC3XMyQVX3iohPRHyqOlNEXg3yOfOVUpHFGPX4tdSvURFVuGP4x/y+/F/69Tqf23ueR1Ky8sOcvxgy8qsT9l317XAOHT5GUnIyiUnJtOn9AgCNalfi9SG9KFo0jMSkZO595jMW/b2Rrh2b8Gi/y4g5cJieA99l34HDVK9cjif6X871g8bk9qWbAAwbOpjZs2cRFVWWL6Z8fcL67775mg/ffxdFiYgozuBHh6W2285o35EjXmLunNnUrluPp559HoBvv57K/v0x9L6+zwnnMI78UJIOVLAD934RiQRm43T/3AUcDvI585WXHurBtN9WcO2D7xMWGkJEeJEMu7On55K+I9m7//i37Ol7u/L06O+ZNncFF7epz9P3duXi20bSr9f5tLnuBbp0aMLVl7Zg1Ke/MOyuzgx7q9A+tyLfy6gre4rTK1XivQ/HU7JUKX6dM5unhj/G+AkTM9z30KFDrFyxgomTpzL8saGsWf0PVc6oytQpk3jj7Xdz5Zq8yks3J4NSVSIiKX2wu+D0vb8PZ3jXdcCJo+QUUCUjw2nTrAYfTnaeqJ6QmMSB2LgMu7MHShVKFnfu9ZaKLMb23QcASE5OpmhYKBHhRUhITKJ10xrs3HOQdZt25+BVmZyUUVf2FE2aNqOku75Ro8bs3Plf08/09vX5hMTEBFSVo0fjCA0NY9yHH9Dr2usIC7NOy5mxqhKYAjRT1cMi8qWqdgcKXbu1aqeXZU9MLKOHX8dZtSuxdOVmHnjhi9Tu7MPvupyj8Qk8MmIyi1ec2NBGVfn6rf6oKu9/OZcPJs0F4MGXvuDrN+/i2fu64fMJ7W98GYAXP/iJb9++m+27D3Dz0LF8/MIt3GBVJAXGlElf0LpN20y3KV48kjZtz6dXj26c3aoVkSUi+Wv5H/S9485cyqV3eanEHazA7f8OnPhAvUIiNDSEJnWrMPD5z1n410ZeerA7D9x84XHd2Vs0qMpHL9xMvc7DTti/402vsG33AcqXieSbt/vzz4YdzF2yjr5XncdDL09iyvRldL+wKaMe781ld7zBjN9XMaP3KgCu7Xw2P/76N7WqRnPvDR2JOXiEB178grijCbn8LpicsHDBfKZM+pIPxn+c5bY33nwrN958KwDDHxtKv/4DmPTF58yfN5datetw2+39gp1dT/JQ3A5aqxLNYL5Q2bozhq279rPwL+ep3JN/XkaTulUy7M6e1ja3CmR3TCxTZyynZYNqAPTu/L/U/b/8aSktGhw/xHmx8DCuv/x/vD1xNkPvuIxbHx3Pb8vW0+vSlsG5UBNUq//5hycee5RXXn+T0qUD7xm5auUKVJVq1arz87QfeOHlV9myeRMbN24IXmY9zEtjlQQrcDcWkYNu1/dG7vxBETkkIgeDdM58Z+feQ2zZEUOtqtEAtDu7DqvW70jtzg4c153dX0R4ESIjiqbOX3BOXf5etw2A7bsPpD5Aod3ZtVmbpg77vhsu4K0Jv5CYmEyx8DAUJTk5mYjwIkG9XpPztm/fxgP33s2Tzz4f0NPc/b31+kjuvHsAiYmJJCU7A5GJ+DgadzQYWfU8L7XjDlaX95BgHNeLBj7/OWOeuZEioSFs2LqHvo9/xOG4+HS7s1csX4q3HruWbnePIrpsCT4bcRsAoSEhfPb9In76bSUAdz35CS8+2IPQUB/HjiUe11W+YvlStGhYlWdGO/2cRk34hV8/eogDh47Qc6C1Kshv0uvKnpjo3LS+6upejB71FvsP7OfZp54AICQkhE8mfpnhvind4GdO/5n6DRoSHe08j7ZOnbpc1e1yatWuY8PAZiA/lKQDlStd3k+GdXk36bEu7yY9OdHlveXTswKOOQuHtMvTKB/sdtzGGOMJHipwW+A2xhjwVlWJBW5jjMFbJe5gDzJljDGekJPNAUVkg4j8KSLLRGSRmxYlIj+JyBr3tYybLiLymoisFZHlItIsq+Nb4DbGGILSHLC9qjZR1Rbu8iBguqrWAqa7ywCXArXcqS8wKqsDW+A2xhhyZaySLvw39MdYoKtf+jh1zAdKi0jFTPN6sjkwxpiCJDtVJSLSV0QW+U190xxOgWkisthvXQVV3e7O7wAquPOVgM1++25x0zJkNyeNMYbstSpR1dHA6Ew2aaOqW93HNv4kIqvS7K8ictJ9VbIscYvICyJSUkTCRGS6iOwWketO9oTGGJMf5WQdt6pudV93AZOBs4GdKVUg7usud/OtQBW/3Su7aRkKpKrkIlU9CHTGeWZkTeDBAPYzxhjPyKlWJSJSXERKpMwDFwF/AVOBlEcQ9QFSHns1FbjBbV3SCjjgV6WSrkCqSlK2uQz4XFUPeKmhujHGBCIHH5BQAZjsxslQ4BNV/UFEFgITReQWYCPQ093+O6ATsBbnwTM3ZXWCQAL3N279TBzQT0TKAza8mDGmQMmp8qiqrgcap5O+F+eB6WnTFbgrO+fIMnCr6iAReQGn+J4kIkdwmq8YY0yB4fNQTUIgNycjgDv5r1H46UCLjPcwxhjv8dJ43IHcnBwDxAPnustbgaeCliNjjMkDBe0JODVU9QUgAUBVj3D8MyWNMcbzfBL4lNcCuTkZLyLFcJ8dKSI1gGNBzZUxxuSyHGxVEnSBBO7HgR+AKiLyMdAauDGYmTLGmNwmHqpICKRVyU8isgRohVNFco+q7gl6zowxJhd5qMCddeAWkbbu7CH3tb6IoKqzg5ctY4zJXfnhpmOgAqkq8e/eHo7T534x0CEoOTLGmDzgobgdUFXJ5f7LIlIFeDVYGTLGmLwQ4qG6kpMZ1nULUC+nM2KMMXmpQFWViMjruE0Bcdp9NwGWBDFPxhiT6zwUtwMqcS/ym08EJqjq3CDlxxhj8oSXxioJpI57bFbbGGOM13knbGcSuEXkT/6rIjluFc5IhI2ClitjjMllBaWOu3Ou5cIYY/JYgWhVoqobczMjxhiTlzxU4A5oPO5WIrJQRGJFJF5EkkTkYG5kzhhjcouXhnUNpFXJG0Av4HOcByjcANQOZqaMMSa3eaimJKDxuFHVtUCIqiap6hjgkuBmyxhjcldOl7hFJERElorIN+5ydRH5XUTWishnIlLETS/qLq9111fL6tiBBO4j7gmWicgLInJfgPsZY4xnSDamAN0DrPRbfh54RVVrAjHALW76LUCMm/6Ku12mMgzAItLSnb3e3a4/cBioAnQPPO/GGJP/hfgk4CkrIlIZuAx4z10WnIH5vnA3GQt0dee7uMu46ztKFsX6zOq4R4tIJPApTm/JFcDwLHNsjDEelMM3HV8FHgJKuMtlgf2qmugubwEqufOVgM0AqpooIgfc7TN87kGGJW5VbYrTljsR+EJE/hCRQYHUvxhjjNdk5ynvItJXRBb5TX3/O450Bnap6uJg5TXTViWq+g9OKXu4iDTGaV0yXUR2qGrrYGXKGGNyW3bGKlHV0cDoDFa3Bq4QkU44zzAoCYwESotIqFvqrgxsdbffilMFvUVEQoFSwN5M8xpIJkXEB0QDFYDiwK5A9jPGGK/ITok7M6r6iKpWVtVqOIXdGaraG5gJ9HA36wN85c5PdZdx189Q1fSGG0mVaYlbRM4DrsGpRP8Tp777PlU9kHnWT13MwjeCfQrjQcOmrc7rLJh86LlOp961JCT4HWseBj4VkaeApcD7bvr7wHgRWQvswwn2mcpskKnNwEacYD1MVa2UbYwpsILRI1JVZwGz3Pn1OI9+TLvNUeCq7Bw3sxJ3GxuvxBhTWHip56QNMmWMMRSQwG2MMYVJfhg8KlAWuI0xhgJS4k7zkOATqOqAoOTIGGPyQIF4kALHPyTYGGMKNC+NnJfZzUl7SLAxptDwUBV31nXcIlIep+F4fZzumwCoaocg5ssYY3JVdrq857VAfh18jDOmbHWccUs2AAuDmCdjjMl1OdXlPTcEErjLqur7QIKq/qKqN+OMK2uMMQWGTwKf8logzQET3NftInIZsA2ICl6WjDEm9xWUViUpnhKRUsD9wOs4QxTeF9RcGWNMLvNQ3M46cKvqN+7sAaB9cLNjjDF5Q7LzNMk8FkirkjGk0xHHres2xpgCoUCVuIFv/ObDgW449dzGGFNgFKjArapf+i+LyATg16DlyBhj8kBBuzmZVi2cx5gZY0yBkR/aZwcqkDruQxxfx70DpyelMcYUGF7qORlIVUmJ3MiIMcbkJQ/VlGTdc1JEpgeSZowxXlYguryLSLiIRAHlRKSMiES5UzWgUq7l0BhjcoEPCXjKjBs7F4jIHyLyt4gMd9Ori8jvIrJWRD4TkSJuelF3ea27vlrWec3Y7cBioK77mjJ9BbwRyBthjDFeEeILfMrCMaCDqjYGmgCXiEgr4HngFVWtCcQAt7jb3wLEuOmvuNtlKsMsqOpIVa0OPKCqZ6pqdXdqrKoWuI0xBYpPJOApM+qIdRfD3ElxBuf7wk0fC3R157u4y7jrO0oWD8AMZHTAZBEpnbLgVpvcGcB+xhjjGdmp4xaRviKyyG/qe/yxJERElgG7gJ+AdcB+VU10N9nCf1XOlYDNAO76A0DZzPIaSOC+TVX3pyyoagxwWwD7GWOMZ2SnxK2qo1W1hd802v9Yqpqkqk2AysDZOFXOOZfXALYJ8S+2i0gIUCQnM2GMMXktGK1K3ELvTOAcoLSIpDTBrgxsdee3AlWcPEgoUArYm9lxAwncPwCfiUhHEekITHDTjDGmwPBlY8qMiJRPqV4WkWLAhThPEZsJ9HA364PT0ANgqruMu36Gqp4wsJ+/QLq8Pwz0Bfq5yz8B7wawnzHGeEYO9pysCIx1ayd8wERV/UZEVgCfishTwFLgfXf794HxIrIW2Af0yuoEgfScTAbedidE5DycByrclf3rMcaY/CmnAreqLgeappO+Hqe+O236UeCq7JwjoEGmRKQpcA3QE/gXmJSdkxhjTH6XDzpEBizDwC0itXGC9TXAHuAzQFTVnoJjjClw8kNX9kBlVuJeBcwBOqvqWgARsWdNGmMKpCz6vOQrmd0gvRLYDswUkXfdFiXeuTJjjMmGEJGAp7yWWZf3KaraC6fh+EzgXiBaREaJyEW5lD9jjMkVko0pr2XZjltVD6vqJ6p6OU6j8aXYgxSMMQWMiAQ85bVAOuCkUtUYt6tnx2BlyBhj8kJOdcDJDSfzzEljjClw8kNJOlAWuHNI07PqUatW7dTlV15/k0qVKqe7basWTZm/aOkpne/RwYOYN28u3/04nSJFihATs49re/bg+59mnNJxTXAcO3yQuW8NBeDooRjE56No8VIAtLvvZXyhYad8jjlvPMLRgzH4wsIILVKMZtcMoER0+p9BcyLvhG0L3DmmaNFwJk76KusNc1CIL4Qpk76gZ69rc/W8JvuKFi9JhwdfA2DlD58QWjScWu2vTF2fnJSELyTklM/T4rr7KXNGLf797Qf+mjqGc2599JSPWVjkh9YigbLAHSRHDh/mnrvv5ODBgyQmJtJ/wD2073DBcdvs3r2Lh+6/j8OxsSQmJTH0sWE0a96C3+b+yqg3Xyc+Pp4qVarwxFPPElG8+Ann6H19H8aPG8uVPXqesO7DD95j2g/fE58QT4eOF3Jn/wEAvDPqTb79ZiplykRx2mkVqd+gAX1uuuWE/U3wLf7kFXyhRTiwdT1R1esRFh5xXED/+fm7OOe2xygeVYFNi2ayfs7XJCcmUqZqbZr06If4Mg705Wo0YN3sqagqf309hp0rFyMi1Lnwaio3PY+jB/axYNwLJB49QnJyEk163Em5Gg1y69LzJQ/FbQvcOeXYsaP0vLILAKdXrsxLI0byymtvEhkZSUzMPq6/5mrate94XD3ad99+w7mt23Db7f1ISkri6NE4YmL28e47o3jnvTFERETwwXujGTd2DHfc2f+Ec1asWJGmzZrxzddfcX67/zq0/jb3VzZt3MjHn32BqjKgfz8WL1pI0aJFmf7TND6fNJXExAR69biS+g0K9x9rXos7sIfz73kB8YWw8odP0t3m4M7NbF06h7YDXsAXEsqyL95i8+JfOKNlhwyPu/3vhZSsWJVty3/jwNZ/6fjgaxw7fJBZIwZS7swGbF7yCxXqNqXOhVejyUkkxh8L1iV6hniossQCdw5JW1WSkJDAa6+OYMnihfjEx65dO9m7Zw/lypdP3aZhw7N4fOhgEhMTad/hAurWq8eihTNZv24tN153TepxGjVpkuF5b7ntdu7tfyfntW2Xmjbvt7nM+20uV3fvCsCRI0fYuHEDRw4fpl2HjhQtWpSiRYvStp2NXpDXKjVuk2nJGWD36j/Yv2Uds0YMBCApIZ6ikaXT3XbRRy8TElaEiKhoGl15O2tnTaFys7aIL4TwEmUoV6MhMZvXUOaMWiz59DWSk5KoeFYrSlc6M6cvzXOsxG347puviYnZx4SJkwgLC+PSCztwLE2ppnmLlnww7iPm/PILjw0ZxPV9bqJEyZK0Oqc1z780IqDzVK1ajTp16zHth+9T01SVm2/ry1U9jx8d8qNxH57ydZmcFVokPHVefCFo8n/DMCcnJjgzqpzRsgMNOvdJu/sJUuq4s1KuRkPO6/8sO1YsYsknr1KzXddMS/CFQVZPb89P8kOTxAIpNvYQUVFlCQsLY8Hv89m2besJ22zbtpWyZcvR/aqedOt+FStX/E2jxk1YtnQJmzZuBJzS8oYN/2Z6rltvv4NxH36Qunxu6zZMmfQlRw4fBmDnzp3s3buXJk2b8cusmRw7dowjhw8z+5dZOXfB5pRFREWzf+s6APZvXsvhvTsBKF+7MVv/mMuxQ/sBiD98iCP7dgV0zLI1GrB16Rw0OYljsQfYs/5vypxRmyP7dhFeojTVz7mYqq0uYv+WdUG5Ji/x+QKf8lrQStzu4856A2eq6hMicgZwmqouCNY585NOnS9nwF396N71cuo3aEj1M0/8KbpowQI+HPM+oaGhRERE8NSzzxMVFcUTTz/LoAcHEp8QD0D/u++lWrXqGZ6rZs1a1K1fn1UrVgBO4P53/Tqu7+2UuCMiInjmuRdpeFYj2rXvQI9uV1C2bFlq1apNZGSJIFy9ORmVGp3L5oUz+Pm5OylTtQ6R5U8HoORpZ1C/0/XMffsxVBVfSAiNu99BRFR0lsc8/axz2LdhFdNfHICI0PDymwgvWYaNC6azZuYkfCGhhBYJp3lvGz/OS3XcksUTck7+wCKjgGSgg6rWE5EywDRVbRnI/kcTCU7GCrkjhw8TUbw4cXFx3NynN48Ne5J69b1zg3LYtNV5nQWTDz3XqfYpR93pq/YEHHM61i2Xp1E+mHXc/1PVZiKyFJzu8iJiDxnOY08Me4z169ZyLP4YV3Tp5qmgbUwweanEHczAneA+c03BeYAmTgnc5KHnXnw5r7NgTL5krUocrwGTcYaCfRrn6cVDg3i+AungwYMMf2woa9euRkQY/uQzNG5ywuPsTAGTlBDPnDcGkZSYgCYlUalxa+pd2htVZcV349n6x1xEfJzZ+lJqtL0CgN1r/+TPye+SnJRIkciStO3/XB5fhbfkVIlbRKoA44AKOAXX0ao6UkSicJ4kVg3YAPR0ayIEGAl0Ao4AN6rqkszOEbTAraofi8hiIOUBDF1VdWWwzldQvfDs07Rucx4vv/oaCfHxxB09mtdZMrnAFxpGmzufJrRoMZKTEpn92sNUqNecQzu3ELd/DxcOGoX4fP+1NImL5Y8vRnHu7cOIKBOdmm4Cl4Nd3hOB+1V1iYiUABaLyE/AjcB0VX1ORAYBg3CGyL4UqOVO/wNGua8ZClrDFrcVyRHga2AqcNhNMwE6dOgQixcvpFv3HgCEFSlCyZIl8zhXJjeICKFFiwGQnJRIclIiiPDvb99R96JeiNsmrWiJ0gBsWfwLpzc6h4gy0celm8CJBD5lRlW3p5SYVfUQsBKoBHQBxrqbjQW6uvNdgHHqmA+UFpGKmZ0jmFUl3+L8TBAgHKgO/APY3bAAbd2yhTJlonhsyCP8888q6jdowEODhhAREZHXWTO5QJOTmPnyfcTu2c6ZbS4jqmodYvfsYOuyOWxbPp+ikSVpdOXtRJY/ndjd20hOSmTOG4+QeCyOGm2vKPQdarIrGFXcIlINaAr8DlRQ1e3uqh04VSngBPXNfrttcdO2k4GglbhV9SxVbeS+1gLOBuYF63wFUVJSIqtWruCqXtcw8cspFCtWjA/eG53X2TK5RHwhdHjwNS4ZNoaYTas5uH0jyYkJ+EKL0P7+V6h6zsUsmTAScIL8/i3rOOe2xzn39uGsmvYph3ad2OnLZMwnEvAkIn1FZJHf1Dft8UQkEvgSuFdVD/qvU6cd9kk3ec61PkDuT4dM623834z337UAVaHCaVSocBqNGjUG4MKLLmHVyhV5nCuT24oUi6R8zbPYuWoxxUqX5fRG5wBO55oD2zcAEF6qLBXqNCW0aDhFI0tRrkZDDm7LvMetOV52njnpPgmshd90XMASkTCcoP2xqk5yk3emVIG4ryndX7cCVfx2r+ymZSiYddwD/aYHROQTYFtm+/i/GbfcdsIXWKFTrnx5Kpx2Ghv+XQ/A7/PncWaNGnmcK5MbjsUeID4uFoCk+GPs+mcZkdGVqdiwFbvX/gnAnnV/pfaurHhWK/b+u4LkpCQS44+yb+M/lKhQJcPjm3Tk0NOC3VYi7wMrVdV/0KGpQMqAM32Ar/zSbxBHK+CAX5VKuoJZx+3flzoRp877yyCer0AaNPhRHnn4ARISEqhc2Rmb2xR8Rw/uY/Enr6LJyagmU7lJGyo2OJuyZ9Zn0fiXWffLV4QUCafZ1c446yUrVCG6bnNmvHg3iFCt1UWUrFg1j6/CW3w516qkNXA98KeILHPTBgPPARNF5BZgI5AykP53OE0B1+I06LgpqxMEpcu72/HmeVV94GSPYV3eTXqsy7tJT050eV+4/kDAMaflmaUKVpd3EQlV1UQRaZ3TxzbGmKAp5D0nFwDNgGUiMhX4HDicstKvot4YY/ING6vEEQ7sBTrwX3tuBSxwG2PyncI+Vkm0iAwE/uK/gJ2iUNdbz50zm+efe5rkpGS6db+KtC1nvpo8iVdefoHoaKddfq9rr+PKHlexauVKnn5yGLGxsYSE+Li1bz8uubQTAI88dD9r1qym7fntGXCv82ir0W+/Rc1atenQ8fiHE5v8IaNxSNbN+YZ1s6dyeM92Oj35EUUjS6W7/5GYXSz99HWO7N+DiHBO38cpHlWB3Wv+4M+vPiA5KZHSlWvSrNcAfCEhbP1jLiu//5giESX43y1DKFq8JLF7trPi23Gc3efhXL76/KuwB+4QIJL0a4wKbeBOSkrimaef4J13x1ChQgWuvboH7dp3oEbNmsdtd9ElnRg89LHj0sKLhfPUs89TtWo1du3ayTVXdefc1m3YsX0bRcPD+WLy19x+600cOnSIo0fj+HP5cvrecWduXp7JhozGISlbvR6nNWjJr28MznT/xR+/Qp0LexJdpymJx+JABE1OZvEnr9K631OUiK7Eiu8/YtPC6VRrdRHr53xDu4Ej2LZ8HlsW/0KNtpez8ruPqN/p+ly6Ym8o7FUl21X1iSAc19P++nM5VapUpXIVp23tJZ0uY9bM6ScE7vT4P/0mOroCUVFRxMTsIzQ0jGNHj5KcnExiYiIhPh9vvf4ad/a/O2jXYU5dRuOQlK6cdRv9gzs2kZycRHQdZ4TIlOMciz2ALySUEtGVAIiu3ZTV0z+nWquLQHwkJyaSFH8MX0goe9b9TdESpVPbgBtHYS9xe+jyc8+unTs5reJpqcvRFSrw5/LlJ2w3/adpLFm8kKpVq/Pgw49wWsXjx5r5c/lyEhITqFLlDHw+H2XKRNGrRzcuu6ILmzZtIlmT7eEIHpDeOCSBiN29lbBixZn/wTMc2beT8rUb07BzH4oUL0lychIxm5wnuG/7Yy5x+/cAUOeCHswdNZTwklG0uO5+Fnz4HC1veCiYl+dJXgpcwQjcHYNwzELh/PbtufSyzhQpUoTPJ37K0MEP896Ycanrd+/exZBHHuSpZ57H544O99AjQ1LX333nHTw6bDjvvjOK1f+sotU5rel+Vc8TzmPyXso4JPFxsfz+wTMc3L4xoA4zmpTM3vUr6HD/SIqVKc/Ccc+zcYFTJdLyhof4c8p7JCclEF2nKSLOZyS6TtPUEvqmhTOoUL8Fsbu3smbiZMIiImnU7bbjnjZfaHkocud4l3dV3ZfTxywIoitUYMf2HanLu3bupEKFCsdtU7p0GYoUcZ7udqX71PcUsbGx9O93O3cPuI9GjZuccPyZM36mfoMGHDlyhM2bN/HiiJH8NO1H4uLignNBJkf4j0MSiGKly1KqUnWKlzsNX0gIFRu2Sn1Ce9lqdWk74Hna3TeCsmc2OKEqJDH+KBsXTOfMNpex8odPaH7tfZStXp/Ni3/J8evyIsnGv7yWDx40Xzg0aHgWmzZtYMuWzSTEx/PDd99yfvvjh93cvXtX6vysmTOofqZT55kQH899A+7i8iu6cOHFl5xw7ISEBD4aN5Ybb76VY0ePIW5lXXJyEgkJCUG8KnMyMhqHJBBlzqhFQtxhjsUeAGD32uWUPM0Z5j7l4QlJiQmsmfEl1Vtfety+a2ZMpkbbzvhCQklKiAdx6tuT4o/l0JV5m08Cn/JaMNtxGz+hoaE8MuQx+vW9leTkJLp2607NmrV48/WRNGjQkHYdOvLJR+OZNXMGoSEhlCxViiefdsYl+fHH71myeBEH9u9n6pTJADzx9HPUrVcPgM8mfMwVXbpRrFgxatepw9G4o3TvejltzmtrD17IhzIah2Td7KmsnjGJY4dimPHiACrUa06zXgOI2bSGf3/7nma9BiC+EM664mZ+fWsooJSuXMO5AQmsnjmJHX8vBFWqt76U8rUap54z7sBeYjatpt4l1wBQ47zOzBoxkLBikbS6ZUh62Sx88kFADlRQxirJCTZWiUmPjVVi0pMTY5X8vfVwwDGnQaXiBWusEmOM8aLC3hzQGGM8x0Nx2wK3McYAnorcFriNMYYcfZBC0FngNsYYPFXgtsBtjDGApyK3BW5jjMFGBzTGGM/xUBW3dXk3xhhwAnegU9bHkg9EZJeI/OWXFiUiP4nIGve1jJsuIvKaiKwVkeUi0iyr41vgNsYYcnyQqQ+BtAMLDQKmq2otYLq7DHApUMud+gKjsjq4BW5jjCFnS9yqOhtIO1JqF2CsOz8W6OqXPk4d84HSIlKRTFjgNsYYnEYlAU8ifUVkkd/UN4PD+qugqtvd+R1AyrjOlYDNftttcdMyZDcnjTEGstUcUFVHA6NP9lSqqiJy0gPpWYnbGGPIlQcp7EypAnFfUwbg3wpU8duuspuWIQvcxhhDrjxIYSrQx53vA3zll36D27qkFXDAr0olXVZVYowx5Gw7bhGZALQDyonIFuBx4DlgoojcAmwEUh4I+x3QCVgLHAFuyur4FriNMQbIyT7vqnpNBqtOeJi6Ok+zuSs7x7fAbYwxeKvnpAVuY4zBU2NMWeA2xhiwErcxxniOeChyW+A2xhisqsQYYzzHQwVuC9zGGAP2IAVjjPEe78RtC9zGGAOn1JU911ngNsYYrKrEGGM8x0s3J210QGOM8RgrcRtjDN4qcVvgNsYYrI7bGGM8x1qVGGOM11jgNsYYb7GqEmOM8Ri7OWmMMR7jobhtgdsYYwBPRW4L3MYYA/g8VFcizgOGTX4mIn1VdXRe58PkL/a5KLysy7s39M3rDJh8yT4XhZQFbmOM8RgL3MYY4zEWuL3B6jFNeuxzUUjZzUljjPEYK3EbY4zHWOA2xhiPsQ44eUREkoA//ZK6quqGDLaNVdXIXMmYyVMiUhaY7i6eBiQBu93ls1U1Pk8yZvIVq+POI9kJxha4CycRGQbEqupLfmmhqpqYd7ky+YFVleQTIhIpItNFZImI/CkiXdLZpqKIzBaRZSLyl4ic56ZfJCLz3H0/FxEL8gWIiHwoIm+LyO/ACyIyTEQe8Fv/l4hUc+evE5EF7mfkHREJyat8m+CxwJ13irl/XMtEZDJwFOimqs2A9sDLIicMnnAt8KOqNgEaA8tEpBwwFLjA3XcRMDDXrsLklsrAuaqa4f+tiNQDrgZau5+RJKB37mTP5Car4847ce4fFwAiEgY8IyJtgWSgElAB2OG3z0LgA3fbKaq6TETOB+oDc904XwSYlzuXYHLR56qalMU2HYHmwEL3s1AM2BXsjJncZ4E7/+gNlAeaq2qCiGwAwv03UNXZbmC/DPhQREYAMcBPqnpNbmfY5KrDfvOJHP9rOeVzIsBYVX0k13Jl8oRVleQfpYBdbtBuD1RNu4GIVAV2quq7wHtAM2A+0FpEarrbFBeR2rmYb5P7NuD83yMizYDqbvp0oIeIRLvrotzPjClgrMSdf3wMfC0if+LUU69KZ5t2wIMikgDEAjeo6m4RuRGYICJF3e2GAquDn2WTR74EbhCRv4Hfcf+vVXWFiAwFpomID0gA7gI25llOTVBYc0BjjPEYqyoxxhiPscBtjDEeY4HbGGM8xgK3McZ4jAVuY4zxGAvcxhjjMRa4jTHGYyxwG2OMx1jgNsYYj7HAbYwxHmOB2xhjPMYCtzHGeIwFbmOM8RgL3MYY4zEWuI0xxmMscBtjjMdY4DbHEZEk98nzf4nI5yIScQrH+lBEerjz74lI/Uy2bSci557EOTa4T7r3TxsjIrenSesqIt8Hkldj8jsL3CatOFVtoqoNgXjgDv+VInJSj7tT1VtVdUUmm7QDsh24MzAB6JUmrZebboznWeA2mZkD1HRLw3NEZCqwQkRCRORFEVkoIstTSrfieENE/hGRn4HolAOJyCwRaeHOXyIiS0TkDxGZLiLVcL4g7nNL++eJSHkR+dI9x0IRae3uW1ZEponI3yLyHs6TzdOaDtQVkYruPsWBC4ApIvKYe7y/RGS0iJywv38pXkRaiMislOOIyAciskBElopIFze9gZu2zH0/auXEm29MRixwm3S5JetLgT/dpGbAPapaG7gFOKCqLYGWwG0iUh3oBtQB6gM3kE4JWkTKA+8C3VW1MXCVqm4A3gZecUv7c4CR7nJLoDvOU+0BHgd+VdUGwGTgjLTnUNUknAfq9nSTLgdmqepB4A1Vben+oigGdM7G2zIEmKGqZwPtgRfdL4U7gJGq2gRoAWzJxjGNyTZ7yrtJq5iILHPn5wDv4wTgBar6r5t+EdDIr064FFALaAtMcAPnNhGZkc7xWwGzU46lqvsyyMcFQH2/AnFJEYl0z3Glu++3IhKTwf4TgJdwvgB6AePd9PYi8hAQAUQBfwNfZ3CMtC4CrhCRB9zlcJwvjnnAEBGpDExS1TUBHs+Yk2KB26QV55YcU7nB87B/EnC3qv6YZrtOOZgPH9BKVY+mk5dA/AZUFJHGOF88vUQkHHgLaKGqm0VkGE7wTSuR/36N+q8XnF8K/6TZfqWI/A5cBnwnIreranpfWsbkCKsqMSfjR6CfiIQBiEhtt8pgNnC1WwdeEac6Ia35QFu3agURiXLTDwEl/LabBtydsiAiTdzZ2cC1btqlQJn0MqiqCnwGjAW+d78AUoLwHrf0nlErkg1Ac3e+e5rrvjulXlxEmrqvZwLrVfU14CugUQbHNSZHWOA2J+M9YAWwRET+At7B+fU2GVjjrhuHU4VwHFXdDfQFJonIHzjBFZzqim4pNyeBAUAL92bfCv5r3TIcJ/D/jVNlsimTfE4AGruvqOp+nPr1v3CC8MIM9hsOjBSRRUCSX/qTQBiw3D3/k256T+Avt4qpoXvtxgSNOAUTY4wxXmElbmOM8RgL3MYY4zEWuI0xxmMscBtjjMdY4DbGGI+xwG2MMR5jgdsYYzzGArcxxnjM/wHVkTW8fnCoMQAAAABJRU5ErkJggg==\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "from sklearn.metrics import confusion_matrix\n", + "import seaborn as sns\n", + "\n", + "\n", + "cf_matrix = confusion_matrix(labels, y_pred)\n", + "group_names = ['True Neg','False Pos','False Neg','True Pos']\n", + "group_counts = [\"{0:0.0f}\".format(value) for value in cf_matrix.flatten()]\n", + "group_percentages = [\"{0:.2%}\".format(value) for value in\n", + " cf_matrix.flatten()/np.sum(cf_matrix)]\n", + "\n", + "labels = [f\"{v1}\\n{v2}\\n{v3}\" for v1, v2, v3 in\n", + " zip(group_names,group_counts,group_percentages)]\n", + "\n", + "labels = np.asarray(labels).reshape(2,2)\n", + "\n", + "ax = sns.heatmap(cf_matrix, annot=labels, fmt='', cmap='Blues')\n", + "ax.set_title('Seaborn Confusion Matrix with labels\\n\\n');\n", + "ax.set_xlabel('\\nPredicted Values')\n", + "ax.set_ylabel('Actual Values ');\n", + "\n", + "## Ticket labels - List must be in alphabetical order\n", + "ax.xaxis.set_ticklabels(['False','True'])\n", + "ax.yaxis.set_ticklabels(['False','True'])\n", + "\n", + "## Display the visualization of the Confusion Matrix.\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "15e442ff", + "metadata": {}, + "outputs": [], + "source": [ + "import torch\n", + "from torchvision import transforms\n", + "import numpy as np\n", + "from PIL import ImageDraw\n", + "\n", + "\n", + "# https://gitlab.idiap.ch/bob/bob.paper.deep_pix_bis_pad.icb2019/blob/master/bob/paper/deep_pix_bis_pad/icb2019/extractor/DeepPixBiS.py\n", + "def predict(mask, label, threshold=0.5, score_type='combined'):\n", + " with torch.no_grad():\n", + " if score_type == 'pixel':\n", + " score = torch.mean(mask, axis=(1,2,3))\n", + " elif score_type == 'binary':\n", + " score = torch.mean(label, axis=1)\n", + " elif score_type == 'combined':\n", + " score = torch.mean(mask, axis=(1,2)) + torch.mean(label, axis=1)\n", + " else:\n", + " raise NotImplementedError\n", + "\n", + " preds = (score > threshold).type(torch.FloatTensor)\n", + "\n", + " return preds, score\n", + " \n", + "\n", + "def calc_acc(pred, target):\n", + " equal = torch.mean(pred.eq(target).type(torch.FloatTensor))\n", + " return equal.item()\n", + "\n", + "\n", + "def add_images_tb(cfg, epoch, img_batch, preds, targets, score, writer):\n", + " \"\"\" Do the inverse transformation\n", + " x = z*sigma + mean\n", + " = (z + mean/sigma) * sigma\n", + " = (z - (-mean/sigma)) / (1/sigma),\n", + " Ref: https://discuss.pytorch.org/t/simple-way-to-inverse-transform-normalization/4821/6\n", + " \"\"\"\n", + " mean = [-cfg['dataset']['mean'][i] / cfg['dataset']['sigma'][i] for i in range(len(cfg['dataset']['mean']))]\n", + " sigma = [1 / cfg['dataset']['sigma'][i] for i in range(len(cfg['dataset']['sigma']))]\n", + " img_transform = transforms.Compose([\n", + " transforms.Normalize(mean, sigma),\n", + " transforms.ToPILImage()\n", + " ])\n", + "\n", + " ts_transform = transforms.ToTensor()\n", + "\n", + " for idx in range(img_batch.shape[0]):\n", + " vis_img = img_transform(img_batch[idx].cpu())\n", + " ImageDraw.Draw(vis_img).text((0,0), 'pred: {} vs gt: {}'.format(int(preds[idx]), int(targets[idx])), (255,0,255))\n", + " ImageDraw.Draw(vis_img).text((20,20), 'score {}'.format(score[idx]), (255,0,255))\n", + " tb_img = ts_transform(vis_img)\n", + " writer.add_image('Prediction visualization/{}'.format(idx), tb_img, epoch)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "51425c64", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "38d063f2", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "fc95e320", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "71207aa8", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.7" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +}