Форум сайта python.su
0
Занялся изучением нейросетей на питоне. Нашел пример, написал код под себя. Но почему-то даже для простого примера выдает неправильный прогноз. На вход подаю 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])
Офлайн
13
sdgfdsvdsdНет
Затем после 1000000 итераций самообучения
# Life loop while alive: if (fun > boredom) and money: pass_day(fun, boredom, money) continue else: break
Отредактировано DamMercul (Авг. 20, 2018 15:31:25)
Офлайн