Не работает нейронная сеть
Код этой нейронной сети взят из книги Тарика Рашида "Создаем нейронную сеть". Этот код не работает. Вот код:
import numpy as np
import scipy.special
import matplotlib.pyplot as plt
#определение класса нейронной сети
class Network:
#инициализировать нейронную сеть
def __init__(self, inputnodes, hiddennodes, outputnodes, learningrate):
self.inputnodes = inputnodes
self.hiddennodes = hiddennodes
self.outputnodes = outputnodes
self.learningrate = learningrate
self.wih = np.random.normal(0.0, pow(self.hiddennodes, -0.5), (self.hiddennodes, self.inputnodes))
self.who = np.random.normal(0.0, pow(self.outputnodes, -0.5), (self.outputnodes , self.hiddennodes))
self.activation_func = lambda x: scipy.special.expit(x)
#тренировка нейронной сети
def train(self, inputs_list, target_list):
inputs = np.array(inputs_list, ndmin = 2).T
targets = np.array(target_list, ndmin = 2).T
hidden_inputs = np.dot(self.wih, inputs)
hidden_outputs = self.activation_func(hidden_inputs)
final_input = np.dot(self.who, hidden_outputs)
final_outputs = self.activation_func(final_input)
output_errors = target_list - final_outputs
hidden_errors = np.dot(self.who.T, output_errors)
self.who += self.learningrate * np.dot(output_errors * final_outputs * (1.0 - final_outputs), np.transpose(hidden_outputs))
self.wih += self.learningrate * np.dot(hidden_errors, hidden_outputs * (1.0 - hidden_outputs), np.transpose(inputs))
print(final_outputs)
#опрос нейронной сети
def query(self, inputs_list):
inputs = np.array(inputs_list, ndmin = 2).T
hidden_inputs = np.dot(self.wih, inputs)
final_inputs = np.dot(self.who, hidden_inputs)
final_outputs = self.activation_func(final_inputs)
return final_outputs
target = [[50, 50]]
inputs = [[150, -10]]
n = Network(2, 2, 2, 0.3)
n.train(inputs, target)
Входные данные: [150, -10], что должно получиться на выходе: [50, 50]
Код ошибки:
Traceback (most recent call last):
File "test.py", line 57, in <module>
n.train(inputs, target)
File "test.py", line 35, in train
self.who += self.learningrate * np.dot(output_errors * final_outputs * (1.0 - final_outputs), np.transpose(hidden_outputs))
File "<__array_function__ internals>", line 6, in dot
ValueError: shapes (2,2) and (1,2) not aligned: 2 (dim 1) != 1 (dim 0)
Ответы (1 шт):
Автор решения: Константин
→ Ссылка
import numpy as np
import scipy.special
import matplotlib.pyplot as plt
# определение класса нейронной сети
class Network:
# инициализировать нейронную сеть
def __init__(self, inputnodes, hiddennodes, outputnodes, learningrate):
self.inputnodes = inputnodes
self.hiddennodes = hiddennodes
self.outputnodes = outputnodes
self.learningrate = learningrate
self.wih = np.random.normal(
0.0, pow(self.hiddennodes, -0.5), (self.hiddennodes, self.inputnodes))
self.who = np.random.normal(
0.0, pow(self.outputnodes, -0.5), (self.outputnodes, self.hiddennodes))
# self.activation_func = lambda x: scipy.special.expit(x) scipy не установлен/не устанавливается
def activation_func(self, x, deriv=False): # своя сигмоидная функция активации
y = 1 / (1 + np.exp(-x))
if deriv == True:
return 1 * (1 - y)
return y
def plot_gr(self, _file: str, errors: list, epochs: list) -> None:
fig: plt.Figure = None
ax: plt.Axes = None
fig, ax = plt.subplots()
ax.plot(epochs, errors,
label="learning",
)
plt.xlabel('Эпоха обучения')
plt.ylabel('loss')
ax.legend()
plt.savefig(_file)
print("Graphic saved")
plt.show()
# тренировка нейронной сети
def train(self, inputs_list, target_list):
epochs = 100
e = 0
errors_y = []
eps_x = []
for ep in range(epochs):
for single_arr_ind in range(len(inputs_list)):
inputs = np.array(inputs_list[single_arr_ind], ndmin=2).T
targets = np.array(target_list[single_arr_ind], ndmin=2).T
hidden_inputs = np.dot(self.wih, inputs)
hidden_outputs = self.activation_func(hidden_inputs)
final_input = np.dot(self.who, hidden_outputs)
final_outputs = self.activation_func(final_input)
############### Обратное распространение ошибки ##############
# Q(W) = 1/2 * (targets - out_net)
# goal: arg min[W] Q(W)
e = targets - final_outputs
e = e[0] * e[0]
output_errors = np.multiply(e, self.activation_func(
final_input, deriv=True)) # is dQ/dz2
# Слаживание ошибки на слое 2 т.е dQ/dz2 для слоя 1 (чтобы он сумировал)
hidden_errors = np.dot(self.who.T, output_errors)
self.who += self.learningrate * \
np.multiply(output_errors, hidden_outputs.T)
self.wih += self.learningrate * \
np.multiply(hidden_errors, inputs.T)
print(final_outputs)
##############################################################
e /= 2
print("error", e)
eps_x.append(ep)
errors_y.append(e)
self.plot_gr('gr.png', errors_y, eps_x)
# опрос нейронной сети
def query(self, inputs_list):
inputs = np.array(inputs_list, ndmin=2).T
hidden_inputs = self.activation_func(np.dot(self.wih, inputs))
final_outputs = self.activation_func(np.dot(self.who, hidden_inputs))
return final_outputs
target = [[0.50, 0.50]]
inputs = [[0.150, -0.10]]
n = Network(2, 2, 2, 0.3)
n.train(inputs, target)
