View rawshort version py hosted with by GitHub


Формула для корректировки веса



Download 111,73 Kb.
bet3/3
Sana30.04.2022
Hajmi111,73 Kb.
#600353
TuriУрок
1   2   3
Bog'liq
нейросеть python

Формула для корректировки веса
Во время тренировочного цикла (Диаграмма 3) мы корректируем веса. Но насколько мы корректируем вес? Мы можем использовать формулу «Взвешенная по ошибке» формула

Почему эта формула? Во-первых, мы хотим сделать корректировку пропорционально величине ошибки. Во-вторых, мы умножаем на входное значение, которое равно 0 или 1. Если входное значение равно 0, вес не корректируется. Наконец, мы умножаем на градиент сигмовидной кривой (диаграмма 4). Чтобы понять последнее, примите во внимание, что:


    1. Мы использовали сигмовидную кривую для расчета выхода нейрона.

    2. Если выходной сигнал представляет собой большое положительное или отрицательное число, это означает, что нейрон так или иначе был достаточно уверен.

    3. Из Диаграммы 4 мы можем видеть, что при больших числах кривая Сигмоида имеет небольшой градиент.

  1. Если нейрон уверен, что существующий вес правильный, он не хочет сильно его корректировать. Умножение на градиент сигмовидной кривой делает именно это.

Градиент Сигмоды получается, если посчитать взятием производной:

Вычитая второе уравнение из первого получаем итоговую формулу:

Существуют также другие формулы, которые позволяют нейрону учиться быстрее, но приведенная имеет значительное преимущество: она простая.
Написание Python кода
Хоть мы и не будем использовать библиотеки с нейронными сетями, мы импортируем 4 метода из математической библиотеки numpy. А именно:

Например, мы можем использовать array() для представления обучающего множества, показанного ранее.




training_set_inputs = array([[0, 0, 1], [1, 1, 1], [1, 0, 1], [0, 1, 1]])




training_set_outputs = array([[0, 1, 1, 0]]).T

view rawtraining_set.py hosted with  by GitHub
“.T” — функция транспонирования матриц. Итак, теперь мы готовы для более красивой версии исходного кода. Заметьте, что на каждой итерации мы обрабатываем всю тренировочную выборку одновременно.




from numpy import exp, array, random, dot












class NeuralNetwork():




def __init__(self):




# Seed the random number generator, so it generates the same numbers




# every time the program runs.




random.seed(1)








# We model a single neuron, with 3 input connections and 1 output connection.




# We assign random weights to a 3 x 1 matrix, with values in the range -1 to 1




# and mean 0.




self.synaptic_weights = 2 * random.random((3, 1)) - 1








# The Sigmoid function, which describes an S shaped curve.




# We pass the weighted sum of the inputs through this function to




# normalise them between 0 and 1.




def __sigmoid(self, x):




return 1 / (1 + exp(-x))








# The derivative of the Sigmoid function.




# This is the gradient of the Sigmoid curve.




# It indicates how confident we are about the existing weight.




def __sigmoid_derivative(self, x):




return x * (1 - x)








# We train the neural network through a process of trial and error.




# Adjusting the synaptic weights each time.




def train(self, training_set_inputs, training_set_outputs, number_of_training_iterations):




for iteration in xrange(number_of_training_iterations):




# Pass the training set through our neural network (a single neuron).




output = self.think(training_set_inputs)








# Calculate the error (The difference between the desired output




# and the predicted output).




error = training_set_outputs - output








# Multiply the error by the input and again by the gradient of the Sigmoid curve.




# This means less confident weights are adjusted more.




# This means inputs, which are zero, do not cause changes to the weights.




adjustment = dot(training_set_inputs.T, error * self.__sigmoid_derivative(output))








# Adjust the weights.




self.synaptic_weights += adjustment








# The neural network thinks.




def think(self, inputs):




# Pass inputs through our neural network (our single neuron).




return self.__sigmoid(dot(inputs, self.synaptic_weights))












if __name__ == "__main__":








#Intialise a single neuron neural network.




neural_network = NeuralNetwork()








print "Random starting synaptic weights: "




print neural_network.synaptic_weights








# The training set. We have 4 examples, each consisting of 3 input values




# and 1 output value.




training_set_inputs = array([[0, 0, 1], [1, 1, 1], [1, 0, 1], [0, 1, 1]])




training_set_outputs = array([[0, 1, 1, 0]]).T








# Train the neural network using a training set.




# Do it 10,000 times and make small adjustments each time.




neural_network.train(training_set_inputs, training_set_outputs, 10000)








print "New synaptic weights after training: "




print neural_network.synaptic_weights








# Test the neural network with a new situation.




print "Considering new situation [1, 0, 0] -> ?: "




print neural_network.think(array([1, 0, 0]))

view rawmain.py hosted with  by GitHub
Код также доступен на гитхабе. Если вы используете Python3 нужно заменить xrange на range.
Заключительные мысли
Попробуйте запустить нейросеть, используя команду терминала:
python main.py
Итоговый должен быть похож на это:




Random starting synaptic weights:




[[-0.16595599]




[ 0.44064899]




[-0.99977125]]








New synaptic weights after training:




[[ 9.67299303]




[-0.2078435 ]




[-4.62963669]]








Considering new situation [1, 0, 0] -> ?:




[ 0.99993704]

view rawconsole_output hosted with  by GitHub
У нас получилось! Мы написали простую нейронную сеть на Python!
Сначала нейронная сеть присваивала себе случайные веса, а затем обучалась с использованием тренировочного набора. Затем нейросеть рассмотрела новую ситуацию [1, 0, 0] и предсказала 0.99993704. Правильный ответ был 1. Так очень близко!
Традиционные компьютерные программы обычно не могут учиться. Что удивительного в нейронных сетях, так это то, что они могут учиться, адаптироваться и реагировать на новые ситуации. Так же, как человеческий разум.
Конечно, это был только 1 нейрон, выполняющий очень простую задачу. А если бы мы соединили миллионы этих нейронов вместе?
Download 111,73 Kb.

Do'stlaringiz bilan baham:
1   2   3




Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©hozir.org 2024
ma'muriyatiga murojaat qiling

kiriting | ro'yxatdan o'tish
    Bosh sahifa
юртда тантана
Боғда битган
Бугун юртда
Эшитганлар жилманглар
Эшитмадим деманглар
битган бодомлар
Yangiariq tumani
qitish marakazi
Raqamli texnologiyalar
ilishida muhokamadan
tasdiqqa tavsiya
tavsiya etilgan
iqtisodiyot kafedrasi
steiermarkischen landesregierung
asarlaringizni yuboring
o'zingizning asarlaringizni
Iltimos faqat
faqat o'zingizning
steierm rkischen
landesregierung fachabteilung
rkischen landesregierung
hamshira loyihasi
loyihasi mavsum
faolyatining oqibatlari
asosiy adabiyotlar
fakulteti ahborot
ahborot havfsizligi
havfsizligi kafedrasi
fanidan bo’yicha
fakulteti iqtisodiyot
boshqaruv fakulteti
chiqarishda boshqaruv
ishlab chiqarishda
iqtisodiyot fakultet
multiservis tarmoqlari
fanidan asosiy
Uzbek fanidan
mavzulari potok
asosidagi multiservis
'aliyyil a'ziym
billahil 'aliyyil
illaa billahil
quvvata illaa
falah' deganida
Kompyuter savodxonligi
bo’yicha mustaqil
'alal falah'
Hayya 'alal
'alas soloh
Hayya 'alas
mavsum boyicha


yuklab olish