Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import numpy
- import cPickle
- from scipy import signal as sg
- import math
- import random
- """
- input: 5D(minibatch,number of channels,image depth,image width,image height)
- image_shape: same as input
- filter_shape:(number of filters,number of channels,filter depth,filter width,filter height)
- filter_shape:(1,number of filters,filter depth,filter width,filter height)
- pool size:tuple of length 2(default given (3,3))
- class Hardwiring(object):
- def __init__(self,input,image_shape):
- output=numpy.zeros((image_shape[0],1,43,60,80))
- #first gray
- gray=input
- j=0
- for i in xrange(image_shape[2]):
- output[0][1][j]=image[0][1][i]
- j+=1
- gx=[[-1,0,+1],[-2,0,+2],[-1,0,+1]]
- gy=[[+1,+2,+1],[0,0,0],[-1,-2,-1]]
- gradx=sg.convolve(input,numpy.rot90(gx,2),mode='full')
- grady=sg.convolve(input,numpy.rot90(gy,2),mode='full')
- for i in xrange(image_shape[2]):
- output[0][1][j]=gradx[0][1][i]
- j+=1
- for i in xrange(image_shape[2]):
- output[0][1][j]=grady[0][1][i]
- j+=1
- """
- class First_Convolution(object):
- def __init__(self,rng,input,image_shape,filter_shape,pool_size=(3,3)):
- self.filter_shape=filter_shape
- self.image_shape=image_shape
- self.input=input
- fan_in=numpy.prod(filter_shape[2])
- fan_out=(numpy.prod(filter_shape[1]))/numpy.prod(pool_size)
- conv_out_shape=(image_shape[0],filter_shape[1]*image_shape[1],image_shape[2]-filter_shape[2]+1,image_shape[3]-filter_shape[3]+1,image_shape[4]-filter_shape[4]+1)
- conv_out=numpy.zeros((conv_out_shape))
- self.conv_out_shape=conv_out_shape
- self.conv_out=conv_out
- W_bound=numpy.sqrt(6.0/(fan_in+fan_out))
- W=numpy.asarray(rng.uniform(low=-W_bound,high=W_bound,size=filter_shape),dtype=numpy.float32)
- b=numpy.zeros((conv_out_shape[1],conv_out_shape[2]),dtype=numpy.float32)
- self.W=W
- self.b=b
- for i in xrange(conv_out_shape[1]):
- conv_out[0][i]=sg.fftconvolve(self.input[0][i%self.image_shape[1]],numpy.rot90(self.W[0][i/self.image_shape[1]],2),mode='valid')
- pooled_shape=(image_shape[0],conv_out_shape[1],conv_out_shape[2],conv_out_shape[3]/3,conv_out_shape[4]/3)
- self.pooled_shape=pooled_shape
- pooled=numpy.zeros((pooled_shape))
- self.pooled=pooled
- for i in xrange(pooled_shape[1]):
- for j in xrange(pooled_shape[2]):
- for k in xrange(pooled_shape[3]):
- for l in xrange(pooled_shape[4]):
- pooled[0][i][j][k][l]=math.tanh((numpy.sum(conv_out[0][i][j][k*3][l*3:(l+1)*3])+numpy.sum(conv_out[0][i][j][k*3+1][l*3:(l+1)*3])+numpy.sum(conv_out[0][i][j][k*3+2][l*3:(l+1)*3]))/9.0+b[i][j])
- self.output=pooled
- @profile
- def change_input(self,input1):
- self.input=input1
- for i in xrange(self.conv_out_shape[1]):
- self.conv_out[0][i]=sg.fftconvolve(self.input[0][i%self.image_shape[1]],numpy.rot90(self.W[0][i/self.image_shape[1]],2),mode='valid')
- for k in xrange(self.pooled_shape[3]):
- for l in xrange(self.pooled_shape[4]):
- output1 = numpy.sum(self.conv_out[0, :, :, k*3: (k*3) +1, l*3:(l+1)*3])
- output1 += numpy.sum(self.conv_out[0, :, :, k*3 + 2, l*3:(l+1)*3])/9.0
- output1 += self.b
- self.pooled[0, :, :, k, l] = numpy.tanh(output1)
- #for i in xrange(self.pooled_shape[1]):
- # for j in xrange(self.pooled_shape[2]):
- # for k in xrange(self.pooled_shape[3]):
- # for l in xrange(self.pooled_shape[4]):
- # self.pooled[0][i][j][k][l]=math.tanh((numpy.sum(self.conv_out[0][i][j][k*3][l*3:(l+1)*3])+numpy.sum(self.conv_out[0][i][j][k*3+1][l*3:(l+1)*3])+numpy.sum(self.conv_out[0][i][j][k*3+2][l*3:(l+1)*3]))/9.0+self.b[i][j])
- self.output=self.pooled
- """
- numpy.kron returns array
- """
- @profile
- def gradient(self,eta):
- for i in xrange(len(self.b)):
- for j in xrange(len(self.b[i])):
- self.b[i][j]-=eta*numpy.asarray(self.delta[0][i][j]).sum()
- delta1=numpy.asarray(numpy.zeros(self.conv_out_shape))
- for i in xrange(self.conv_out_shape[1]):
- for j in xrange(self.conv_out_shape[2]):
- delta1[0][i][j]=numpy.kron(self.delta[0][i][j],[[1,1,1],[1,1,1],[1,1,1]])/9.0
- for i in xrange(self.filter_shape[1]):
- t=numpy.rot90(delta1[0][i],2)
- self.W[0][i]-=sg.fftconvolve(self.input[0][0],t,mode='valid')*eta
- class Hidden_Convolution(object):
- def __init__(self,rng,input1,image_shape,filter_shape,pool_size=(3,3)):
- self.filter_shape=filter_shape
- self.image_shape=image_shape
- self.input=input1
- fan_in=numpy.prod(filter_shape[2])
- fan_out=(numpy.prod(filter_shape[1]))/numpy.prod(pool_size)
- conv_out_shape=(image_shape[0],filter_shape[1]*image_shape[1],image_shape[2]-filter_shape[2]+1,image_shape[3]-filter_shape[3]+1,image_shape[4]-filter_shape[4]+1)
- conv_out=numpy.zeros((conv_out_shape))
- self.conv_out_shape=conv_out_shape
- self.conv_out=conv_out
- W_bound=numpy.sqrt(6.0/(fan_in+fan_out))
- W=numpy.asarray(rng.uniform(low=-W_bound,high=W_bound,size=filter_shape),dtype=numpy.float32)
- b=numpy.zeros((conv_out_shape[1],conv_out_shape[2]),dtype=numpy.float32)
- self.W=W
- self.b=b
- for i in xrange(conv_out_shape[1]):
- conv_out[0][i]=sg.fftconvolve(self.input[0][i%self.image_shape[1]],numpy.rot90(self.W[0][i/self.image_shape[1]],2),mode='valid')
- pooled_shape=(image_shape[0],conv_out_shape[1],conv_out_shape[2],conv_out_shape[3]/3,conv_out_shape[4]/3)
- self.pooled_shape=pooled_shape
- pooled=numpy.zeros((pooled_shape))
- self.pooled=pooled
- for i in xrange(pooled_shape[1]):
- for j in xrange(pooled_shape[2]):
- for k in xrange(pooled_shape[3]):
- for l in xrange(pooled_shape[4]):
- pooled[0][i][j][k][l]=math.tanh((numpy.sum(conv_out[0][i][j][k*3][l*3:(l+1)*3])+numpy.sum(conv_out[0][i][j][k*3+1][l*3:(l+1)*3])+numpy.sum(conv_out[0][i][j][k*3+2][l*3:(l+1)*3]))/9.0+b[i][j])
- self.output=pooled
- @profile
- def change_input(self,input1):
- self.input=input1
- for i in xrange(self.conv_out_shape[1]):
- self.conv_out[0][i]=sg.fftconvolve(self.input[0][i%self.image_shape[1]],numpy.rot90(self.W[0][i/self.image_shape[1]],2),mode='valid')
- for k in xrange(self.pooled_shape[3]):
- for l in xrange(self.pooled_shape[4]):
- output1 = numpy.sum(self.conv_out[0, :, :, k*3: (k*3) +1, l*3:(l+1)*3])
- output1 += numpy.sum(self.conv_out[0, :, :, k*3 + 2, l*3:(l+1)*3])/9.0
- output1 += self.b
- self.pooled[0, :, :, k, l] = numpy.tanh(output1)
- # for i in xrange(self.pooled_shape[1]):
- # for j in xrange(self.pooled_shape[2]):
- # for k in xrange(self.pooled_shape[3]):
- # for l in xrange(self.pooled_shape[4]):
- # self.pooled[0][i][j][k][l]=math.tanh((numpy.sum(self.conv_out[0][i][j][k*3][l*3:(l+1)*3])+numpy.sum(self.conv_out[0][i][j][k*3+1][l*3:(l+1)*3])+numpy.sum(self.conv_out[0][i][j][k*3+2][l*3:(l+1)*3]))/9.0+self.b[i][j])
- self.output=self.pooled
- """
- numpy.kron returns array
- inp is object
- """
- @profile
- def gradient(self,inp,eta):
- for i in xrange(len(self.b)):
- for j in xrange(len(self.b[i])):
- self.b[i][j]-=eta*numpy.asarray(self.delta[0][i][j]).sum()
- delta1=numpy.asarray(numpy.zeros(self.conv_out_shape))
- for i in xrange(self.conv_out_shape[1]):
- for j in xrange(self.conv_out_shape[2]):
- delta1[0][i][j]=numpy.kron(self.delta[0][i][j],[[1,1,1],[1,1,1],[1,1,1]])/9.0
- self.delta1=delta1
- inp.delta=numpy.zeros(self.image_shape)
- for i in xrange(self.conv_out_shape[1]):
- inp.delta[0][i%self.image_shape[1]]+= sg.fftconvolve(self.delta1[0][i],numpy.rot90(self.W[0][i/self.image_shape[1]],2),'full')
- inp.delta/=(self.filter_shape[1]*1.0)
- for i in xrange(self.image_shape[1]):
- for j in xrange(self.image_shape[2]):
- for k in xrange(self.image_shape[3]):
- for l in xrange(self.image_shape[4]):
- #conv_out[0][i][j][k][l]=de_convolve(inp,i,j,k,l)
- inp.delta[0][i][j][k][l]*=(1-inp.output[0][i][j][k][l]**2)
- #inp.delta/=self.filter_shape[1]
- j=0
- k=0
- m=0
- for i in xrange(self.conv_out_shape[1]):
- ab=numpy.rot90(delta1[0][i],2)
- k+=numpy.asarray(sg.fftconvolve(self.input[0][j],ab,mode='valid'))
- j+=1
- if j==self.image_shape[1]:
- #k=k/self.image_shape[1]
- self.W[0][m]-=eta*k
- m+=1
- j=0
- k=0
- @profile
- def de_convolve(self,inp,i,j,k,l):
- kernel_number=int(i/self.image_shape[1])
- channel_number=i%self.image_shape[1]
- for a in xrange(self.filter_shape[2]):
- for b in xrange(self.filter_shape[3]):
- for c in xrange(self.filter_shape[4]):
- inp.delta[0][channel_number][j+a][k+b][l+c]+=self.delta1[0][i][j][k][l]*self.W[0][kernel_number][a][b][c]
- #sum=sum+self.W[0][kernel_number][a][b][c]*self.input[0][channel_number][j+a][k+b][l+c]
- class Last_Convolution(object):
- def __init__(self,rng,input1,image_shape,filter_shape,pool_size=(1,1)):
- self.filter_shape=filter_shape
- self.input=input1
- self.image_shape=image_shape
- fan_in=numpy.prod(filter_shape[2])
- fan_out=(numpy.prod(filter_shape[1]))/numpy.prod(pool_size)
- conv_out_shape=(image_shape[0],filter_shape[1]*image_shape[1],image_shape[2]-filter_shape[2]+1,image_shape[3]-filter_shape[3]+1,image_shape[4]-filter_shape[4]+1)
- conv_out=numpy.zeros((conv_out_shape))
- self.conv_out_shape=conv_out_shape
- self.conv_out=conv_out
- W_bound=numpy.sqrt(6.0/(fan_in+fan_out))
- W=numpy.asarray(rng.uniform(low=-W_bound,high=W_bound,size=filter_shape),dtype=numpy.float32)
- b=numpy.zeros((conv_out_shape[1],conv_out_shape[2]),dtype=numpy.float32)
- self.W=W
- self.b=b
- for i in xrange(conv_out_shape[1]):
- conv_out[0][i]=sg.fftconvolve(self.input[0][i%self.image_shape[1]],numpy.rot90(self.W[0][i/self.image_shape[1]],2),mode='valid')
- self.output=numpy.tanh(conv_out)
- def change_input(self,input1):
- self.input=input1
- for i in xrange(self.conv_out_shape[1]):
- self.conv_out[0][i]=sg.fftconvolve(self.input[0][i%self.image_shape[1]],numpy.rot90(self.W[0][i/self.image_shape[1]],2),mode='valid')
- self.output=numpy.tanh(self.conv_out)
- """
- Parameter is the object of previous layer
- i.e.,inp
- """
- def gradient(self,inp,eta):
- self.eta=eta
- for i in xrange(len(self.b)):
- self.b[i][0]-=eta*self.delta[i]
- inp.delta=numpy.zeros(self.image_shape)
- for i in xrange(self.conv_out_shape[1]):
- dummy=[[[]]]
- dummy[0][0].append(self.delta[i])
- inp.delta[0][i%self.image_shape[1]]+= sg.fftconvolve(dummy,numpy.rot90(self.W[0][i/self.image_shape[1]],2),'full')
- for i in xrange(self.image_shape[1]):
- for j in xrange(self.image_shape[2]):
- for k in xrange(self.image_shape[3]):
- for l in xrange(self.image_shape[4]):
- #conv_out[0][i][j][k][l]=de_convolve(inp,i,j,k,l)
- inp.delta[0][i][j][k][l]*=(1-inp.output[0][i][j][k][l]**2)
- j=0
- k=0
- m=0
- for i in xrange(self.conv_out_shape[1]):
- ab=[[[self.delta[i]]]]
- k+=numpy.asarray(sg.fftconvolve(self.input[0][j],ab,mode='valid'))
- j+=1
- if j==self.image_shape[1]:
- #k=k/self.image_shape[1]
- self.W[0][m]-=self.eta*k
- m+=1
- j=0
- k=0
- @profile
- def de_convolve(self,inp,i,j,k,l):
- kernel_number=int(i/self.image_shape[1])
- channel_number=i%self.image_shape[1]
- # sum=0
- for a in xrange(self.filter_shape[2]):
- for b in xrange(self.filter_shape[3]):
- for c in xrange(self.filter_shape[4]):
- inp.delta[0][channel_number][j+a][k+b][l+c]+=self.delta[i]*self.W[0][kernel_number][a][b][c]
- inp.delta/=(self.filter_shape[1]*1.0)
- #sum=sum+self.W[0][kernel_number][a][b][c]*self.input[0][channel_number][j+a][k+b][l+c]
- """
- Here input object is the output object of previous class
- """
- class LogisticRegession(object):
- def __init__(self,rng,input_object,n_in,n_out):
- self.input=input_object
- self.n_in=n_in
- self.n_out=n_out
- self.delta=[]
- W_bound=6.0/(n_in+n_out)
- W=numpy.asarray(rng.uniform(low=-W_bound,high=W_bound,size=(n_in,n_out)), dtype=numpy.float32)
- #W=numpy.zeros((n_in,n_out),dtype=numpy.float32)
- b=numpy.zeros((n_out),dtype=numpy.float32)
- self.W=W
- self.b=b
- self.outputs()
- def outputs(self):
- output=[]
- for i in xrange(self.n_out):
- out=0.0
- for j in xrange(self.n_in):
- out=out+self.input.output[0][j][0][0][0]*self.W[j][i]
- if(j==self.n_in-1):
- output.append(numpy.tanh(out+self.b[i]))
- self.output=output
- print self.output
- def change_input(self,input_object):
- self.input=input_object
- self.outputs()
- """
- Cost is sigma((y_expected-y)^2)/2
- """
- def cost(self,y):
- e=0
- for i in xrange(self.n_out):
- if y==i:
- e=e+numpy.square((1-self.output[i]))
- else:
- e=e+numpy.square((-1-self.output[i]))
- return e
- def error(self,y):
- print self.output
- maximum_index=max(enumerate(self.output),key=lambda x: x[1])[0]
- print maximum_index,y
- if maximum_index==y:
- return 0
- else:
- return 1
- @profile
- def gradient(self,y,eta):
- delta=[]
- for i in xrange(self.n_out):
- if y==i:
- delta.append((self.output[i]-1)*((1-self.output[i])**2))
- #delta.append((1-self.output[i])**2)
- else:
- delta.append((self.output[i]+1)*((1-self.output[i])**2))
- #delta.append((1-self.output[i])**2)
- self.delta=delta
- delta_prev=[]
- ab=0
- for i in xrange(self.n_in):
- for j in xrange(self.n_out):
- ab=ab+self.W[i][j]*delta[j]
- ab=ab*((1-self.input.output[0][i][0][0][0])**2)
- delta_prev.append(ab)
- ab=0
- self.input.delta=delta_prev
- for i in xrange(self.n_in):
- for j in xrange(self.n_out):
- self.W[i][j]=self.W[i][j] - (eta*self.input.output[0][i][0][0][0]*delta[j])
- for i in xrange(self.n_out):
- self.b[i]=self.b[i]-eta*delta[i]
- @profile
- def check(learning_rate=0.005, n_epochs=3,dataset='./kth_thesis.pkl',nkerns=[5,3,5], batch_size=1):
- rng=numpy.random.RandomState(23455)
- f = open('kth_thesis.pkl', 'rb')
- train_set, test_set = cPickle.load(f)
- f.close()
- train_set_x, train_set_y=train_set
- print train_set
- print test_set
- #validate_set_x, validate_set_y=validate_set
- test_set_x, test_set_y=test_set
- n_train_batches = len(train_set_x)
- n_test_batches = len(test_set_x)
- a=numpy.arange(n_train_batches)
- random.shuffle(a)
- k=0
- k1=0
- k2=0
- for n in xrange(2):
- print "training epoch %d" %n
- for i in xrange(n_train_batches):
- print a[i]
- print 'Output is',train_set_y[a[i]]
- print "training batch %d" %i
- if n==0 and k==0:
- print "ffff: ",k1
- k1+=1
- layer1=First_Convolution(rng,numpy.reshape(train_set_x[a[i]],(1,1,9,60,80)),(1,1,9,60,80),(1,nkerns[0],4,7,9),(3,3))
- layer2=Hidden_Convolution(rng,layer1.output,(1,nkerns[0],6,18,24),(1,nkerns[1],4,7,7),(3,3))
- layer3=Last_Convolution(rng,layer2.output,(1,nkerns[0]*nkerns[1],3,4,6),(1,nkerns[2],3,4,6),(1,1))
- layer4=LogisticRegession(rng,layer3,nkerns[0]*nkerns[1]*nkerns[2],6)
- k+=1
- else:
- print "eeee: ",k2
- k2+=1
- layer1.change_input(numpy.reshape(train_set_x[a[i]],(1,1,9,60,80)))
- layer2.change_input(layer1.output)
- layer3.change_input(layer2.output)
- layer4.change_input(layer3)
- layer4.gradient(train_set_y[a[i]],learning_rate)
- layer3.gradient(layer2,learning_rate)
- layer2.gradient(layer1,learning_rate)
- layer1.gradient(learning_rate)
- #if n==0 and i==1:
- #print "hi"
- #print layer3.W
- #print "hi"
- #print layer2.output
- error=0.0
- print "checking errors"
- for i in xrange(n_test_batches):
- layer1.change_input(numpy.reshape(test_set_x[i],(1,1,9,60,80)))
- layer2.change_input(layer1.output)
- layer3.change_input(layer2.output)
- layer4.change_input(layer3)
- error+=layer4.error(test_set_y[i])
- error_percent=(error/n_test_batches)*100
- #print layer1.W
- print "error %% after %d epoch is " %n,error_percent
- check()
Advertisement
Add Comment
Please, Sign In to add comment