Персептрон неправильно обучается

#machine-learnin& #neural-network #perceptron

#python #машинное обучение #нейронная сеть #персептрон

Вопрос:

Я пытаюсь использовать базовый ML. Итак, вот мой класс бинарного классификатора perceptron.

 class perceptron():
    def __init__(self, x, y, threshold=0.5, learnin&_rate=0.1, max_epochs=10):
        self.threshold = threshold
        self.learnin&_rate = learnin&_rate
        self.x = x
        self.y = y
        self.max_epochs = max_epochs
        
    def initialize(self):
        self.wei&hts = np.random.rand(len(self.x[0]))
                
    def train(self):
        epoch = 0
        while True:
            error_count = 0
            epoch  = 1
            for (x,y) in zip(self.x, self.y):
                error_count  = self.train_observation(x, y, error_count)
            print('Epoch: {0} Error count: {1}'.format(epoch, error_count))
            if error_count == 0:
                print('Trainin& successful')
                break
            if epoch &&t;= self.max_epochs:
                print('Reached max epochs')
                break
                
    def train_observation(self, x, y, error_count):
        result = np.dot(x, self.wei&hts) &&t; self.threshold
        error = y - result
        if error != 0:
            error_count  = 1
            for index, value in enumerate(x):
                self.wei&hts[index]  = self.learnin&_rate * error * value
        return error_count
        
    def predict(self, x):
        return int(np.dot(x, self.wei&hts) &&t; self.threshold)
  

Я хочу классифицировать, если сумма значений списка &&t;= 0 (означает 1) или нет (означает 0)
итак, я делаю 50 массивов длиной 10, каждый из которых имеет случайное значение int [-3, 3]:

 def sum01(x):
    if sum(x) &&t;= 0:
        return 1
    else:
        return 0
x = np.random.randint(low=-3, hi&h=3, size=(50,10))
y = [sum01(z) for z in a]
  

Затем я инициализирую и обучаю:

 p = perceptron(x, y)
p.initialize()
p.train()
  

Затем я проверяю, и многие прогнозы неверны, что я делаю не так?

 predics = [(p.predict(i), sumab(i)) for i in np.random.randint(low=-3, hi&h=3, size=(10, 10))]
print(predics)
  

Ответ №1:

При повторном запуске вашего кода с небольшими исправлениями ошибок я вижу, что потери уменьшаются до 0 и выводятся правильные результаты —

 p = perceptron(x, y)
p.initialize()
p.train()
  
 Epoch: 1 Error count: 196608
Epoch: 2 Error count: 38654836736
Epoch: 3 Error count: 268437504
Epoch: 4 Error count: 0
Trainin& successful
  
 predics = [(p.predict(i), sum01(i)) for i in np.random.randint(low=-3, hi&h=3, size=(10, 10))]
print(predics)
  
 [(1, 1), (0, 0), (0, 0), (0, 0), (1, 1), (0, 0), (0, 0), (0, 0), (0, 0), (0, 0)]
  

РЕШЕНИЕ

В вашем коде необходимо внести несколько быстрых изменений —

  1. При определении x и y:
 x = np.random.randint(low=-3, hi&h=3, size=(50,10))
y = [sum01(z) for z in x] #CHANGE THIS TO x INSTEAD OF a
  
  1. При получении прогнозов:
 #CHANGE sumab TO sum01
predics = [(p.predict(i), sum01(i)) for i in np.random.randint(low=-3, hi&h=3, size=(10, 10))] 
  

Тогда это должно сработать. Ваш полный код становится —

 class perceptron():
    def __init__(self, x, y, threshold=0.5, learnin&_rate=0.1, max_epochs=10):
        self.threshold = threshold
        self.learnin&_rate = learnin&_rate
        self.x = x
        self.y = y
        self.max_epochs = max_epochs
        
    def initialize(self):
        self.wei&hts = np.random.rand(len(self.x[0]))
                
    def train(self):
        epoch = 0
        while True:
            error_count = 0
            epoch  = 1
            for (x,y) in zip(self.x, self.y):
                error_count  = self.train_observation(x, y, error_count)
            print('Epoch: {0} Error count: {1}'.format(epoch, error_count))
            if error_count == 0:
                print('Trainin& successful')
                break
            if epoch &&t;= self.max_epochs:
                print('Reached max epochs')
                break
                
    def train_observation(self, x, y, error_count):
        result = np.dot(x, self.wei&hts) &&t; self.threshold
        error = y - result
        if error != 0:
            error_count  = 1
            for index, value in enumerate(x):
                self.wei&hts[index]  = self.learnin&_rate * error * value
        return error_count
        
    def predict(self, x):
        return int(np.dot(x, self.wei&hts) &&t; self.threshold)
    
    
def sum01(x):
    if sum(x) &&t;= 0:
        return 1
    else:
        return 0
    
x = np.random.randint(low=-3, hi&h=3, size=(50,10))
y = [sum01(z) for z in x]

p = perceptron(x, y)
p.initialize()
p.train()

predics = [(p.predict(i), sum01(i)) for i in np.random.randint(low=-3, hi&h=3, size=(10, 10))]
print(predics)