Advertisement
Guest User

Untitled

a guest
May 24th, 2019
125
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.80 KB | None | 0 0
  1. from math import exp
  2. from random import random
  3.  
  4.  
  5. class Network:
  6. def __init__(self, n_inputs, n_hidden, n_outputs, n_epoch, learning_rate):
  7. self.layers = []
  8. self.n_outputs = n_outputs
  9. self.hidden_layer = [{'weights': [random() for _ in range(n_inputs + 1)]} for _ in range(n_hidden)]
  10. self.layers.append(self.hidden_layer)
  11. self.output_layer = [{'weights': [random() for _ in range(n_hidden + 1)]} for _ in range(n_outputs)]
  12. self.layers.append(self.output_layer)
  13. self.learning_rate = learning_rate
  14. self.epochs = n_epoch
  15.  
  16. @staticmethod
  17. def activate(weights, inputs) -> float:
  18. return weights[-1] + sum([weights[i] * inputs[i] for i in range(len(weights) - 1)])
  19.  
  20. @staticmethod
  21. def transfer(activation: float) -> float:
  22. return 1.0 / (1.0 + exp(-activation))
  23.  
  24. def forward_propagate(self, row):
  25. inputs = row
  26. for layer in self.layers:
  27. new_inputs = []
  28. for neuron in layer:
  29. activation: float = self.activate(neuron['weights'], inputs)
  30. neuron['output']: float = self.transfer(activation)
  31. new_inputs.append(neuron['output'])
  32. inputs = new_inputs
  33.  
  34. return inputs
  35.  
  36. @staticmethod
  37. def transfer_derivative(output):
  38. return output * (1.0 - output)
  39.  
  40. def backward_propagate_error(self, expected):
  41. for i in reversed(range(len(self.layers))):
  42. layer = self.layers[i]
  43. errors = []
  44. if i != len(self.layers) - 1:
  45. for j in range(len(layer)):
  46. error = 0.0
  47. for neuron in self.layers[i + 1]:
  48. error += neuron['weights'][j] * neuron['delta']
  49. errors.append(error)
  50. else:
  51. for j in range(len(layer)):
  52. neuron = layer[j]
  53. errors.append(expected[j] - neuron['output'])
  54. for j in range(len(layer)):
  55. neuron = layer[j]
  56. neuron['delta'] = errors[j] * self.transfer_derivative(neuron['output'])
  57.  
  58. def update_weights(self, row):
  59. for i in range(len(self.layers)):
  60. inputs = row[:-1]
  61. if i != 0:
  62. inputs = [neuron['output'] for neuron in self.layers[i - 1]]
  63. for neuron in self.layers[i]:
  64. for j in range(len(inputs)):
  65. neuron['weights'][j] += self.learning_rate * neuron['delta'] * inputs[j]
  66. neuron['weights'][-1] += self.learning_rate * neuron['delta']
  67.  
  68. def train(self, train):
  69. for epoch in range(self.epochs):
  70. sum_error = 0
  71. for row in train:
  72. outputs = self.forward_propagate(row)
  73. expected = [0 for _ in range(self.n_outputs)]
  74. for i in range(len(row[-1])-1):
  75. if row[-1][i] == 1:
  76. expected[i] = 1
  77. #expected[row[-1]] = 1
  78. sum_error += sum([(expected[i] - outputs[i]) ** 2 for i in range(len(expected))])
  79. self.backward_propagate_error(expected)
  80. self.update_weights(row)
  81. print('>epoch = %d. error = %.3f' % (epoch + 1, sum_error))
  82.  
  83. def predict(self, row):
  84. outputs = self.forward_propagate(row)
  85. return outputs.index(max(outputs))
  86.  
  87. def test(self, test_data):
  88. score = sum(1 for inputs in test_data if self.predict(inputs) == inputs[-1])
  89. return score / len(test_data)
  90.  
  91.  
  92. def read_data():
  93. expected_data = {
  94. "Move-Forward": [1, 0, 0, 0],
  95. "Slight-Right-Turn": [0, 1, 0, 0],
  96. "Sharp-Right-Turn": [0, 0, 1, 0],
  97. "Slight-Left-Turn": [0, 0, 0, 1]
  98. }
  99.  
  100. parsed_data = []
  101. with open('sensor_readings_24.data', 'r') as f:
  102. for line in f.readlines():
  103. parsed_data.append([])
  104. line = line.strip().split(',')
  105. for i in range(len(line)):
  106. if i < 24:
  107. parsed_data[-1].append(float(line[i]))
  108. else:
  109. parsed_data[-1].append(expected_data[line[i]])
  110.  
  111. return parsed_data
  112.  
  113.  
  114. def dataset_minmax(dataset):
  115. return [[min(column), max(column)] for column in zip(*dataset)]
  116.  
  117.  
  118. def normalize_dataset(dataset):
  119. minmax = dataset_minmax(dataset)
  120. for row in dataset:
  121. for i in range(len(row) - 1):
  122. row[i] = (row[i] - minmax[i][0]) / (minmax[i][1] - minmax[i][0])
  123.  
  124.  
  125. if __name__ == '__main__':
  126. data = read_data()
  127. normalize_dataset(data)
  128.  
  129. train_data = data[:5000]
  130. test_data = data[5000:]
  131.  
  132. network = Network(24, n_hidden=15, n_outputs=4, learning_rate=0.2, n_epoch=100)
  133. network.train(train_data)
  134.  
  135. print(network.test(test_data))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement