Refine Distance of kernels

This commit is contained in:
colin 2019-09-20 12:48:45 +08:00
parent b0246d2a95
commit 7f39f884fc
10 changed files with 110 additions and 134 deletions

View File

@ -1,113 +0,0 @@
from __future__ import print_function
import os
import sys
import torch
import torch.nn as nn
import torch.nn.functional as F
import torch.optim as optim
import torchvision
from torchvision import datasets, transforms
import torchvision.models as models
import matplotlib.pyplot as plt
import numpy as np
from torch.utils.data import Dataset, DataLoader
from PIL import Image
import random
import cv2
CurrentPath = os.path.split(os.path.realpath(__file__))[0]+"/"
print("Current Path :" + CurrentPath)
sys.path.append(CurrentPath+'../tools')
sys.path.append(CurrentPath+'../')
import Model as Model
from tools import utils, Train, Loader
import EvaluatorUnsuper
batchsize = 128
# model = utils.SetDevice(Model.Net5Grad35())
# model = utils.SetDevice(Model.Net31535())
model = utils.SetDevice(Model.Net3Grad335())
# model = utils.SetDevice(Model.Net3())
layers = model.PrintLayer()
layer = 0
model = utils.LoadModel(model, CurrentPath+"/checkpoint.pkl")
weight = np.load(CurrentPath+"WeightSearch.npy")
# 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=0, shuffle=True)
# weight = EvaluatorUnsuper.UnsuperLearnSearchWeight(model, layer, traindata, NumSearch=100000, SearchChannelRatio=8, Interation=10)
# np.save("WeightSearch.npy", weight)
# weight = EvaluatorUnsuper.UnsuperLearnTrainWeight(model, layer, traindata)
# np.save("WeightTrain.npy", weight)
weight = np.load(CurrentPath+"WeightSearch.npy")
def DistanceOfKernel(k1,k2):
k1 = k1.reshape((1,-1))
k1r = 1.0/k1.reshape((-1,1))
k1dot = np.dot(k1r,k1)
k2 = k2.reshape((1,-1))
k2r = 1.0/k2.reshape((-1,1))
k2dot = np.dot(k2r,k2)
diff = np.abs(np.mean(k1dot - k2dot))
return diff
indexs = np.random.randint(0,weight.shape[0],(10000,2))
mindis = 0
manindex = []
for i in indexs:
if i[0] == i[1]:
continue
dis = DistanceOfKernel(weight[i[0]], weight[i[1]])
if dis > mindis:
manindex = i
mindis = dis
a = weight[manindex[0]]
b = weight[manindex[1]]
utils.NumpyToImage(a, CurrentPath+"image","a")
utils.NumpyToImage(b, CurrentPath+"image","b")
a = 0
# utils.NumpyToImage(weight, CurrentPath+"image")
# utils.SaveModel(model,CurrentPath+"/checkpoint.pkl")
print("save model sucess")

View File

@ -24,7 +24,7 @@ sys.path.append(CurrentPath+'../tools')
sys.path.append(CurrentPath+'../') sys.path.append(CurrentPath+'../')
import Model as Model import Model as Model
from tools import utils, Train, Loader from tools import utils, Train, Loader, WebVisual
import EvaluatorUnsuper import EvaluatorUnsuper
@ -67,16 +67,32 @@ traindata, testdata = Loader.Cifar10Mono(batchsize, num_workers=0, shuffle=True)
# weight = np.load(CurrentPath+"WeightSearch.npy") # weight = np.load(CurrentPath+"WeightSearch.npy")
# bestweight = EvaluatorUnsuper.UnsuperLearnFindBestWeight(model,layer,weight,traindata,128,100000) # bestweight,index = EvaluatorUnsuper.UnsuperLearnFindBestWeight(model,layer,weight,traindata,128,100000)
# np.save(CurrentPath+"bestweightSearch.npy", bestweight) # np.save(CurrentPath+"bestweightSearch.npy", bestweight)
# utils.NumpyToImage(bestweight, CurrentPath+"image") # utils.NumpyToImage(bestweight, CurrentPath+"image")
weight = np.load(CurrentPath+"WeightTrain.npy") # weight = np.load(CurrentPath+"WeightTrain.npy")
bestweight = EvaluatorUnsuper.UnsuperLearnFindBestWeight( # bestweight, index = EvaluatorUnsuper.UnsuperLearnFindBestWeight(
model, layer, weight, traindata, databatchs=128, interation=100000) # model, layer, weight, traindata, databatchs=16, interation=1000000)
np.save(CurrentPath+"bestweightTrain.npy", bestweight) # np.save(CurrentPath+"bestweightTrain.npy", bestweight)
utils.NumpyToImage(bestweight, CurrentPath+"image") # utils.NumpyToImage(bestweight, CurrentPath+"image")
# weight = np.load(CurrentPath+"WeightTrain.npy")
# WebVisual.InitVisdom()
# window = WebVisual.LineWin()
# HisLine = WebVisual.Line(window, "HisLine")
# dis = EvaluatorUnsuper.CrossDistanceOfKernel(weight,weight,weight.shape[0],weight.shape[0])
# his = np.histogram(dis,512)
# HisLine.AppendData(his[1],his[0])
@ -84,9 +100,14 @@ utils.NumpyToImage(bestweight, CurrentPath+"image")
# EvaluatorUnsuper.SetModelConvWeight(model,layer,weight) # EvaluatorUnsuper.SetModelConvWeight(model,layer,weight)
# utils.SaveModel(model,CurrentPath+"/checkpointSearch.pkl") # utils.SaveModel(model,CurrentPath+"/checkpointSearch.pkl")
# weight = np.load(CurrentPath+"bestweightTrain.npy")
# EvaluatorUnsuper.SetModelConvWeight(model,layer,weight) weight = np.load(CurrentPath+"bestweightTrain.npy")
# utils.SaveModel(model,CurrentPath+"/checkpointTrain.pkl") EvaluatorUnsuper.SetModelConvWeight(model,layer,weight)
utils.SaveModel(model,CurrentPath+"/checkpointTrain.pkl")

