2016-06-24 3 views
1

Я пытаюсь заставить свою программу изучать логические логические схемы, используя алгоритм нейронной сети и градиентного спуска. Я взял дополнительный входной нейрон как -1, так что я могу настроить порог нейрона для активации позже. порог в настоящее время является просто 0. Вот моя попытка реализацииОбучение ИЛИ через градиентный спуск

#!/usr/bin/env python 
from numpy import * 
def pcntrain(inp, tar, wei, eta): 
    for data in range(nData): 
     activation = dot(inp,wei) 
     wei += eta*(dot(transpose(inp), target-activation)) 
     print "ITERATION " + str(data) 
     print wei 
    print "TESTING LEARNED ALGO" 
    # Sample input 
    activation = dot(array([[0,0,-1],[1,0,-1],[1,1,-1],[0,0,-1]]),wei) 
    print activation 
nIn = 2 
nOut = 1 
nData = 4 
inputs = array([[0,0],[0,1],[1,0],[1,1]]) 
target = array([[0],[1],[1],[1]]) 
inputs = concatenate((inputs,-ones((nData,1))),axis=1) #add bias input = -1 
weights = random.rand(nIn +1,nOut)*0.1-0.05 #random weight 
if __name__ == '__main__': 
    pcntrain(inputs, target, weights, 0.25) 

Этот код, кажется, производит вывод, который не кажется, как логического элемента ИЛИ. Помогите?

ответ

1

Ну это является логического элемента ИЛИ, если вы исправить данные тестирования, чтобы быть

activation = dot(array([[0,0,-1],[1,0,-1],[1,1,-1],[0,1,-1]]),wei) 

(ваш код не имеет 0,0 раза, и никогда не 0,1) она производит

[[ 0.30021868] 
[ 0.67476151] 
[ 1.0276208 ] 
[ 0.65307797]] 

, который после вызова раунд дает

[[ 0.] 
[ 1.] 
[ 1.] 
[ 1.]] 

по желанию.

Тем не менее, есть некоторые незначительные ошибки:

  • вы работаете 4 итерации градиентного спуска (основной контур), кроме того, он исходит из того, что вы используете количество входов для указания, что - это iscontre, нет никакой связи между количеством «разумных» итераций и количеством точек. Если вы выполните 100 итераций, вы получите более близкие оценки

.

[[ 0.25000001] 
[ 0.75  ] 
[ 1.24999999] 
[ 0.75  ]] 
  • ваша модель является линейной и имеет линейный выход, таким образом, вы не можете ожидать, что это выход ровно 0 и 1, приведенный выше результат (0,25, 0,75 и 1,25) на самом деле является оптимальным решением для такого рода модель модель. Если вы хотите, чтобы он сходился к хорошему 0/1, вам нужно сигмоид в выходе и, следовательно, различные потери/производные (это все еще линейная модель в смысле ML, вы просто имеете функцию раздавливания на выходе, чтобы заставить ее работать правильно пространство).
  • вы не используете «деготь» аргумент в вашей функции, вместо этого, вы обращаетесь к глобальной переменной «цели» (которые имеют такое же значение, но это явная ошибка)
+0

Великий ответ, вы можете сказать мне, как вы получили матрицу [[0.] [1.] [1.] [1.]]? – Sigma

+0

Я импортировал numpy как np и назвал np.round() на ваши оценки – lejlot

+0

Хорошо, спасибо. Это было действительно полезно – Sigma

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