Advertisement
Guest User

Untitled

a guest
Jul 20th, 2017
73
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 9.42 KB | None | 0 0
  1. x_vals = np.array([[1.0, 0.0],[0.0, 0.0], [0.0, 1.0], [1.0, 1.0]])
  2. y_vals = np.array([[1.0],[0.0],[1.0],[0.0]])
  3. result = run_nn(x,y)
  4. with tf.Session() as sess:
  5. sess.run(init)
  6. results = sess.run(result, feed_dict={x: x_vals, y:y_vals})
  7. print results
  8.  
  9. InvalidArgumentError: Incompatible shapes: [2,3] vs. [4,3]
  10. [[Node: Mul_6 = Mul[T=DT_FLOAT, _device="/job:localhost/replica:0/task:0/cpu:0"](transpose_10, concat_12)]]
  11.  
  12. import math
  13. import numpy as np
  14.  
  15. momentum = 0.5
  16. learning_rate = 2.0
  17.  
  18. class layer:
  19. def __init__(self, num_neurons, num_weights, layer_type):#number of weights corresponds to number of neurons in next layer
  20. self.num_neurons = num_neurons
  21. self.num_weights = num_weights
  22. self.layer_type = layer_type
  23. if layer_type == 'hidden':
  24. num_neurons = num_neurons+1#account for bias
  25. self.num_neurons = num_neurons+1
  26. self.weights = tf.random_normal([num_neurons, num_weights])
  27. self.outputs = tf.zeros(num_neurons, tf.float32)
  28. self.sums = tf.zeros(num_neurons, tf.float32)
  29. self.deltas = tf.zeros(num_neurons, tf.float32)
  30. self.gradiants = tf.zeros([num_neurons, num_weights], tf.float32)
  31. self.weight_deltas = tf.zeros_like(self.gradiants)
  32. def calculate_sums(self, p_layer):
  33. self.sums = tf.transpose(tf.reduce_sum(tf.multiply(tf.transpose(p_layer.weights) , p_layer.outputs), 1))
  34. return self.sums
  35. def calculate_outputs(self, p_layer):
  36. if self.layer_type == 'hidden':
  37. self.outputs = tf.concat([sigmoid(self.sums, False), tf.constant([1.0])], 0)
  38. else:
  39. self.outputs = sigmoid(self.sums, False)
  40. return self.outputs
  41. def calculate_deltas(self, n_layer = None, y=None):
  42. if self.layer_type == 'hidden':
  43. self.deltas = sigmoid(self.sums, True) * n_layer.deltas * self.weights[:-1,0]
  44. else:#output delta
  45. E = self.outputs[:self.num_neurons]-y
  46. #print 'error: {}'.format(E)
  47. self.deltas = -E* sigmoid(self.sums, True)
  48. return self.deltas
  49. def calculate_gradiants(self, n_layer):
  50. shape = (tf.shape(self.outputs)[0], 1)
  51. self.gradiants += tf.reshape(self.outputs, shape=shape) * tf.transpose(n_layer.deltas)#we add the gradiants for every batch completion then update, dont want to update every time
  52. return self.gradiants
  53. def update_weights(self):
  54. self.weight_deltas = self.gradiants*learning_rate + momentum * self.weight_deltas
  55. self.weights += self.weight_deltas
  56. # for i in range(len(self.gradiants)):
  57. # for j in range(len(self.gradiants[0])):
  58. # self.weight_deltas[i,j] = weight_change(self.gradiants[i,j], self.weight_deltas[i,j])
  59. # self.weights[i,j] += self.weight_deltas[i,j]
  60.  
  61.  
  62. def sigmoid(x, derivative = False):
  63. if derivative == True:
  64. return (1.0/(1+tf.exp(-x))) * (1.0 - (1.0/(1+tf.exp(-x))))
  65. return 1.0/(1+tf.exp(-x))
  66. #the output delta is just E*f'i, essentially the error * the derivative of the activation function
  67. def weight_change(g, p_w_delta):#gradiant, previous weight delta
  68. return learning_rate*g + momentum * p_w_delta
  69.  
  70. def run_nn(x_val, y_val):
  71. l0.outputs = tf.concat([x_val, tf.ones(shape=(tf.shape(x_val)[0],1))], 1)
  72. print 'set output'
  73. #forward pass
  74. # l1.calculate_sums(l0)
  75. # print 'l1 calc sum'
  76. # l1.calculate_outputs(l0)
  77. # print 'l1 calc output'
  78.  
  79. # ol.calculate_sums(l1)
  80. # print 'ol calc sum'
  81. # ol.calculate_outputs(l1)
  82. # print 'ol calc output'
  83. # #backwards pass
  84. # ol.calculate_deltas(y=y_val)
  85. # print 'ol calc deltas'
  86. # l1.calculate_deltas(ol)
  87. # print 'l1 calc deltas'
  88. # l1.calculate_gradiants(ol)
  89. # print 'l1 calc gradiants'
  90. # l0.calculate_gradiants(l1)
  91. # print 'l0 calc gradiants'
  92. # #we dont want to update the weights every time, just after we have gone through every batch/minibatch
  93. # l1.update_weights()
  94. # print 'l1 update weights'
  95. # l0.update_weights()
  96. # print 'l0 uipdate weights'
  97. # l1.gradiants = tf.zeros_like(l1.gradiants)
  98. # print 'l1 zero gradiants'
  99. # l0.gradiants = tf.zeros_like(l0.gradiants)
  100. # print 'l0 zero gradiants'
  101. # #test
  102. # print 'run test'
  103. # l0.outputs = tf.concat([x, tf.constant([1.0])], 0 )
  104. # #forward pass
  105. # l1.calculate_sums(l0)
  106. # l1.calculate_outputs(l0)
  107. #
  108. # ol.calculate_sums(l1)
  109. # ol.calculate_outputs(l1)
  110. # print 'DONE'
  111. return tf.transpose(tf.reduce_sum(tf.multiply(tf.transpose(l0.weights) , l0.outputs), 1))
  112.  
  113.  
  114.  
  115. l0 = layer(2,2,'hidden')#input
  116. l1 = layer(2,1,'hidden')#hidden
  117. ol = layer(1,0,'output')#output
  118. x_vals = np.array([[1.0, 0.0],[0.0, 0.0], [0.0, 1.0], [1.0, 1.0]])
  119. y_vals = np.array([[1.0],[0.0],[1.0],[0.0]])
  120.  
  121.  
  122. # initialize variables
  123. init = tf.global_variables_initializer()
  124. x = tf.placeholder('float', None)
  125. y = tf.placeholder('float', None)
  126. result = run_nn(x,y)
  127. with tf.Session() as sess:
  128. sess.run(init)
  129. results = sess.run(result, feed_dict={x: x_vals, y:y_vals})
  130. print results
  131.  
  132. import math
  133. import numpy as np
  134.  
  135. momentum = 0.5
  136. learning_rate = 2.0
  137.  
  138. class layer:
  139. def __init__(self, num_neurons, num_weights, layer_type):#number of weights corresponds to number of neurons in next layer
  140. self.layer_type = layer_type
  141. if layer_type == 'hidden':
  142. num_neurons = num_neurons+1#account for bias
  143. self.weights = np.random.rand(num_neurons,num_weights)
  144. self.outputs = np.zeros(shape=(1,num_neurons))
  145. self.sums = np.zeros(shape=(1,num_neurons))
  146. self.deltas = np.zeros(shape=(1,num_neurons)).T
  147. self.gradiants = np.zeros(shape=(num_neurons,num_weights))
  148. self.weight_deltas = np.zeros_like(self.gradiants)
  149. def calculate_sums(self, p_layer):
  150. self.sums = np.array([(sum(p_layer.weights * p_layer.outputs))]).T
  151. return self.sums;
  152. def calculate_outputs(self, p_layer):
  153. if self.layer_type == 'hidden':
  154. self.outputs = np.concatenate((np.array([[sigmoid(X, False)] for X in self.sums]), np.array([[1.0]])))
  155. else:
  156. self.outputs = np.array([[sigmoid(X, False)] for X in self.sums])
  157. return self.outputs
  158. def calculate_deltas(self, n_layer = None):
  159. if self.layer_type == 'hidden':
  160. self.deltas = np.array([[sigmoid(X, True)] for X in self.sums]) * n_layer.deltas * self.weights[:-1]
  161. else:#output delta
  162. E = self.outputs-y
  163. #print 'error: {}'.format(E)
  164. self.deltas = -E* sigmoid(self.sums, True)
  165. return self.deltas
  166. def calculate_gradiants(self, n_layer):
  167. self.gradiants += self.outputs * n_layer.deltas.T#we add the gradiants for every batch completion then update, dont want to update every time
  168. return self.gradiants
  169. def update_weights(self):
  170. for i in range(len(self.gradiants)):
  171. for j in range(len(self.gradiants[0])):
  172. self.weight_deltas[i,j] = weight_change(self.gradiants[i,j], self.weight_deltas[i,j])
  173. self.weights[i,j] += self.weight_deltas[i,j]
  174.  
  175.  
  176. def sigmoid(x, derivative = False):
  177. if derivative == True:
  178. return (1.0/(1+math.exp(-x))) * (1.0 - (1.0/(1+math.exp(-x))))
  179. return 1.0/(1+math.exp(-x))
  180. #the output delta is just E*f'i, essentially the error * the derivative of the activation function
  181. def weight_change(g, p_w_delta):#gradiant, previous weight delta
  182. return learning_rate*g + momentum * p_w_delta
  183.  
  184.  
  185. input_layer = layer(3,2, 'hidden')
  186. hidden_layer1 = layer(2,1, 'hidden')
  187. output_layer = layer(1,0, 'output')
  188.  
  189. x_vals = []
  190. y_vals = []
  191. for i in range(2):
  192. for j in range(2):
  193. for k in range(2):
  194. x_vals.append(np.array([[float(i)],[float(j)],[float(k)]]))
  195. y_vals.append(np.array([float(i ^ j ^ k)]))
  196.  
  197. #x_vals = [np.array([[1.0], [0.0]]), np.array([[0.0], [0.0]]), np.array([[0.0], [1.0]]),np.array([[1.0], [1.0]])]
  198. #y_vals = np.array([[1.0],[0.0],[1.0],[0.0]])
  199. #input_layer.weights = np.array([[-0.06782947598673161,0.9487814395569221],[0.22341077197888182,0.461587116462548], [-0.4635107399577998, 0.09750161997450091]])
  200. #hidden_layer1.weights = np.array([[-0.22791948943117624],[0.581714099641357], [0.7792991203673414]])
  201.  
  202. Error = []
  203. for n in range(10000):
  204. for x, y in zip(x_vals, y_vals):
  205. input_layer.outputs = np.concatenate((x, np.array([[1.0]])))
  206. #forward pass
  207. hidden_layer1.calculate_sums(input_layer)
  208. hidden_layer1.calculate_outputs(input_layer)
  209.  
  210. output_layer.calculate_sums(hidden_layer1)
  211. output_layer.calculate_outputs(hidden_layer1)
  212. Error.append(-(output_layer.outputs-y))
  213. #backwards pass
  214. output_layer.calculate_deltas()
  215. hidden_layer1.calculate_deltas(output_layer)
  216.  
  217. hidden_layer1.calculate_gradiants(output_layer)
  218. input_layer.calculate_gradiants(hidden_layer1)
  219. if n % 1000 == 0:
  220. print 'Epoch #{}; error: {}'.format(n, sum(Error)/len(Error))
  221. Error = []
  222. #we dont want to update the weights every time, just after we have gone through every batch/minibatch
  223. hidden_layer1.update_weights()
  224. input_layer.update_weights()
  225. hidden_layer1.gradiants.fill(0.0)
  226. input_layer.gradiants.fill(0.0)
  227.  
  228.  
  229. #test
  230. for x, y in zip(x_vals, y_vals):
  231. input_layer.outputs = np.concatenate((x, np.array([[1.0]])))
  232. #forward pass
  233. hidden_layer1.calculate_sums(input_layer)
  234. hidden_layer1.calculate_outputs(input_layer)
  235.  
  236. output_layer.calculate_sums(hidden_layer1)
  237. output_layer.calculate_outputs(hidden_layer1)
  238. print 'Y_hat: {}, Y: {}'.format(round(float(output_layer.outputs), 3), float(y))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement