Уведомления

Группа в Telegram: @pythonsu

#1 Авг. 16, 2018 21:04:51

sdgfdsvdsd
Зарегистрирован: 2018-08-16
Сообщения: 1
Репутация: +  0  -
Профиль   Отправить e-mail  

Нейронные сети

Занялся изучением нейросетей на питоне. Нашел пример, написал код под себя. Но почему-то даже для простого примера выдает неправильный прогноз. На вход подаю 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])

Офлайн

#2 Авг. 20, 2018 15:31:08

DamMercul
Зарегистрирован: 2017-11-26
Сообщения: 325
Репутация: +  13  -
Профиль   Отправить e-mail  

Нейронные сети

sdgfdsvdsd
Затем после 1000000 итераций самообучения
Нет

И вообще эти статьи типо “нейронная сеть за 11 строк” все фигня, это не нейронная сеть, это специализированная программа по угадыванию чисел (как я понял по угадыванию).



____________________________________________________

 # Life loop
while alive:
    if (fun > boredom) and money:
        pass_day(fun, boredom, money)
        continue
    else: break

Отредактировано DamMercul (Авг. 20, 2018 15:31:25)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version