View File

@ -171,11 +171,60 @@ def UnsuperLearnFindBestWeight(netmodel, layer, weight, dataloader, databatchs=1
entropy = (histc.log2()*histc).sum() entropy = (histc.log2()*histc).sum()
entropys.append(entropy.detach().cpu().numpy()) entropys.append(entropy.detach().cpu().numpy())
interationbar.update(1) interationbar.update(1)
sortindex = np.argsort(entropys)
argmin = np.argmin(entropys) argmin = np.argmin(entropys)
bestweight = weight[indexs[argmin]] bestweight = weight[indexs[argmin]]
interationbar.close() interationbar.close()
return bestweight return bestweight,indexs[sortindex]
def SetModelConvWeight(model, layer, weight): def SetModelConvWeight(model, layer, weight):
w = utils.SetDevice(torch.from_numpy(weight)) w = utils.SetDevice(torch.from_numpy(weight))
model.features[layer].weight.data = w model.features[layer].weight.data = w
def DistanceOfKernel(k1, k2, BatchSize=1):
"""
Distance of Kernel with N scale value
BatchSize : Kernel number in k1 and k2
scalek1 = (each value of K1 / each value of K1)
scalek2 = (each value of K2 / each value of K2)
so if N = 9 , size(scaleK1) = 81
return diff = abs(mean(scalek1 - scalek2))
"""
k1revert = k1.reshape((BatchSize, -1, 1))
k1 = 1.0 / k1.reshape((BatchSize, 1, -1))
k2revert = k2.reshape((BatchSize, -1, 1))
k2 = 1.0 / k2.reshape((BatchSize, 1, -1))
diff = np.abs(np.mean((np.matmul(k1revert, k1)- np.matmul(k2revert, k2)).reshape(BatchSize, -1), 1))
return diff
def CrossDistanceOfKernel(k1, k2, BatchSize1=1, BatchSize2=1):
"""
Distance of Kernel with N scale value
BatchSize : Kernel number in k1 and k2
K1 k2 dims must >= 2
scalek1 = (each value of K1 / each value of K1)
scalek2 = (each value of K2 / each value of K2)
so if N = 9 , size(scaleK1) = 81
return diff = abs(mean(scalek1 - scalek2))
"""
tileshape = np.array(k2.shape)
tileshape[1:] = 1
tileshape[0] = k1.shape[0]
right = np.tile(k2, tileshape)
tileshape = np.array(k1.shape)
tileshape[1] = k2.shape[0]
tileshape[0] = 1
tileshape[2:] = 1
left = np.tile(k1, tileshape)
leftshape = np.array(k1.shape)
leftshape[0] = -1
left = left.reshape(leftshape)
return DistanceOfKernel(right, left, left.shape[0])

View File

@ -14,7 +14,6 @@ from torch.utils.data import Dataset, DataLoader
from PIL import Image from PIL import Image
import random import random
import cv2 import cv2
from visdom import Visdom
from tqdm import tqdm from tqdm import tqdm
@ -45,7 +44,7 @@ batchsize = 128
# traindata, testdata = Loader.RandomMnist(batchsize, num_workers=4, style="Horizontal") # 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="VerticalOneLine")
# traindata, testdata = Loader.RandomMnist(batchsize, num_workers=4, style="VerticalZebra") # traindata, testdata = Loader.RandomMnist(batchsize, num_workers=4, style="VerticalZebra")
traindata, testdata = Loader.Cifar10Mono(batchsize, num_workers=4,shuffle=True,trainsize=140) traindata, testdata = Loader.Cifar10Mono(batchsize, num_workers=4,shuffle=True,trainsize=500)
WebVisual.InitVisdom() WebVisual.InitVisdom()
@ -65,15 +64,15 @@ Train.TrainEpochs(model,traindata,optimizer,testdata,3000,30,linePretrainTrain)
model = utils.SetDevice(Model.Net3335()) model = utils.SetDevice(Model.Net3335())
model = utils.LoadModel(model, CurrentPath+"/checkpointTrain.pkl") # model = utils.LoadModel(model, CurrentPath+"/checkpointTrain.pkl")
optimizer = optim.SGD(model.parameters(), lr=0.1) optimizer = optim.SGD(model.parameters(), lr=0.1)
Train.TrainEpochs(model,traindata,optimizer,testdata,3000,30,lineNoPre) Train.TrainEpochs(model,traindata,optimizer,testdata,3000,30,lineNoPre)
model = utils.SetDevice(Model.Net3Grad335()) # model = utils.SetDevice(Model.Net3Grad335())
model = utils.LoadModel(model, CurrentPath+"/checkpointSearch.pkl") # model = utils.LoadModel(model, CurrentPath+"/checkpointSearch.pkl")
optimizer = optim.SGD(model.parameters(), lr=0.1) # optimizer = optim.SGD(model.parameters(), lr=0.1)
Train.TrainEpochs(model,traindata,optimizer,testdata,3000,30,linePretrainSearch) # Train.TrainEpochs(model,traindata,optimizer,testdata,3000,30,linePretrainSearch)

Binary file not shown.

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 413 B

Binary file not shown.

View File

@ -39,6 +39,10 @@ class Line():
def AppendData(self, y): def AppendData(self, y):
self.win.AppendData(self, y) self.win.AppendData(self, y)
def AppendData(self, x, y):
self.win.AppendData(self, x, y)
class LineWin(): class LineWin():
def __init__(self): def __init__(self):
super(LineWin, self).__init__() super(LineWin, self).__init__()
@ -77,3 +81,20 @@ class LineWin():
name=line.name name=line.name
) )
line.size = line.size + len(y) line.size = line.size + len(y)
def AppendData(self, line, x, y):
if not isinstance(y, list) and not isinstance(y, np.ndarray):
y = [y]
if not isinstance(x, list) and not isinstance(x, np.ndarray):
x = [x]
X = np.array(x)
Y = np.array(y)
X = X[0:len(Y)]
self.viz.line(
Y=Y,
X=X,
win=self.win,
update="append",
name=line.name
)
line.size = line.size + len(y)

