Почему мой MLP всегда выдает -1, несмотря ни на что? - PullRequest
0 голосов
/ 25 апреля 2020

Мне нужно взять двумерные входные данные, сгенерированные равномерно из единичного квадрата, а затем пометить данные как 1 или -1 на основе XOR двух функций гипотезы, h1(x) = w1^T*x и h2(x) = w2^T*x, где w1 = [0, 1, -1] и w2 = [0, 1, 1]. Оттуда я должен провести данные через трехслойный многослойный персептрон, используя функцию знака для тета. По какой-то причине мой MLP выдает -1 для всех точек, несмотря ни на что. Где моя ошибка? Вот мой код:

import numpy as np
import matplotlib.pyplot as plt

x = np.random.uniform(-.5, .5, (100,3))
x[:,0] = 1
y = np.ones(100)
w1 = np.array([0, 1, -1]).T
w2 = np.array([0, 1, 1]).T
h1 = np.sign(w1[1]*x[:,1] + w1[2]*x[:,2])
h2 = np.sign(w2[1]*x[:,1] + w2[2]*x[:,2])
for i in range(np.size(x,0)):
    if (h1[i]<0 and h2[i]>0) or (h1[i]>0 and h2[i]<0):
        y[i] = 1
    else:
        y[i] = -1
print("h1:")
print(h1)
print("h2:")
print(h2)

#nodes 21 and 31 are just 1 with weights -1.5 and 1.5, respectively
node22 = np.ones((100,1))
node23 = np.ones((100,1))
node32 = np.ones((100,1))
node33 = np.ones((100,1))
out = np.ones((100,1))
for j in range(np.size(x,0)):
    node22[j] = np.matmul(w1,x[j,:])
    node23[j] = np.matmul(w2,x[j,:])
    node32[j] = np.sign(-1.5 + node22[j] - node23[j])
    node33[j] = np.sign(-1.5 - node22[j] + node23[j])
    out[j] = np.sign(1.5 + node32[j] + node33[j])
print("Layer 2, Node 2:")
print(node22)
print("Layer 2, Node 3:")
print(node23)
print("Layer 3, Node 2:")
print(node32)
print("Layer 3, Node 3:")
print(node33)
print("f:")
print(out)

error = 0
for k in range(np.size(x,0)):
    if y[k] != out[k]:
        error +=1
error = error/np.size(x,0)
print(error)

1 Ответ

0 голосов
/ 25 апреля 2020

Я понял это. Для узлов 22 и 23 вычисление должно быть внутри знаковой функции, поэтому j для l oop должно выглядеть так:

for j in range(np.size(x,0)):
    node22[j] = np.sign(np.matmul(w1,x[j,:]))
    node23[j] = np.sign(np.matmul(w2,x[j,:]))
    node32[j] = np.sign(-1.5 + node22[j] - node23[j])
    node33[j] = np.sign(-1.5 - node22[j] + node23[j])
    out[j] = np.sign(1.5 + node32[j] + node33[j])
'''
...