Занялся изучением нейросетей на питоне. Нашел пример, написал код под себя. Но почему-то даже для простого примера выдает неправильный прогноз. На вход подаю 4 варианта входных данных, для каждого из которых выходное значение рассчитывается по формуле 4*a+b-2*c. Затем после 1000000 итераций самообучения (достаточно ведь?) подаю комбинацию (5,1,9). Должен выдать ответ 3, а выдает 0.1. Где может быть ошибка? Или для подобных прогнозов нейросети не предназначены? Или нужно больше итераций самообучения делать? Кстати, веса тоже рассчитываются так, как-будто входные данные имеют разную степень вклада в результат. Но эти данные одинаково участвуют в формуле, веса у них должны быть одинаковые. Код ниже
import numpy as np
#Нормализация и денормализация данных
def usual_to_norm(x):
return (x - min_all)*(1-0)/(max_all - min_all) + 0
def norm_to_usual(x):
return (x - 0)*(max_all - min_all)/(1-0) + min_all
# Сигмоида
def nonlin(x,deriv=False):
if(deriv==True):
return x*(1-x)
return 1/(1+np.exp(-x))
#Исходные данные
data_input = np.zeros((4,3))
data_input2 = np.array([[1,2,3],
[4,5,6],
[7,8,9],
[4,3,2]])
#Выходные данные для обучения, 4*a+b-2*c
data_output = np.zeros(4)
data_output2 = np.array([0,9,18,15])
#Данные для прогноза
l_progn = np.zeros(3)
l_progn2 = np.array([5,1,9])
#Нормализация данных
min_all = min(data_input2.min(),data_output2.min(),l_progn2.min())
max_all = max(data_input2.max(),data_output2.max(),l_progn2.max())
for i in range(4):
for j in range(3):
data_input[i,j] = usual_to_norm(data_input2[i,j])
for j in range(4):
data_output[j] = usual_to_norm(data_output2[j])
for j in range(3):
l_progn[j] = usual_to_norm(l_progn2[j])
#Транспонирование выходных данных
data_output = data_output[:,None]
#Начальные веса выставлены в 0
syn0 = np.array([[0,0,0]], float).T
#Обучение
for i in range(1000000):
# прямое распространение
l0 = data_input
l1 = nonlin(np.dot(l0,syn0))
# насколько мы ошиблись?
l1_error = data_output - l1
# перемножим это с наклоном сигмоиды
# на основе значений в l1
l1_delta = l1_error * nonlin(l1,True)
# обновим веса
syn0 += np.dot(l0.T,l1_delta)
print("Веса")
print(syn0)
print("Выход после обучения:")
print(norm_to_usual(l1))
print("Пргноз для: ", l_progn2)
print(norm_to_usual(nonlin(np.dot(l_progn,syn0))))
print("Должен быть: ", 4*l_progn2[0]+l_progn2[1]-2*l_progn2[2])