-
Notifications
You must be signed in to change notification settings - Fork 0
/
own_neural.py
135 lines (116 loc) · 7.59 KB
/
own_neural.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
import numpy
import scipy.special
class neuralNetwork:
# инициализировать нейронную сеть
def __init__(self, inputnodes, hiddennodes, outputnodes, learningrate):
# задать количество узлов во входном, скрытом и выходном слое
self.inodes = inputnodes
self.hnodes = hiddennodes
self.onodes = outputnodes
# коэффициент обучения
self.lr = learningrate
# Матрицы весовых коэффициентов связей wih (между входным и скрытым
# слоями) и who (между скрытым и выходным слоями).
self.wih = numpy.random.normal(0.0, pow(self.hnodes, -0.5), (self .hnodes, self.inodes))
self.who = numpy.random.normal(0.0, pow(self.onodes, -0.5), (self.onodes, self.hnodes))
# использование сигмоиды в качестве функции активации
self.activation_function = lambda x: scipy.special.expit(x)
# тренировка нейронной сети
def train(self, inputs_list, targets_list):
# преобразовать список входных значений в двухмерный массив
inputs = numpy.array(inputs_list, ndmin=2).T
targets = numpy.array(targets_list, ndmin=2).T
# рассчитать входящие сигналы для скрытого слоя
hidden_inputs = numpy.dot(self.wih, inputs)
# рассчитать исходящие сигналы для скрытого слоя
hidden_outputs = self.activation_function(hidden_inputs)
# рассчитать входящие сигналы для выходного слоя
final_inputs = numpy.dot(self.who, hidden_outputs)
# рассчитать исходящие сигналы для выходного слоя
final_outputs = self.activation_function(final_inputs)
# ошибка = целевое значение - фактическое значение
output_errors = targets - final_outputs
# ошибки скрытого слоя - это ошибки output_errors,
# распределенные пропорционально весовым коэффициентам связей
# и рекомбинированные на скрытых узлах
hidden_errors = numpy.dot(self.who.T, output_errors)
# обновить весовые коэффициенты для связей между
# скрытым и выходным слоями
self.who += self.lr * numpy.dot((output_errors * final_outputs * (1.0 - final_outputs)), numpy.transpose(hidden_outputs))
# обновить весовые коэффициенты для связей между
# входным и скрытым слоями
self.wih += self.lr * numpy.dot((hidden_errors * hidden_outputs * (1.0 - hidden_outputs)), numpy.transpose(inputs))
# опрос нейронной сети
def query(self, inputs_list):
# преобразовать список входных значений в двухмерный массив
inputs = numpy.array(inputs_list, ndmin=2).T
# рассчитать входящие сигналы для скрытого слоя
hidden_inputs = numpy.dot(self.wih, inputs)
# рассчитать исходящие сигналы для скрытого слоя
hidden_outputs = self.activation_function(hidden_inputs)
# рассчитать входящие сигналы для выходного слоя
final_inputs = numpy.dot(self.who, hidden_outputs)
# рассчитать исходящие сигналы для выходного слоя
final_outputs = self.activation_function(final_inputs)
return final_outputs
# количество входных, скрытых и выходных узлов
input_nodes = 784
hidden_nodes = 200
output_nodes = 10
# коэффициент обучения равен 0,3
learning_rate =0.1
# переменная epochs указывает, сколько раз тренировочный
# набор данных используется для тренировки сети
epochs = 5
# создать экземпляр нейронной сети
n = neuralNetwork(input_nodes,hidden_nodes,output_nodes,learning_rate)
# загрузить в список тестовый набор данных CSV-файла набора MNIST
with open("mnist_train.csv", 'r') as training_data_file:
training_data_list = training_data_file.readlines()
# тренировка нейронной сети
for e in range(epochs):
# перебрать все записи в тренировочном наборе данных
for record in training_data_list:
# получить список значений, используя символы запятой (!,')
# в качестве разделителей
all_values = record.split(',')
# масштабировать и сместить входные значения
inputs = (numpy.asfarray(all_values[1:])/ 255.0 * 0.99) + 0.01
# создать целевые выходные значения (все равны 0,01, за исключением
# желаемого маркерного значения, равного 0,99)
targets = numpy.zeros(output_nodes) +0.01
# all_values[0] - целевое маркерное значение для данной записи
targets[int(all_values[0])] =0.99
n.train(inputs, targets)
# загрузить в список тестовый набор данных CSV-файла набора MNIST
with open("mnist_test.csv", 'r') as test_data_file:
test_data_list = test_data_file.readlines()
# тестирование нейронной сети
# журнал оценок работы сети, первоначально пустой
scorecard = []
# перебрать все записи в тестовом наборе данных
for record in test_data_list:
# получить список значений из записи, используя символы
# запятой в качестве разделителей
all_values = record.split(',')
# правильный ответ - первое значение
correct_label = int(all_values[0])
# масштабировать и сместить входные значения
inputs = (numpy.asfarray(all_values[1:]) / 255.0 * 0.99) + 0.01
# опрос сети
outputs = n.query(inputs)
# индекс наибольшего значения является маркерным значением
label = numpy.argmax(outputs)
# присоединить оценку ответа сети к концу списка
if(label == correct_label):
# в случае правильного ответа сети присоединить
# к списку значение 1
scorecard.append(1)
else:
# в случае неправильного ответа сети присоединить
# к списку значение 0
scorecard.append(0)
# рассчитать показатель эффективности в виде
# доли правильных ответов
scorecard_array = numpy.asarray(scorecard)
print("эффективность = ", scorecard_array.sum() / scorecard_array.size)