2016-12-23 5 views
0

Я изучаю ML и работал над созданием нейронной сети с одним слоем. Учебная часть идет отлично. К сожалению, я не могу понять, как я могу использовать полученный вес syn0, чтобы предсказать ответ на тестовые примеры в x_test.Проблемы с алгоритмом прогнозирования ML

Вот код:

import numpy as np 

def nonlinear(x, deriv = False): 
    if(deriv==True): 
     return x*(1-x) 

    return 1/(1+np.exp(-x)) 

def predict(x_test, y_test, ss): 
    prediction = nonlinear(np.abs(np.dot(x_test,ss))) 
    error = np.mean(np.abs(y_test - prediction)) 
    print("P:",prediction,"\nE:",error) 

x = np.array([[1,0,1], 
       [0,1,1], 
       [0,1,0], 
       [1,1,1]]) 

y = np.array([[1], 
       [0], 
       [0], 
       [0]]) 

x_test = np.array([[1,0,0], 
        [1,0,1], 
        [0,1,1], 
        [0,1,0]]) 

y_test = np.array([[1], 
        [1], 
        [0], 
        [0]]) 

np.random.seed(1) 

syn0 = 2*np.random.random((3,1)) - 1 

for _ in range(100000): 

    l0 = x 
    l1 = nonlinear(np.dot(l0, syn0)) 

    l1_error = y - l1 

    if (_%10000) == 0: 
     print("Error at Gen",_,":", str(np.mean(np.abs(l1_error)))) 
     print(l1) 

    l1_delta = l1_error * nonlinear(l1, deriv = True) 

    syn0 += l0.T.dot(l1_delta) 

print(syn0) 

predict(x_test, y_test, syn0) 

Я был бы очень признателен за любую помощь. Благодаря!

P.S. Пожалуйста, не занимите этот вопрос, как в соответствии со StackOverflow, я буду заблокирован от вопросов, если мои ответы будут отменены. Просто дайте мне знать, могу ли я улучшить это или если это дубликат. Мне бы очень хотелось потерять привилегию учиться так много от всех удивительных умов здесь.

+0

Что вы имеете в виду? это уже происходит в последней строке, где вы вызываете 'pred (x_test, y_test, syn0)'. Эта функция выводит ваши прогнозы и ваши ошибки для 'x_test' – plumSemPy

+0

Но предсказание удалено, и ошибка ВСЕГДА почти 0,5 по шкале одного и всех прогнозов составляет почти 1. –

ответ

1

В вашей функции прогнозирования я не вижу причины, по которой мы должны включать абсолютное значение, которое не является частью функции softmax AFAIK. Я изменил его следующим образом:

def predict(x_test, y_test, ss): 
    prediction = nonlinear(np.dot(x_test,ss)) 
    error = np.mean(np.abs(y_test - prediction)) 
    print("P:",prediction,"\nE:",error) 

Это исправило проблему, и я получил идеальное предсказание. [0,9, 0,9, 0,0, 0,0]. Думаете, вам нужно знать, что ваши переменные ответа являются метками, а именно 0 и 1. Хотя ваша модель возвращает вероятности. Хотя ваша эвристика для ошибки в порядке, лично я предпочел бы отключить, чтобы увидеть, как работает мой классификатор. То есть Я бы сказал, что после того, как предсказание сделано, все, что имеет вероятность более 0,5, является меткой 1, а все с вероятностью меньше 0,5 - это метка нуль.

Это даст лучшую оценку точности модели IMO, однако я могу видеть достоинства использования непрерывной меры измерения, которая будет работать очень хорошо, когда ваши ярлыки будут хорошо разделены, а классификатор уверен.

Я думаю, ваша проблема была более с математикой и меньше с реализацией, если вы хотите узнать больше о нейронных сетях, я предлагаю this сайт

Смежные вопросы