Не могу пересчитать веса для нейронной сети после обучения!
Очень надеюсь на помощь. Только начал смотреть что-то по нейросетям для учебного проекта. Учёба программирование затрагивает очень по касательной, но вот потребовалось что-то сделать своими руками. Хотел, чтобы нейросеть пересчитала значения для весов после обучения, но вместо 7 пересчитанных значений получаю вот это:
Random starting synaptic weights:
[[-0.16595599]
[ 0.44064899]
[-0.99977125]
[-0.39533485]
[-0.70648822]
[-0.81532281]
[-0.62747958]]
New synaptic weights after training:
[[ 7.73470947 1.21188474 -4.90030707 2.1117925 -1.56089714 -0.89013968
-2.35685783]
[-1.29747478 5.83175121 0.32427316 -6.68767742 -3.61238143 -4.13911369
-3.10813867]
[-3.28058454 4.122018 9.38853135 2.11171936 -0.7326107 -0.60927343
-2.40796406]
[ 6.96264109 0.7131929 5.3749925 12.12223064 2.52991497 3.85074195
-0.44564184]
[-0.40741729 -0.09576421 -0.10071769 -0.32434514 13.0174758 2.69218577
-1.27188238]
[-4.65664836 -4.88666432 -4.67500763 -4.50632495 -4.22781114 7.22895077
-4.97396353]
[-0.62747958 -0.62747958 -0.62747958 -0.62747958 -0.62747958 -0.62747958
-0.62747958]]
Правильно ли я понимаю, что раз получается такой массив, значит проблема в том, что где-то происходит умножение уже имеющегося массива весов на что-то? Сам код вот такой:
class NeuralNetwork():
"""Класс для нейронной сети"""
def __init__(self):
random.seed(1)
self.synaptic_weights = 2 * random.random((7, 1)) - 1
def __sigmoid(self, x):
return 1 / (1 + exp(-x))
def __sigmoid_derivative(self, x):
return x * (1 - x)
def train(self, training_set_inputs, raining_set_outputs, number_of_training_iterations):
for iteration in range(number_of_training_iterations):
output = self.think(training_set_inputs)
error = training_set_inputs - output
adjustment = dot(training_set_inputs.T, error * self.__sigmoid_derivative(output))
self.synaptic_weights = self.synaptic_weights + adjustment
def think(self, inputs):
return self.__sigmoid(dot(inputs, self.synaptic_weights))
if __name__ == "__main__":
neural_network = NeuralNetwork()
print("Random starting synaptic weights: ")
print(neural_network.synaptic_weights)
training_set_inputs = array([[0, 0, 0, 0, 1, 1, 0],
[0, 0, 0, 0, 0, 1, 0],
[0, 1, 1, 0, 0, 0, 0],
[0, 1, 1, 0, 1, 1, 0],
[1, 1, 1, 1, 1, 1, 0],
[1, 1, 1, 1, 0, 1, 0],
[1, 1, 1, 1, 0, 1, 0],
[1, 1, 0, 0, 0, 0, 0]])
training_set_outputs = array([[0, 0, 0, 0, 1, 1, 1, 1]]).T
neural_network.train(training_set_inputs, training_set_outputs, 10000)
print("New synaptic weights after training: ")
print(neural_network.synaptic_weights)
Ответы (2 шт):
Когда копируете код https://www.kdnuggets.com/2018/10/simple-neural-network-python.html, будьте внимательны при переименовании переменных:
error = training_set_inputs - output -> error = training_outputs - output в оригинале или error = raining_set_outputs - output в вашем коде.
Если что, этот код не пересчитывает веса ПОСЛЕ обучения, а пересчитывает их во время него.
Вот исправил:)
#-*-coding:utf8-*-
from numpy import random
import numpy as np
class NeuralNetwork():
"""Класс для нейронной сети"""
def __init__(self):
random.seed(42)
self.l_r=0.07
self.synaptic_weights = 2 * random.random((1, 7)) - 1 # делаю нейрон в 'своем' стиле
def __sigmoid(self, x):
return 1 / (1 + np.exp(-x))
def __sigmoid_derivative(self, x):
return self.__sigmoid(x) * (1 - self.__sigmoid(x))
def train(self, training_set_inputs, training_set_outputs, number_of_training_iterations):
for iteration in range(number_of_training_iterations):
for retrive_ind in range(len(training_set_inputs)):
weighted ,output = self.think(np.array([training_set_inputs[retrive_ind]])) # передаем только один вектор причем для numpy нужен 2d массив
#print("output",output) # 1 число
error = (training_set_outputs[retrive_ind] - output) * self.__sigmoid_derivative(weighted)
print("error",error)
adjustment_delta = np.dot(error, self.synaptic_weights )
X=np.array([training_set_inputs[retrive_ind]])
#print("X",X)
self.synaptic_weights+= adjustment_delta * X * self.l_r
def think(self, inputs):
weighted=np.dot(self.synaptic_weights, inputs.T)
return (weighted, self.__sigmoid(weighted))
if __name__ == "__main__":
neural_network = NeuralNetwork()
print("Random starting synaptic weights: ")
print(neural_network.synaptic_weights)
training_set_inputs = np.array([[0, 0, 0, 0, 1, 1, 0],
[0, 0, 0, 0, 0, 1, 0],
[0, 1, 1, 0, 0, 0, 0],
[0, 1, 1, 0, 1, 1, 0],
[1, 1, 1, 1, 1, 1, 0],
[1, 1, 1, 1, 0, 1, 0],
[1, 1, 1, 1, 0, 1, 0],
[1, 1, 0, 0, 0, 0, 0]])
training_set_outputs = np.array([[0, 0, 0, 0, 1, 1, 1, 1]]).T
neural_network.train(training_set_inputs, training_set_outputs, 10)
print("New synaptic weights after training: ")
print(neural_network.synaptic_weights)
[cmd]
Random starting synaptic weights:
[[-0.25091976 0.90142861 0.46398788 0.19731697 -0.68796272 -0.68801096
-0.88383278]]
error [[-0.03246489]]
error [[-0.0745709]]
error [[-0.12905986]]
error [[-0.1239805]]
error [[0.12919432]]
error [[0.07983066]]
error [[0.07957007]]
error [[0.07747834]]
error [[-0.03240493]]
error [[-0.0743714]]
error [[-0.12865101]]
error [[-0.12440705]]
error [[0.12895055]]
error [[0.07961511]]
error [[0.07935421]]
error [[0.07745035]]
error [[-0.03234761]]
error [[-0.07417432]]
error [[-0.12823997]]
error [[-0.12483372]]
error [[0.12870773]]
error [[0.07940459]]
error [[0.07914337]]
error [[0.07743354]]
error [[-0.03229295]]
error [[-0.07397967]]
error [[-0.12782673]]
error [[-0.12526049]]
error [[0.12846597]]
error [[0.07919917]]
error [[0.07893766]]
error [[0.07742813]]
error [[-0.03224092]]
error [[-0.07378744]]
error [[-0.1274113]]
error [[-0.12568735]]
error [[0.1282254]]
error [[0.07899894]]
error [[0.07873715]]
error [[0.07743434]]
New synaptic weights after training:
[[-0.28496149 0.93657717 0.46922246 0.21811004 -0.68086341 -0.70116573
-0.88383278]]