View File

@ -1,6 +1,7 @@
nohup: ignoring input
/home/colin/anaconda3/lib/python3.7/site-packages/visdom/server.py:30: DeprecationWarning: zmq.eventloop.ioloop is deprecated in pyzmq 17. pyzmq now works with default tornado and asyncio eventloops. /home/colin/anaconda3/lib/python3.7/site-packages/visdom/server.py:30: DeprecationWarning: zmq.eventloop.ioloop is deprecated in pyzmq 17. pyzmq now works with default tornado and asyncio eventloops.
ioloop.install() # Needs to happen before any tornado imports! ioloop.install() # Needs to happen before any tornado imports!
Checking for scripts.
It's Alive!
Traceback (most recent call last): Traceback (most recent call last):
File "/home/colin/anaconda3/lib/python3.7/runpy.py", line 193, in _run_module_as_main File "/home/colin/anaconda3/lib/python3.7/runpy.py", line 193, in _run_module_as_main
"__main__", mod_spec) "__main__", mod_spec)
@ -21,5 +22,3 @@ Traceback (most recent call last):
File "/home/colin/anaconda3/lib/python3.7/site-packages/tornado/netutil.py", line 168, in bind_sockets File "/home/colin/anaconda3/lib/python3.7/site-packages/tornado/netutil.py", line 168, in bind_sockets
sock.bind(sockaddr) sock.bind(sockaddr)
OSError: [Errno 98] Address already in use OSError: [Errno 98] Address already in use
Checking for scripts.
It's Alive!