rajeswar

Untitled

Jul 27th, 2014
341
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 18.19 KB | None | 0 0
  1. import numpy
  2. import cPickle
  3. from scipy import signal as sg
  4. import math
  5. import random
  6. """
  7. input: 5D(minibatch,number of channels,image depth,image width,image height)
  8. image_shape: same as input
  9. filter_shape:(number of filters,number of channels,filter depth,filter width,filter height)
  10. filter_shape:(1,number of filters,filter depth,filter width,filter height)
  11. pool size:tuple of length 2(default given (3,3))
  12.  
  13. class Hardwiring(object):
  14.    def __init__(self,input,image_shape):
  15.        output=numpy.zeros((image_shape[0],1,43,60,80))
  16.        #first gray
  17.        gray=input
  18.        j=0
  19.        for i in xrange(image_shape[2]):
  20.            output[0][1][j]=image[0][1][i]
  21.            j+=1
  22.        gx=[[-1,0,+1],[-2,0,+2],[-1,0,+1]]
  23.        gy=[[+1,+2,+1],[0,0,0],[-1,-2,-1]]
  24.        gradx=sg.convolve(input,numpy.rot90(gx,2),mode='full')
  25.        grady=sg.convolve(input,numpy.rot90(gy,2),mode='full')
  26.        for i in xrange(image_shape[2]):
  27.            output[0][1][j]=gradx[0][1][i]
  28.            j+=1
  29.        for i in xrange(image_shape[2]):
  30.            output[0][1][j]=grady[0][1][i]
  31.            j+=1
  32.            
  33.        
  34.        
  35.    
  36. """
  37. class First_Convolution(object):
  38.     def __init__(self,rng,input,image_shape,filter_shape,pool_size=(3,3)):
  39.         self.filter_shape=filter_shape
  40.         self.image_shape=image_shape
  41.         self.input=input
  42.         fan_in=numpy.prod(filter_shape[2])
  43.         fan_out=(numpy.prod(filter_shape[1]))/numpy.prod(pool_size)
  44.         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)
  45.         conv_out=numpy.zeros((conv_out_shape))
  46.         self.conv_out_shape=conv_out_shape
  47.         self.conv_out=conv_out
  48.         W_bound=numpy.sqrt(6.0/(fan_in+fan_out))
  49.         W=numpy.asarray(rng.uniform(low=-W_bound,high=W_bound,size=filter_shape),dtype=numpy.float32)
  50.         b=numpy.zeros((conv_out_shape[1],conv_out_shape[2]),dtype=numpy.float32)
  51.         self.W=W
  52.         self.b=b
  53.         for i in xrange(conv_out_shape[1]):
  54.             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')
  55.         pooled_shape=(image_shape[0],conv_out_shape[1],conv_out_shape[2],conv_out_shape[3]/3,conv_out_shape[4]/3)
  56.         self.pooled_shape=pooled_shape
  57.         pooled=numpy.zeros((pooled_shape))
  58.         self.pooled=pooled
  59.         for i in xrange(pooled_shape[1]):
  60.             for j in xrange(pooled_shape[2]):
  61.                 for k in xrange(pooled_shape[3]):
  62.                     for l in xrange(pooled_shape[4]):
  63.                         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])
  64.                
  65.         self.output=pooled
  66.     @profile
  67.     def change_input(self,input1):
  68.         self.input=input1
  69.         for i in xrange(self.conv_out_shape[1]):
  70.             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')
  71.         for k in xrange(self.pooled_shape[3]):
  72.              for l in xrange(self.pooled_shape[4]):
  73.                  output1 = numpy.sum(self.conv_out[0, :, :, k*3: (k*3) +1, l*3:(l+1)*3])
  74.                  output1 += numpy.sum(self.conv_out[0, :, :, k*3 + 2, l*3:(l+1)*3])/9.0
  75.                  output1 += self.b
  76.                  self.pooled[0, :, :, k, l] = numpy.tanh(output1)
  77.        #for i in xrange(self.pooled_shape[1]):
  78.          #   for j in xrange(self.pooled_shape[2]):
  79.           #      for k in xrange(self.pooled_shape[3]):
  80.            #         for l in xrange(self.pooled_shape[4]):
  81.             #            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])
  82.                
  83.         self.output=self.pooled
  84.     """
  85.    numpy.kron returns array
  86.    """
  87.     @profile
  88.     def gradient(self,eta):
  89.         for i in xrange(len(self.b)):
  90.             for j in xrange(len(self.b[i])):
  91.                 self.b[i][j]-=eta*numpy.asarray(self.delta[0][i][j]).sum()
  92.         delta1=numpy.asarray(numpy.zeros(self.conv_out_shape))
  93.         for i in xrange(self.conv_out_shape[1]):
  94.             for j in xrange(self.conv_out_shape[2]):
  95.                 delta1[0][i][j]=numpy.kron(self.delta[0][i][j],[[1,1,1],[1,1,1],[1,1,1]])/9.0
  96.        
  97.         for i in xrange(self.filter_shape[1]):
  98.             t=numpy.rot90(delta1[0][i],2)
  99.             self.W[0][i]-=sg.fftconvolve(self.input[0][0],t,mode='valid')*eta
  100.            
  101.            
  102. class Hidden_Convolution(object):
  103.     def __init__(self,rng,input1,image_shape,filter_shape,pool_size=(3,3)):
  104.         self.filter_shape=filter_shape
  105.         self.image_shape=image_shape
  106.         self.input=input1
  107.         fan_in=numpy.prod(filter_shape[2])
  108.         fan_out=(numpy.prod(filter_shape[1]))/numpy.prod(pool_size)
  109.         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)
  110.         conv_out=numpy.zeros((conv_out_shape))
  111.         self.conv_out_shape=conv_out_shape
  112.         self.conv_out=conv_out
  113.         W_bound=numpy.sqrt(6.0/(fan_in+fan_out))
  114.         W=numpy.asarray(rng.uniform(low=-W_bound,high=W_bound,size=filter_shape),dtype=numpy.float32)
  115.         b=numpy.zeros((conv_out_shape[1],conv_out_shape[2]),dtype=numpy.float32)
  116.         self.W=W
  117.         self.b=b
  118.         for i in xrange(conv_out_shape[1]):
  119.             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')
  120.         pooled_shape=(image_shape[0],conv_out_shape[1],conv_out_shape[2],conv_out_shape[3]/3,conv_out_shape[4]/3)
  121.         self.pooled_shape=pooled_shape
  122.         pooled=numpy.zeros((pooled_shape))
  123.         self.pooled=pooled
  124.         for i in xrange(pooled_shape[1]):
  125.             for j in xrange(pooled_shape[2]):
  126.                 for k in xrange(pooled_shape[3]):
  127.                     for l in xrange(pooled_shape[4]):
  128.                         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])
  129.                
  130.         self.output=pooled
  131.     @profile
  132.     def change_input(self,input1):
  133.         self.input=input1
  134.         for i in xrange(self.conv_out_shape[1]):
  135.             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')
  136.        
  137.         for k in xrange(self.pooled_shape[3]):
  138.        for l in xrange(self.pooled_shape[4]):
  139.                          output1 = numpy.sum(self.conv_out[0, :, :, k*3: (k*3) +1, l*3:(l+1)*3])
  140.                          output1 += numpy.sum(self.conv_out[0, :, :, k*3 + 2, l*3:(l+1)*3])/9.0
  141.                          output1 += self.b
  142.                          self.pooled[0, :, :, k, l] = numpy.tanh(output1)
  143.        # for i in xrange(self.pooled_shape[1]):
  144.         #    for j in xrange(self.pooled_shape[2]):
  145.          #       for k in xrange(self.pooled_shape[3]):
  146.           #          for l in xrange(self.pooled_shape[4]):
  147.            #             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])
  148.                
  149.         self.output=self.pooled
  150.     """
  151.    numpy.kron returns array
  152.    inp is object
  153.    """
  154.     @profile
  155.     def gradient(self,inp,eta):
  156.        
  157.         for i in xrange(len(self.b)):
  158.             for j in xrange(len(self.b[i])):
  159.                 self.b[i][j]-=eta*numpy.asarray(self.delta[0][i][j]).sum()
  160.         delta1=numpy.asarray(numpy.zeros(self.conv_out_shape))
  161.         for i in xrange(self.conv_out_shape[1]):
  162.             for j in xrange(self.conv_out_shape[2]):
  163.                 delta1[0][i][j]=numpy.kron(self.delta[0][i][j],[[1,1,1],[1,1,1],[1,1,1]])/9.0
  164.         self.delta1=delta1
  165.        
  166.        
  167.         inp.delta=numpy.zeros(self.image_shape)
  168.         for i in xrange(self.conv_out_shape[1]):
  169.             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')
  170.         inp.delta/=(self.filter_shape[1]*1.0)
  171.         for i in xrange(self.image_shape[1]):
  172.             for j in xrange(self.image_shape[2]):
  173.                 for k in xrange(self.image_shape[3]):
  174.                     for l in xrange(self.image_shape[4]):
  175.                         #conv_out[0][i][j][k][l]=de_convolve(inp,i,j,k,l)
  176.                         inp.delta[0][i][j][k][l]*=(1-inp.output[0][i][j][k][l]**2)
  177.         #inp.delta/=self.filter_shape[1]
  178.        
  179.         j=0
  180.         k=0
  181.         m=0
  182.         for i in xrange(self.conv_out_shape[1]):
  183.             ab=numpy.rot90(delta1[0][i],2)
  184.             k+=numpy.asarray(sg.fftconvolve(self.input[0][j],ab,mode='valid'))
  185.             j+=1
  186.             if j==self.image_shape[1]:
  187.                 #k=k/self.image_shape[1]
  188.                 self.W[0][m]-=eta*k
  189.                 m+=1
  190.                 j=0
  191.                 k=0
  192.        
  193.        
  194.     @profile        
  195.     def de_convolve(self,inp,i,j,k,l):
  196.         kernel_number=int(i/self.image_shape[1])
  197.         channel_number=i%self.image_shape[1]
  198.         for a in xrange(self.filter_shape[2]):
  199.             for b in xrange(self.filter_shape[3]):
  200.                 for c in xrange(self.filter_shape[4]):
  201.                     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]
  202.                     #sum=sum+self.W[0][kernel_number][a][b][c]*self.input[0][channel_number][j+a][k+b][l+c]
  203.  
  204.  
  205. class Last_Convolution(object):
  206.     def __init__(self,rng,input1,image_shape,filter_shape,pool_size=(1,1)):
  207.         self.filter_shape=filter_shape
  208.         self.input=input1
  209.         self.image_shape=image_shape
  210.         fan_in=numpy.prod(filter_shape[2])
  211.         fan_out=(numpy.prod(filter_shape[1]))/numpy.prod(pool_size)
  212.         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)
  213.         conv_out=numpy.zeros((conv_out_shape))
  214.         self.conv_out_shape=conv_out_shape
  215.         self.conv_out=conv_out
  216.         W_bound=numpy.sqrt(6.0/(fan_in+fan_out))
  217.         W=numpy.asarray(rng.uniform(low=-W_bound,high=W_bound,size=filter_shape),dtype=numpy.float32)
  218.         b=numpy.zeros((conv_out_shape[1],conv_out_shape[2]),dtype=numpy.float32)
  219.         self.W=W
  220.         self.b=b
  221.         for i in xrange(conv_out_shape[1]):
  222.             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')
  223.         self.output=numpy.tanh(conv_out)
  224.     def change_input(self,input1):
  225.         self.input=input1
  226.         for i in xrange(self.conv_out_shape[1]):
  227.             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')
  228.         self.output=numpy.tanh(self.conv_out)
  229.        
  230.  
  231.     """
  232.    Parameter is the object of previous layer
  233.        i.e.,inp
  234.    """
  235.     def gradient(self,inp,eta):
  236.         self.eta=eta
  237.         for i in xrange(len(self.b)):
  238.             self.b[i][0]-=eta*self.delta[i]
  239.            
  240.         inp.delta=numpy.zeros(self.image_shape)
  241.         for i in xrange(self.conv_out_shape[1]):
  242.             dummy=[[[]]]
  243.             dummy[0][0].append(self.delta[i])            
  244.             inp.delta[0][i%self.image_shape[1]]+= sg.fftconvolve(dummy,numpy.rot90(self.W[0][i/self.image_shape[1]],2),'full')
  245.         for i in xrange(self.image_shape[1]):
  246.             for j in xrange(self.image_shape[2]):
  247.                 for k in xrange(self.image_shape[3]):
  248.                     for l in xrange(self.image_shape[4]):
  249.                         #conv_out[0][i][j][k][l]=de_convolve(inp,i,j,k,l)
  250.                         inp.delta[0][i][j][k][l]*=(1-inp.output[0][i][j][k][l]**2)
  251.         j=0
  252.         k=0
  253.         m=0
  254.         for i in xrange(self.conv_out_shape[1]):
  255.             ab=[[[self.delta[i]]]]
  256.             k+=numpy.asarray(sg.fftconvolve(self.input[0][j],ab,mode='valid'))
  257.             j+=1
  258.             if j==self.image_shape[1]:
  259.                 #k=k/self.image_shape[1]
  260.                 self.W[0][m]-=self.eta*k
  261.                 m+=1
  262.                 j=0
  263.                 k=0
  264.     @profile
  265.     def de_convolve(self,inp,i,j,k,l):
  266.         kernel_number=int(i/self.image_shape[1])
  267.         channel_number=i%self.image_shape[1]
  268.         # sum=0
  269.         for a in xrange(self.filter_shape[2]):
  270.             for b in xrange(self.filter_shape[3]):
  271.                 for c in xrange(self.filter_shape[4]):
  272.                     inp.delta[0][channel_number][j+a][k+b][l+c]+=self.delta[i]*self.W[0][kernel_number][a][b][c]
  273.         inp.delta/=(self.filter_shape[1]*1.0)
  274.                     #sum=sum+self.W[0][kernel_number][a][b][c]*self.input[0][channel_number][j+a][k+b][l+c]
  275.            
  276.            
  277.    
  278. """
  279. Here input object is the output object of previous class
  280. """
  281. class LogisticRegession(object):
  282.     def __init__(self,rng,input_object,n_in,n_out):
  283.         self.input=input_object
  284.         self.n_in=n_in
  285.         self.n_out=n_out
  286.         self.delta=[]
  287.         W_bound=6.0/(n_in+n_out)
  288.         W=numpy.asarray(rng.uniform(low=-W_bound,high=W_bound,size=(n_in,n_out)), dtype=numpy.float32)
  289.         #W=numpy.zeros((n_in,n_out),dtype=numpy.float32)
  290.         b=numpy.zeros((n_out),dtype=numpy.float32)
  291.         self.W=W
  292.         self.b=b
  293.         self.outputs()
  294.     def outputs(self):
  295.         output=[]
  296.         for i in xrange(self.n_out):
  297.             out=0.0
  298.             for j in xrange(self.n_in):
  299.                 out=out+self.input.output[0][j][0][0][0]*self.W[j][i]
  300.                 if(j==self.n_in-1):
  301.                     output.append(numpy.tanh(out+self.b[i]))
  302.         self.output=output
  303.         print self.output
  304.     def change_input(self,input_object):
  305.         self.input=input_object
  306.         self.outputs()
  307.     """
  308.    Cost is sigma((y_expected-y)^2)/2        
  309.    """
  310.     def cost(self,y):
  311.         e=0
  312.         for i in xrange(self.n_out):
  313.             if y==i:
  314.                 e=e+numpy.square((1-self.output[i]))
  315.             else:
  316.                 e=e+numpy.square((-1-self.output[i]))
  317.         return e
  318.                
  319.     def error(self,y):
  320.         print self.output
  321.         maximum_index=max(enumerate(self.output),key=lambda x: x[1])[0]
  322.         print maximum_index,y
  323.         if maximum_index==y:
  324.             return 0
  325.         else:
  326.             return 1
  327.     @profile
  328.     def gradient(self,y,eta):
  329.         delta=[]
  330.         for i in xrange(self.n_out):
  331.             if y==i:
  332.                 delta.append((self.output[i]-1)*((1-self.output[i])**2))
  333.                 #delta.append((1-self.output[i])**2)
  334.             else:
  335.                 delta.append((self.output[i]+1)*((1-self.output[i])**2))
  336.                 #delta.append((1-self.output[i])**2)
  337.         self.delta=delta
  338.        
  339.         delta_prev=[]
  340.         ab=0
  341.         for i in xrange(self.n_in):
  342.             for j in xrange(self.n_out):
  343.                 ab=ab+self.W[i][j]*delta[j]
  344.             ab=ab*((1-self.input.output[0][i][0][0][0])**2)
  345.             delta_prev.append(ab)
  346.             ab=0
  347.         self.input.delta=delta_prev
  348.         for i in xrange(self.n_in):
  349.             for j in xrange(self.n_out):
  350.                 self.W[i][j]=self.W[i][j] - (eta*self.input.output[0][i][0][0][0]*delta[j])
  351.         for i in xrange(self.n_out):
  352.             self.b[i]=self.b[i]-eta*delta[i]
  353. @profile            
  354. def check(learning_rate=0.005, n_epochs=3,dataset='./kth_thesis.pkl',nkerns=[5,3,5], batch_size=1):
  355.     rng=numpy.random.RandomState(23455)
  356.     f = open('kth_thesis.pkl', 'rb')
  357.     train_set, test_set = cPickle.load(f)
  358.     f.close()
  359.     train_set_x, train_set_y=train_set
  360.     print train_set
  361.     print test_set
  362.     #validate_set_x, validate_set_y=validate_set
  363.     test_set_x, test_set_y=test_set
  364.     n_train_batches = len(train_set_x)
  365.     n_test_batches = len(test_set_x)
  366.     a=numpy.arange(n_train_batches)
  367.     random.shuffle(a)
  368.     k=0
  369.     k1=0
  370.     k2=0
  371.     for n in xrange(2):
  372.         print "training epoch %d" %n
  373.         for i in xrange(n_train_batches):
  374.             print a[i]
  375.             print 'Output is',train_set_y[a[i]]
  376.             print "training batch %d" %i
  377.             if n==0 and k==0:
  378.             print "ffff:  ",k1
  379.         k1+=1
  380.                 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))
  381.                 layer2=Hidden_Convolution(rng,layer1.output,(1,nkerns[0],6,18,24),(1,nkerns[1],4,7,7),(3,3))
  382.                 layer3=Last_Convolution(rng,layer2.output,(1,nkerns[0]*nkerns[1],3,4,6),(1,nkerns[2],3,4,6),(1,1))
  383.                 layer4=LogisticRegession(rng,layer3,nkerns[0]*nkerns[1]*nkerns[2],6)
  384.                 k+=1
  385.             else:
  386.             print "eeee: ",k2
  387.         k2+=1
  388.                 layer1.change_input(numpy.reshape(train_set_x[a[i]],(1,1,9,60,80)))
  389.                 layer2.change_input(layer1.output)
  390.                 layer3.change_input(layer2.output)
  391.                 layer4.change_input(layer3)
  392.             layer4.gradient(train_set_y[a[i]],learning_rate)
  393.             layer3.gradient(layer2,learning_rate)
  394.             layer2.gradient(layer1,learning_rate)
  395.             layer1.gradient(learning_rate)
  396.            
  397.  
  398.  
  399.  
  400.             #if n==0 and i==1:
  401.                 #print "hi"
  402.                 #print layer3.W
  403.                 #print "hi"
  404.                 #print layer2.output
  405.                
  406.         error=0.0
  407.         print "checking errors"
  408.         for i in xrange(n_test_batches):
  409.  
  410.             layer1.change_input(numpy.reshape(test_set_x[i],(1,1,9,60,80)))
  411.             layer2.change_input(layer1.output)
  412.             layer3.change_input(layer2.output)
  413.             layer4.change_input(layer3)
  414.             error+=layer4.error(test_set_y[i])
  415.         error_percent=(error/n_test_batches)*100
  416.         #print layer1.W
  417.         print "error %% after %d epoch is " %n,error_percent
  418.  
  419. check()
Advertisement
Add Comment
Please, Sign In to add comment