From d9df29f04a6b32caddcfa3aa6c15fd536204ccf7 Mon Sep 17 00:00:00 2001 From: colin Date: Fri, 23 Aug 2019 23:27:45 +0800 Subject: [PATCH] train with pretrain --- .gitignore | 1 + FilterEvaluator/Evaluator.py | 75 +++------ FilterEvaluator/TrainNetwork.py | 74 ++++++--- FilterEvaluator/checkpoint.pkl | Bin 14040 -> 14349 bytes FilterEvaluator/checkpointSGD.pkl | Bin 12056 -> 14040 bytes FilterEvaluator/checkpointSGDPreTrain.pkl | Bin 0 -> 14040 bytes FilterEvaluator/image/0.png | Bin 0 -> 77 bytes FilterEvaluator/image/1.png | Bin 0 -> 77 bytes FilterEvaluator/image/2.png | Bin 0 -> 77 bytes FilterEvaluator/image/3.png | Bin 0 -> 77 bytes FilterEvaluator/image/4.png | Bin 0 -> 77 bytes FilterEvaluator/image/5.png | Bin 0 -> 77 bytes FilterEvaluator/image/6.png | Bin 0 -> 77 bytes FilterEvaluator/image/7.png | Bin 0 -> 77 bytes FilterEvaluator/image2/0.png | Bin 0 -> 77 bytes FilterEvaluator/image2/1.png | Bin 0 -> 77 bytes FilterEvaluator/image2/2.png | Bin 0 -> 77 bytes FilterEvaluator/image2/3.png | Bin 0 -> 77 bytes FilterEvaluator/image2/4.png | Bin 0 -> 77 bytes FilterEvaluator/image2/5.png | Bin 0 -> 77 bytes FilterEvaluator/image2/6.png | Bin 0 -> 77 bytes FilterEvaluator/image2/7.png | Bin 0 -> 77 bytes PaintVgg19/PaintVgg19Weight.py | 180 +++++++++++----------- tools/Loader.py | 26 ++-- tools/Train.py | 24 +-- tools/WebVisual.py | 64 ++++++++ 26 files changed, 255 insertions(+), 189 deletions(-) create mode 100644 FilterEvaluator/checkpointSGDPreTrain.pkl create mode 100644 FilterEvaluator/image/0.png create mode 100644 FilterEvaluator/image/1.png create mode 100644 FilterEvaluator/image/2.png create mode 100644 FilterEvaluator/image/3.png create mode 100644 FilterEvaluator/image/4.png create mode 100644 FilterEvaluator/image/5.png create mode 100644 FilterEvaluator/image/6.png create mode 100644 FilterEvaluator/image/7.png create mode 100644 FilterEvaluator/image2/0.png create mode 100644 FilterEvaluator/image2/1.png create mode 100644 FilterEvaluator/image2/2.png create mode 100644 FilterEvaluator/image2/3.png create mode 100644 FilterEvaluator/image2/4.png create mode 100644 FilterEvaluator/image2/5.png create mode 100644 FilterEvaluator/image2/6.png create mode 100644 FilterEvaluator/image2/7.png create mode 100644 tools/WebVisual.py diff --git a/.gitignore b/.gitignore index 9ae0c17..efb8193 100644 --- a/.gitignore +++ b/.gitignore @@ -6,3 +6,4 @@ __pycache__/ Dataset/ .vscode /*/__pycache__ +.mypy_cache diff --git a/FilterEvaluator/Evaluator.py b/FilterEvaluator/Evaluator.py index 9e4567b..0a96e60 100644 --- a/FilterEvaluator/Evaluator.py +++ b/FilterEvaluator/Evaluator.py @@ -39,63 +39,19 @@ model = utils.SetDevice(Model.Net3Grad335()) -# model = utils.LoadModel(model, CurrentPath+"/checkpoint.pkl") +model = utils.LoadModel(model, CurrentPath+"/checkpoint.pkl") -# a = model.features[0].weight.data - - - - # traindata, testdata = Loader.MNIST(batchsize) # traindata, testdata = Loader.RandomMnist(batchsize, style="Vertical") # traindata, testdata = Loader.RandomMnist(batchsize, style="Horizontal") # traindata, testdata = Loader.RandomMnist(batchsize, style="VerticalOneLine") # traindata, testdata = Loader.RandomMnist(batchsize, style="VerticalZebra") # traindata, testdata = Loader.Cifar10Mono(batchsize) -traindata, testdata = Loader.Cifar10Mono(batchsize, num_workers=2, shuffle=True) - - -# def GetSample(netmodel,layer,dataloader,iteration=-1): -# netmodel.eval() -# sample = [] -# for batch_idx, (data, target) in enumerate(dataloader): -# data = utils.SetDevice(data) -# target = utils.SetDevice(target) -# layerout = [] -# layerint = [] -# def getnet(self, input, output): -# layerout.append(output) -# layerint.append(input) -# handle = netmodel.features[layer].register_forward_hook(getnet) -# netmodel.forwardLayer(data,layer=layer) -# output = layerout[0][:,:,:,:] - -# handle.remove() -# data.detach() -# target.detach() - -# sample.append(output.cpu().detach().numpy()) -# if iteration > 0 and batch_idx >= (iteration-1): -# break - -# sample = np.array(sample) -# sample = np.swapaxes(sample,2,0) -# sample = np.reshape(sample,(sample.shape[0],-1)) - -# active = [] -# for i in range(sample.shape[0]): -# data = sample[i] -# mean = np.mean(data) -# dat1 = np.mean(np.abs(data - mean)) -# dat2 = (data - mean)/dat1 -# dat2 = np.mean(dat2*dat2) -# active.append(dat2) - -# return active +traindata, testdata = Loader.Cifar10Mono(batchsize, num_workers=0, shuffle=True) def GetSample(netmodel,layer,dataloader,iteration=-1): @@ -128,15 +84,18 @@ def GetSample(netmodel,layer,dataloader,iteration=-1): dat2 = torch.mean(dat2 * dat2,dim=1) return dat2.cpu().detach().numpy() -def weightToImage(weight,filename): - a2 = model.features[layear].weight.data[channel] - a2 = a2.cpu().detach().numpy().reshape(( a2.shape[-2], a2.shape[-1])) - - a2min = np.min(a2) - a2max = np.max(a2) - a2 = (a2 - a2min)*255.0/(a2max-a2min) - a2 = a2.astype(int) - cv2.imwrite(filename,a2) +def ConvKernelToImage(model, layer, foldname): + if not os.path.exists(foldname): + os.mkdir(foldname) + a2 = model.features[layer].weight.data + a2 = a2.cpu().detach().numpy().reshape((-1, a2.shape[-2], a2.shape[-1])) + for i in range(a2.shape[0]): + d = a2[i] + dmin = np.min(d) + dmax = np.max(d) + d = (d - dmin)*255.0/(dmax-dmin) + d = d.astype(int) + cv2.imwrite(foldname+"/"+str(i)+".png", d) def GetRandomSocre(netmodel,layer,dataloader,iteration=-1): weightshape = netmodel.features[layer].weight.data.shape @@ -148,6 +107,12 @@ def GetRandomSocre(netmodel,layer,dataloader,iteration=-1): +ConvKernelToImage(model, 0, CurrentPath+"image") + + + + + layer = 0 weightshape = list(model.features[layer].weight.data.shape) diff --git a/FilterEvaluator/TrainNetwork.py b/FilterEvaluator/TrainNetwork.py index 23ea5a4..9ad166b 100644 --- a/FilterEvaluator/TrainNetwork.py +++ b/FilterEvaluator/TrainNetwork.py @@ -14,6 +14,7 @@ from torch.utils.data import Dataset, DataLoader from PIL import Image import random import cv2 +from visdom import Visdom CurrentPath = os.path.split(os.path.realpath(__file__))[0]+"/" @@ -23,36 +24,73 @@ sys.path.append(CurrentPath+'../tools') sys.path.append(CurrentPath+'../') import Model -from tools import utils, Train, Loader +from tools import utils, Train, Loader, WebVisual + batchsize = 128 + +# traindata, testdata = Loader.MNIST(batchsize, num_workers=4) +# traindata, testdata = Loader.RandomMnist(batchsize, num_workers=4, style="Vertical") +# traindata, testdata = Loader.RandomMnist(batchsize, num_workers=4, style="Horizontal") +# traindata, testdata = Loader.RandomMnist(batchsize, num_workers=4, style="VerticalOneLine") +# traindata, testdata = Loader.RandomMnist(batchsize, num_workers=4, style="VerticalZebra") +traindata, testdata = Loader.Cifar10Mono(batchsize, num_workers=4,shuffle=True,trainsize=500) + + + + + + + + +WebVisual.InitVisdom() +window = WebVisual.LineWin() +lineNoPre = WebVisual.Line("NoPre") +linePretrain = WebVisual.Line("Pretrain") + + + + + + # model = utils.SetDevice(Model.Net535()) # model = utils.SetDevice(Model.Net5Grad35()) # model = utils.SetDevice(Model.Net31535()) -# model = utils.SetDevice(Model.Net3335()) # Test set: Average loss: 1.5294, Accuracy: 4501/10000 (45%) +# model = utils.SetDevice(Model.Net3335()) model = utils.SetDevice(Model.Net3Grad335()) +# model = utils.LoadModel(model, CurrentPath+"/checkpoint.pkl") + + + +optimizer = optim.SGD(model.parameters(), lr=0.1) +# optimizer = optim.Adam(model.parameters(), lr=0.01) + + + model = utils.LoadModel(model, CurrentPath+"/checkpoint.pkl") - -optimizer = optim.SGD(model.parameters(), lr=0.01) - - -# traindata, testdata = Loader.MNIST(batchsize, num_workers=8) -# traindata, testdata = Loader.RandomMnist(batchsize, num_workers=8, style="Vertical") -# traindata, testdata = Loader.RandomMnist(batchsize, num_workers=8, style="Horizontal") -# traindata, testdata = Loader.RandomMnist(batchsize, num_workers=8, style="VerticalOneLine") -# traindata, testdata = Loader.RandomMnist(batchsize, num_workers=8, style="VerticalZebra") -traindata, testdata = Loader.Cifar10Mono(batchsize, num_workers=8) - - - -for i in range(300): +for i in range(2000): Train.train(model,traindata,optimizer,epoch=i) - Train.test(model,testdata) + window.AppendData(linePretrain,Train.test(model,testdata)) -utils.SaveModel(model,CurrentPath+"/checkpoint.pkl") + + +model = utils.SetDevice(Model.Net3335()) +optimizer = optim.SGD(model.parameters(), lr=0.1) +for i in range(2000): + Train.train(model, traindata, optimizer, epoch=i) + window.AppendData(lineNoPre, Train.test(model, testdata)) + + + + + + + + +# utils.SaveModel(model,CurrentPath+"/checkpointSGDPreTrain.pkl") diff --git a/FilterEvaluator/checkpoint.pkl b/FilterEvaluator/checkpoint.pkl index 47ff896a6b402ee4d996e51683d03bc7501748cc..ba7ded64f8d868d655202a7671b9c823e9fa88a4 100644 GIT binary patch literal 14349 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\^i-y46Dd2>A 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 diff --git a/FilterEvaluator/checkpointSGD.pkl b/FilterEvaluator/checkpointSGD.pkl index cfc6f12da7549646f45339eb7c074d31dbb51448..7a9b4a3ccc06823fcbb5d005bf655ba6499d89fe 100644 GIT binary patch literal 14040 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 diff --git a/FilterEvaluator/checkpointSGDPreTrain.pkl b/FilterEvaluator/checkpointSGDPreTrain.pkl new file mode 100644 index 0000000000000000000000000000000000000000..54990fcf69e9ebdce6080ddfcf0a002456c6085c GIT binary patch literal 14040 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 literal 0 HcmV?d00001 diff --git a/FilterEvaluator/image/1.png b/FilterEvaluator/image/1.png new file mode 100644 index 0000000000000000000000000000000000000000..ff829b020362569800eb8c571e1b6eeea4d4c617 GIT binary patch literal 77 zcmeAS@N?(olHy`uVBq!ia0vp^%plAGBp8aFUnK)65lmdKI;Vst07twMNB{r; literal 0 HcmV?d00001 diff --git a/FilterEvaluator/image/3.png b/FilterEvaluator/image/3.png new file mode 100644 index 0000000000000000000000000000000000000000..d00d75897d67a082ca929dc40a23bedbc1f8f00b GIT binary patch literal 77 zcmeAS@N?(olHy`uVBq!ia0vp^%plAGBp8aFUnK)65lqMmfP;P4Ov0zJYD@<);T3K0RVTY6c_*i literal 0 HcmV?d00001 diff --git a/FilterEvaluator/image/6.png b/FilterEvaluator/image/6.png new file mode 100644 index 0000000000000000000000000000000000000000..38a48b7675389b95db4939b7116237e1118b1917 GIT binary patch literal 77 zcmeAS@N?(olHy`uVBq!ia0vp^%plAGBp8aFUnK)65lzopr0Ao`V$p8QV literal 0 HcmV?d00001 diff --git a/FilterEvaluator/image/7.png b/FilterEvaluator/image/7.png new file mode 100644 index 0000000000000000000000000000000000000000..e9cdabb8b18edf6b91618e7bcd34e0380321a384 GIT binary patch literal 77 zcmeAS@N?(olHy`uVBq!ia0vp^%plAGBp8aFUnK)65l7&xv(hM YkU>I@MbmowsXHKbp00i_>zopr0Ce9I@c;k- literal 0 HcmV?d00001 diff --git a/FilterEvaluator/image2/0.png b/FilterEvaluator/image2/0.png new file mode 100644 index 0000000000000000000000000000000000000000..7c82e052dd9576c535a3b5f4a97f5bc60d10f605 GIT binary patch literal 77 zcmeAS@N?(olHy`uVBq!ia0vp^%plAGBp8aFUnK)65lG6Nj Z*Nn28SeIXE^b-K7^K|udS?83{1OScM6!8E6 literal 0 HcmV?d00001 diff --git a/FilterEvaluator/image2/1.png b/FilterEvaluator/image2/1.png new file mode 100644 index 0000000000000000000000000000000000000000..8d58d45ac287c03f7232f34326ffc12341b28744 GIT binary patch literal 77 zcmeAS@N?(olHy`uVBq!ia0vp^%plAGBp8aFUnK)65lmdKI;Vst05#wd{{R30 literal 0 HcmV?d00001 diff --git a/FilterEvaluator/image2/5.png b/FilterEvaluator/image2/5.png new file mode 100644 index 0000000000000000000000000000000000000000..e9f149d20006261c80211340512da1adb4dce80c GIT binary patch literal 77 zcmeAS@N?(olHy`uVBq!ia0vp^%plAGBp8aFUnK)65lmdKI;Vst07eKB1poj5 literal 0 HcmV?d00001 diff --git a/FilterEvaluator/image2/6.png b/FilterEvaluator/image2/6.png new file mode 100644 index 0000000000000000000000000000000000000000..6208ccfcdedff8ea7dad990e435f61a9aadc3789 GIT binary patch literal 77 zcmeAS@N?(olHy`uVBq!ia0vp^%plAGBp8aFUnK)65lzopr0EwIw^#A|> literal 0 HcmV?d00001 diff --git a/FilterEvaluator/image2/7.png b/FilterEvaluator/image2/7.png new file mode 100644 index 0000000000000000000000000000000000000000..846a68742657dc7d68fed0d1624a02b76ec9a091 GIT binary patch literal 77 zcmeAS@N?(olHy`uVBq!ia0vp^%plAGBp8aFUnK)65li*Pgg&ebxsLQ09*YNbN~PV literal 0 HcmV?d00001 diff --git a/PaintVgg19/PaintVgg19Weight.py b/PaintVgg19/PaintVgg19Weight.py index 265214d..b73edd8 100755 --- a/PaintVgg19/PaintVgg19Weight.py +++ b/PaintVgg19/PaintVgg19Weight.py @@ -1,5 +1,5 @@ from __future__ import print_function -from vgg19Pytorch import Vgg19Module +# from vgg19Pytorch import Vgg19Module import torch import torch.nn as nn import torch.nn.functional as F @@ -83,94 +83,94 @@ for w, p in zip(words[top5], probs): print('{}\tprobability:{}'.format(w, p)) #endregion -# region write image and weight -image = readAndPreprocessImage(CurrentPath+"dog_resize.jpg") -conv1_1_pad = F.pad(image, (1L, 1L, 1L, 1L)) -conv1_1 = vgg19.conv1_1(conv1_1_pad) -relu1_1 = F.relu(conv1_1) -conv1_2_pad = F.pad(relu1_1, (1L, 1L, 1L, 1L)) -conv1_2 = vgg19.conv1_2(conv1_2_pad) -relu1_2 = F.relu(conv1_2) -pool1 = F.max_pool2d(relu1_2, kernel_size=(2L, 2L), stride=(2L, 2L), padding=(0L,), ceil_mode=True) -conv2_1_pad = F.pad(pool1, (1L, 1L, 1L, 1L)) -conv2_1 = vgg19.conv2_1(conv2_1_pad) -relu2_1 = F.relu(conv2_1) -conv2_2_pad = F.pad(relu2_1, (1L, 1L, 1L, 1L)) -conv2_2 = vgg19.conv2_2(conv2_2_pad) -relu2_2 = F.relu(conv2_2) -pool2 = F.max_pool2d(relu2_2, kernel_size=(2L, 2L), stride=(2L, 2L), padding=(0L,), ceil_mode=True) -conv3_1_pad = F.pad(pool2, (1L, 1L, 1L, 1L)) -conv3_1 = vgg19.conv3_1(conv3_1_pad) -relu3_1 = F.relu(conv3_1) -conv3_2_pad = F.pad(relu3_1, (1L, 1L, 1L, 1L)) -conv3_2 = vgg19.conv3_2(conv3_2_pad) -relu3_2 = F.relu(conv3_2) -conv3_3_pad = F.pad(relu3_2, (1L, 1L, 1L, 1L)) -conv3_3 = vgg19.conv3_3(conv3_3_pad) -relu3_3 = F.relu(conv3_3) -conv3_4_pad = F.pad(relu3_3, (1L, 1L, 1L, 1L)) -conv3_4 = vgg19.conv3_4(conv3_4_pad) -relu3_4 = F.relu(conv3_4) -pool3 = F.max_pool2d(relu3_4, kernel_size=(2L, 2L), stride=(2L, 2L), padding=(0L,), ceil_mode=True) -conv4_1_pad = F.pad(pool3, (1L, 1L, 1L, 1L)) -conv4_1 = vgg19.conv4_1(conv4_1_pad) -relu4_1 = F.relu(conv4_1) -conv4_2_pad = F.pad(relu4_1, (1L, 1L, 1L, 1L)) -conv4_2 = vgg19.conv4_2(conv4_2_pad) -relu4_2 = F.relu(conv4_2) -conv4_3_pad = F.pad(relu4_2, (1L, 1L, 1L, 1L)) -conv4_3 = vgg19.conv4_3(conv4_3_pad) -relu4_3 = F.relu(conv4_3) -conv4_4_pad = F.pad(relu4_3, (1L, 1L, 1L, 1L)) -conv4_4 = vgg19.conv4_4(conv4_4_pad) -relu4_4 = F.relu(conv4_4) -pool4 = F.max_pool2d(relu4_4, kernel_size=(2L, 2L), stride=(2L, 2L), padding=(0L,), ceil_mode=True) -conv5_1_pad = F.pad(pool4, (1L, 1L, 1L, 1L)) -conv5_1 = vgg19.conv5_1(conv5_1_pad) -relu5_1 = F.relu(conv5_1) -conv5_2_pad = F.pad(relu5_1, (1L, 1L, 1L, 1L)) -conv5_2 = vgg19.conv5_2(conv5_2_pad) -relu5_2 = F.relu(conv5_2) -conv5_3_pad = F.pad(relu5_2, (1L, 1L, 1L, 1L)) -conv5_3 = vgg19.conv5_3(conv5_3_pad) -relu5_3 = F.relu(conv5_3) -conv5_4_pad = F.pad(relu5_3, (1L, 1L, 1L, 1L)) -conv5_4 = vgg19.conv5_4(conv5_4_pad) -relu5_4 = F.relu(conv5_4) -pool5 = F.max_pool2d(relu5_4, kernel_size=(2L, 2L), stride=(2L, 2L), padding=(0L,), ceil_mode=True) -fc6_0 = pool5.view(pool5.size(0), -1) +# # region write image and weight +# image = readAndPreprocessImage(CurrentPath+"dog_resize.jpg") +# conv1_1_pad = F.pad(image, (1L, 1L, 1L, 1L)) +# conv1_1 = vgg19.conv1_1(conv1_1_pad) +# relu1_1 = F.relu(conv1_1) +# conv1_2_pad = F.pad(relu1_1, (1L, 1L, 1L, 1L)) +# conv1_2 = vgg19.conv1_2(conv1_2_pad) +# relu1_2 = F.relu(conv1_2) +# pool1 = F.max_pool2d(relu1_2, kernel_size=(2L, 2L), stride=(2L, 2L), padding=(0L,), ceil_mode=True) +# conv2_1_pad = F.pad(pool1, (1L, 1L, 1L, 1L)) +# conv2_1 = vgg19.conv2_1(conv2_1_pad) +# relu2_1 = F.relu(conv2_1) +# conv2_2_pad = F.pad(relu2_1, (1L, 1L, 1L, 1L)) +# conv2_2 = vgg19.conv2_2(conv2_2_pad) +# relu2_2 = F.relu(conv2_2) +# pool2 = F.max_pool2d(relu2_2, kernel_size=(2L, 2L), stride=(2L, 2L), padding=(0L,), ceil_mode=True) +# conv3_1_pad = F.pad(pool2, (1L, 1L, 1L, 1L)) +# conv3_1 = vgg19.conv3_1(conv3_1_pad) +# relu3_1 = F.relu(conv3_1) +# conv3_2_pad = F.pad(relu3_1, (1L, 1L, 1L, 1L)) +# conv3_2 = vgg19.conv3_2(conv3_2_pad) +# relu3_2 = F.relu(conv3_2) +# conv3_3_pad = F.pad(relu3_2, (1L, 1L, 1L, 1L)) +# conv3_3 = vgg19.conv3_3(conv3_3_pad) +# relu3_3 = F.relu(conv3_3) +# conv3_4_pad = F.pad(relu3_3, (1L, 1L, 1L, 1L)) +# conv3_4 = vgg19.conv3_4(conv3_4_pad) +# relu3_4 = F.relu(conv3_4) +# pool3 = F.max_pool2d(relu3_4, kernel_size=(2L, 2L), stride=(2L, 2L), padding=(0L,), ceil_mode=True) +# conv4_1_pad = F.pad(pool3, (1L, 1L, 1L, 1L)) +# conv4_1 = vgg19.conv4_1(conv4_1_pad) +# relu4_1 = F.relu(conv4_1) +# conv4_2_pad = F.pad(relu4_1, (1L, 1L, 1L, 1L)) +# conv4_2 = vgg19.conv4_2(conv4_2_pad) +# relu4_2 = F.relu(conv4_2) +# conv4_3_pad = F.pad(relu4_2, (1L, 1L, 1L, 1L)) +# conv4_3 = vgg19.conv4_3(conv4_3_pad) +# relu4_3 = F.relu(conv4_3) +# conv4_4_pad = F.pad(relu4_3, (1L, 1L, 1L, 1L)) +# conv4_4 = vgg19.conv4_4(conv4_4_pad) +# relu4_4 = F.relu(conv4_4) +# pool4 = F.max_pool2d(relu4_4, kernel_size=(2L, 2L), stride=(2L, 2L), padding=(0L,), ceil_mode=True) +# conv5_1_pad = F.pad(pool4, (1L, 1L, 1L, 1L)) +# conv5_1 = vgg19.conv5_1(conv5_1_pad) +# relu5_1 = F.relu(conv5_1) +# conv5_2_pad = F.pad(relu5_1, (1L, 1L, 1L, 1L)) +# conv5_2 = vgg19.conv5_2(conv5_2_pad) +# relu5_2 = F.relu(conv5_2) +# conv5_3_pad = F.pad(relu5_2, (1L, 1L, 1L, 1L)) +# conv5_3 = vgg19.conv5_3(conv5_3_pad) +# relu5_3 = F.relu(conv5_3) +# conv5_4_pad = F.pad(relu5_3, (1L, 1L, 1L, 1L)) +# conv5_4 = vgg19.conv5_4(conv5_4_pad) +# relu5_4 = F.relu(conv5_4) +# pool5 = F.max_pool2d(relu5_4, kernel_size=(2L, 2L), stride=(2L, 2L), padding=(0L,), ceil_mode=True) +# fc6_0 = pool5.view(pool5.size(0), -1) -imageVisual(conv1_1, "conv1_1", 8) -imageVisual(conv1_2, 'conv1_2', 8) -imageVisual(conv2_1, "conv2_1", 16) -imageVisual(conv2_2, "conv2_2", 16) -imageVisual(conv3_1, "conv3_1", 16) -imageVisual(conv3_2, "conv3_2", 16) -imageVisual(conv3_3, "conv3_3", 16) -imageVisual(conv3_4, "conv3_4", 16) -imageVisual(conv4_1, "conv4_1", 32) -imageVisual(conv4_2, "conv4_2", 32) -imageVisual(conv4_3, "conv4_3", 32) -imageVisual(conv4_4, "conv4_4", 32) -imageVisual(conv5_1, "conv5_1", 32) -imageVisual(conv5_2, "conv5_2", 32) -imageVisual(conv5_3, "conv5_3", 32) -imageVisual(conv5_4, "conv5_4", 32) +# imageVisual(conv1_1, "conv1_1", 8) +# imageVisual(conv1_2, 'conv1_2', 8) +# imageVisual(conv2_1, "conv2_1", 16) +# imageVisual(conv2_2, "conv2_2", 16) +# imageVisual(conv3_1, "conv3_1", 16) +# imageVisual(conv3_2, "conv3_2", 16) +# imageVisual(conv3_3, "conv3_3", 16) +# imageVisual(conv3_4, "conv3_4", 16) +# imageVisual(conv4_1, "conv4_1", 32) +# imageVisual(conv4_2, "conv4_2", 32) +# imageVisual(conv4_3, "conv4_3", 32) +# imageVisual(conv4_4, "conv4_4", 32) +# imageVisual(conv5_1, "conv5_1", 32) +# imageVisual(conv5_2, "conv5_2", 32) +# imageVisual(conv5_3, "conv5_3", 32) +# imageVisual(conv5_4, "conv5_4", 32) -weightVisual(vgg19.conv1_1, "conv1_1") -weightVisual(vgg19.conv1_2, 'conv1_2') -weightVisual(vgg19.conv2_1, "conv2_1") -weightVisual(vgg19.conv2_2, "conv2_2") -weightVisual(vgg19.conv3_1, "conv3_1") -weightVisual(vgg19.conv3_2, "conv3_2") -weightVisual(vgg19.conv3_3, "conv3_3") -weightVisual(vgg19.conv3_4, "conv3_4") -weightVisual(vgg19.conv4_1, "conv4_1") -weightVisual(vgg19.conv4_2, "conv4_2") -weightVisual(vgg19.conv4_3, "conv4_3") -weightVisual(vgg19.conv4_4, "conv4_4") -weightVisual(vgg19.conv5_1, "conv5_1") -weightVisual(vgg19.conv5_2, "conv5_2") -weightVisual(vgg19.conv5_3, "conv5_3") -weightVisual(vgg19.conv5_4, "conv5_4") -# endregion +# weightVisual(vgg19.conv1_1, "conv1_1") +# weightVisual(vgg19.conv1_2, 'conv1_2') +# weightVisual(vgg19.conv2_1, "conv2_1") +# weightVisual(vgg19.conv2_2, "conv2_2") +# weightVisual(vgg19.conv3_1, "conv3_1") +# weightVisual(vgg19.conv3_2, "conv3_2") +# weightVisual(vgg19.conv3_3, "conv3_3") +# weightVisual(vgg19.conv3_4, "conv3_4") +# weightVisual(vgg19.conv4_1, "conv4_1") +# weightVisual(vgg19.conv4_2, "conv4_2") +# weightVisual(vgg19.conv4_3, "conv4_3") +# weightVisual(vgg19.conv4_4, "conv4_4") +# weightVisual(vgg19.conv5_1, "conv5_1") +# weightVisual(vgg19.conv5_2, "conv5_2") +# weightVisual(vgg19.conv5_3, "conv5_3") +# weightVisual(vgg19.conv5_4, "conv5_4") +# # endregion diff --git a/tools/Loader.py b/tools/Loader.py index 6f1b289..91893d3 100644 --- a/tools/Loader.py +++ b/tools/Loader.py @@ -1,17 +1,13 @@ -# from __future__ import print_function import os import torch import torchvision from torchvision import datasets, transforms import torchvision.models as models import numpy as np -from torch.utils.data import Dataset, DataLoader +from torch.utils.data import Dataset, DataLoader, Subset import random - - - def MNIST(batchsize=8, num_workers=0, shuffle=False): CurrentPath = os.path.split(os.path.realpath(__file__))[0]+"/" train_loader = torch.utils.data.DataLoader( @@ -46,23 +42,24 @@ def Cifar10(batchsize=8, num_workers=0, shuffle=False): return train_loader, test_loader -def Cifar10Mono(batchsize=8, num_workers=0, shuffle=False): +def Cifar10Mono(batchsize=8, num_workers=0, shuffle=False, trainsize=0): CurrentPath = os.path.split(os.path.realpath(__file__))[0]+"/" - + dataset = datasets.CIFAR10(root=CurrentPath+'../Dataset/', train=True, download=True, + transform=transforms.Compose([ + transforms.Grayscale(), + transforms.ToTensor(), + transforms.Normalize((0.1307,), (0.3081,)) + ])) + if trainsize == 0: + trainsize = dataset.data.shape[0] train_loader = torch.utils.data.DataLoader( - datasets.CIFAR10(root=CurrentPath+'../Dataset/', train=True, download=True, - transform=transforms.Compose([ - transforms.Grayscale(), - transforms.ToTensor(), - transforms.Normalize((0.1307,), (0.3081,)) - ])), batch_size=batchsize, shuffle=shuffle, num_workers=num_workers, drop_last=True) + Subset(dataset, range(0, trainsize)), batch_size=batchsize, shuffle=shuffle, num_workers=num_workers, drop_last=True) test_loader = torch.utils.data.DataLoader( datasets.CIFAR10(root=CurrentPath+'../Dataset/', train=False, transform=transforms.Compose([ transforms.Grayscale(), transforms.ToTensor(), transforms.Normalize((0.1307,), (0.3081,)) ])), batch_size=batchsize, shuffle=shuffle, num_workers=num_workers, drop_last=True) - return train_loader, test_loader def RandomMnist(batchsize=8, num_workers=0, shuffle=False, style=""): @@ -124,6 +121,7 @@ def RandomMnist(batchsize=8, num_workers=0, shuffle=False, style=""): transforms.RandomRotation(30), transforms.RandomResizedCrop(28), transforms.ToTensor(), transforms.Normalize((0.1307,), (0.3081,))])) + train_loader = torch.utils.data.DataLoader(train_data, batch_size=batchsize, shuffle=shuffle, diff --git a/tools/Train.py b/tools/Train.py index ba9d3dd..17b3bd0 100644 --- a/tools/Train.py +++ b/tools/Train.py @@ -11,11 +11,13 @@ import os import utils as utils -def train(model, train_loader, optimizer, epoch=0, deviceid=[0]): +def train(model, train_loader, optimizer, epoch=0): model.train() + batchsize = int(train_loader.sampler.num_samples / + train_loader.batch_size / 5)+1 for batch_idx, (data, target) in enumerate(train_loader): - data = utils.SetDevice(data, deviceid) - target = utils.SetDevice(target, deviceid) + data = utils.SetDevice(data) + target = utils.SetDevice(target) optimizer.zero_grad() output = model(data) @@ -23,7 +25,7 @@ def train(model, train_loader, optimizer, epoch=0, deviceid=[0]): loss.backward() optimizer.step() - if batch_idx % 100 == 0 and batch_idx > 0: + if batch_idx % batchsize == 0 and batch_idx > 0: print('Train Epoch: {} [{}/{} ({:.0f}%)]\tLoss: {:.6f}' .format(epoch, batch_idx * len(data), len(train_loader.dataset), @@ -32,14 +34,14 @@ def train(model, train_loader, optimizer, epoch=0, deviceid=[0]): loss.item())) -def test(model, test_loader, deviceid=[0]): +def test(model, test_loader): with torch.no_grad(): model.eval() test_loss = 0 correct = 0 for data, target in test_loader: - data = utils.SetDevice(data, deviceid) - target = utils.SetDevice(target, deviceid) + data = utils.SetDevice(data) + target = utils.SetDevice(target) output = model(data) # sum up batch loss @@ -49,9 +51,7 @@ def test(model, test_loader, deviceid=[0]): correct += pred.eq(target.view_as(pred)).sum().item() test_loss /= len(test_loader.dataset) + accu = 100. * correct / len(test_loader.dataset) print('\nTest set: Average loss: {:.4f}, Accuracy: {}/{} ({:.0f}%)\n' - .format(test_loss, correct, - len( - test_loader.dataset), - 100. * correct / len( - test_loader.dataset))) + .format(test_loss, correct, len(test_loader.dataset), accu)) + return accu diff --git a/tools/WebVisual.py b/tools/WebVisual.py new file mode 100644 index 0000000..31bbe32 --- /dev/null +++ b/tools/WebVisual.py @@ -0,0 +1,64 @@ +from visdom import Visdom +import random +import numpy as np + + + +def InitVisdom(): + viz = Visdom() + assert viz.check_connection() + viz.close() + +class Line(): + def __init__(self,name,size): + super(Line, self).__init__() + self.name=name + self.size=size + def __init__(self): + super(Line, self).__init__() + self.name=str(random.random()) + self.size=0 + def __init__(self,name): + super(Line, self).__init__() + self.name=name + self.size=0 + +class LineWin(): + def __init__(self): + super(LineWin, self).__init__() + self.viz = Visdom() + self.name = str(random.random()) + self.win = self.viz.line( + X=np.array([0]), + Y=np.array([0]), + name=self.name + ) + self.data = np.array([]) + + def AppendLine(self,y): + if not isinstance(y,list): + y = [y] + linename = str(random.random()) + self.viz.line( + X=np.array(range(len(y))), + Y=np.array(y), + opts=dict(markercolor=np.array([50]), + markersymbol='dot',), + win=self.win, + update="new", + name=linename, + ) + return Line(linename,len(y)) + + def AppendData(self,line, y): + if not isinstance(y,list): + y = [y] + self.viz.line( + X=np.array(range(line.size, line.size+len(y))), + Y=np.array(y), + win=self.win, + update="append", + name=line.name + ) + line.size = line.size + len(y) +