Advertisement
Guest User

Untitled

a guest
Mar 26th, 2019
84
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.99 KB | None | 0 0
  1. import numpy as np
  2. import data
  3. import matplotlib.pyplot as plt
  4. import tensorflow as tf
  5.  
  6.  
  7. class TFDeep:
  8. def __init__(self, Dim, param_delta=0.1,param_lambda=0.0001):
  9. """Arguments:
  10. - D: dimensions of each datapoint
  11. - C: number of classes
  12. - param_delta: training step
  13. """
  14.  
  15. # definicija podataka i parametara:
  16. D = Dim[0]
  17. n = len(Dim)
  18. C = Dim[n-1]
  19. S = n-2 #slojevi
  20.  
  21. self.X = tf.placeholder(tf.float32, [None,D])
  22. self.Yoh_ = tf.placeholder(tf.float32, [None, C])
  23. self.W = []
  24. self.b = []
  25. self.h = []
  26. self.Dim = Dim
  27.  
  28. #definicija W-ova i b-ova
  29. for i in range (1, n):
  30. self.W.append(tf.Variable(tf.random_normal([Dim[i-1], Dim[i]]), name = "W" + str(i), trainable=True))
  31. self.b.append(tf.Variable(tf.zeros([Dim[i]]), name = 'b' + str(i), trainable=True))
  32.  
  33. #hidden layers
  34. for i in range(0,S):
  35. if i==0:
  36. self.h.append(tf.nn.relu(tf.matmul(self.X,self.W[i]) + self.b[i]))
  37. else:
  38. self.h.append(tf.nn.relu(tf.matmul(self.h[i-1],self.W[i]) + self.b[i]))
  39.  
  40. # formulacija modela: izračunati self.probs
  41. # koristiti: tf.matmul, tf.nn.softmax
  42. if (S==0):
  43. self.probs = tf.nn.softmax(tf.matmul(self.X,self.W[0]) + self.b[0])
  44. else:
  45. self.probs = tf.nn.softmax(tf.matmul(self.h[S-1],self.W[S]) + self.b[S])
  46.  
  47. # formulacija gubitka: self.loss
  48. # koristiti: tf.log, tf.reduce_sum, tf.reduce_mean
  49. for i in range(0,len(self.W)):
  50. w_squared = tf.reduce_sum(tf.nn.l2_loss(self.W[i]))
  51. self.loss = tf.reduce_mean(-tf.reduce_sum(self.Yoh_*tf.log(self.probs),reduction_indices=1)- param_lambda*w_squared)
  52. #self.loss = tf.reduce_mean(-tf.reduce_sum(self.Yoh_*tf.log(self.probs),reduction_indices=1))
  53.  
  54. # formulacija operacije učenja: self.train_step
  55. # koristiti: tf.train.GradientDescentOptimizer,
  56. # tf.train.GradientDescentOptimizer.minimize
  57. self.trainer = tf.train.GradientDescentOptimizer(param_delta)
  58. self.train_step = self.trainer.minimize(self.loss)
  59.  
  60. # instanciranje izvedbenog konteksta: self.session
  61. # koristiti: tf.Session
  62. self.session = tf.Session()
  63.  
  64. def train(self, X, Yoh_, param_niter, batch = False, nmb_batch = 0 ):
  65. """Arguments:
  66. - X: actual datapoints [NxD]
  67. - Yoh_: one-hot encoded labels [NxC]
  68. - param_niter: number of iterations
  69. """
  70. # incijalizacija parametara
  71. # koristiti: tf.initializers.global_variables
  72. self.session.run(tf.global_variables_initializer())
  73.  
  74. # optimizacijska petlja
  75. # koristiti: tf.Session.run
  76. if (batch):
  77. size = int(np.shape(X)[0]/nmb_batch)
  78. for i in range(0,nmb_batch):
  79. start = i*size
  80. end = start+size
  81. X_b = X[start:end]
  82. Y_b = Yoh_[start:end]
  83.  
  84. for j in range(0,param_niter):
  85.  
  86. val_loss, _, val_W,val_B = self.session.run([self.loss, self.train_step, self.W, self.b], feed_dict={self.X: X_b, self.Yoh_: Y_b})
  87. if j==0 or j==450 or j==900:
  88. print(i,j,val_loss)
  89.  
  90. else:
  91. for i in range(0,param_niter):
  92. val_loss, _, val_W,val_B = self.session.run([self.loss, self.train_step, self.W, self.b], feed_dict={self.X: X, self.Yoh_: Yoh_})
  93. print(i,val_loss)#, val_W, val_B)
  94. return
  95.  
  96. def eval(self, X):
  97. """Arguments:
  98. - X: actual datapoints [NxD]
  99. Returns: predicted class probabilites [NxC]
  100. """
  101. # koristiti: tf.Session.run
  102. val_probs = self.session.run([self.probs], feed_dict={self.X: X})
  103. return val_probs
  104.  
  105. def count_params(self):
  106. ##????LOOOOL
  107. var = tf.trainable_variables()
  108. nb_par = 0
  109. for i in range(1,len(self.Dim)):
  110. nb_par += self.Dim[i-1]*self.Dim[i]+self.Dim[i]
  111. return var, nb_par
  112.  
  113. if __name__ == "__main__":
  114. # inicijaliziraj generatore slučajnih brojeva
  115. np.random.seed(100)
  116. tf.set_random_seed(100)
  117.  
  118. # instanciraj podatke X i labele Yoh_
  119. #X,Y_ = data.sample_gauss(2, 100)
  120. X,Y_ = data.sample_gmm_2d(6,2,10)
  121. Yoh_=data.class_to_onehot(Y_)
  122. N=np.shape(X)[0]
  123. # izgradi graf:
  124. tflr = TFDeep([2,2])
  125.  
  126. # nauči parametre:
  127. tflr.train(X, Yoh_, 20000)
  128.  
  129. # dohvati vjerojatnosti na skupu za učenje
  130. probs = np.transpose(tflr.eval(X))
  131. Y= np.argmax(probs,axis=0)
  132. Y = Y.reshape(N,)
  133. #print('Y-',Y_)
  134.  
  135. # ispiši performansu (preciznost i odziv po razredima)
  136. ac,pr,M = data.eval_perf_multi(Y, Y_)
  137. print('Prec and Rec',pr)
  138. var, cnt = tflr.count_params()
  139. print('Trainable var:', var)
  140. print('Broj parametara:', cnt)
  141.  
  142. # iscrtaj rezultate, decizijsku plohu
  143. decfun = lambda X: np.argmax(np.transpose(tflr.eval(X)),axis=0)
  144. bbox=(np.min(X, axis=0), np.max(X, axis=0))
  145. data.graph_surface(decfun, bbox, offset=0.5)
  146.  
  147. # graph the data points
  148. data.graph_data(X, Y_, Y, special=[])
  149. # show the plot
  150. plt.show()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement