почему отрицательный уклон дает неправильный результат в этом персептроне? - PullRequest
0 голосов
/ 27 августа 2018

Я изучаю нейронную сеть по книге «Искусственные нейронные сети: практический курс», я строил нейронную сеть для упражнения из книги, в книге сказано, что я использую смещение, равное -1, я сделал это, норезультат, который я получил, был неправильным для некоторых входных данных, я не знаю почему, но когда я изменяю смещение на 1 или другое положительное число, я получил правильный ответ для всех входных данных, я думал, что, потому что это число, которое будет обновлятьсяв каждом взаимодействии с весами это не должно происходить, но происходит, я буду очень благодарен, если кто-нибудь поможет мне или попытается помочь мне, извините за мой плохой английский, это мой код:

#!/usr/bin/python3

из случайной формы импорта

input_train = [[-0,6508, 0,1097, 4.0009], [-1,4492, 0,8896, 4,4005], [2,0850, 0,6876, 12,0710], [0,2626, 1,1476, 7,7985], [0,6418,1.0234, 7.0427], [0.2569, 0.6730, 8.3265], [1.1155, 0.6043, 7.4446], [0.0914, 0.3399, 7.0677], [0.0121, 0.5256, 4.6316], [-0.0429, 0.4660, 5.4323], [0.4340, 0.6870, 8,2287], [0,2735, 1,0287, 7,1934], [0,4839, 0,4851, 7,4850], [0,4089, -0,1127, 5,5019], [1,4391, 0,1614, 8,5843], [-0,9115, -0,1973, 2,1962], [0,3654, 1,0475, 7,4858], [0,2144, 0,7515, 7,1699],[0.2013, 1.0014, 6.5489], [0.6483, 0.2183, 5.8991], [-0.1147, 0.2242, 7.2435], [-0.7970, 0.8795, 3.8762], [-1.0625, 0.6366, 2.4707], [0.5307, 0.1285, 5.6883], [-1,2200, 0,7777, 1,7252], [0,3957, 0,1076, 5,6623], [-0,1013, 0,5989, 7,1812], [2,4482, 0,9455, 11,2095], [2,0149, 0,6192, 10,9263], [0.2012,0.2611,5.4631]]

output_train = [-1.0000, -1.0000, -1.0000, 1.0000, 1.0000, -1.0000, 1.0000, -1.0000, 1.0000, 1.0000, -1.0000, 1.0000, -1.0000, -1.0000, -1.000, -1.0000, 1.0000, 1.0000, 1.0000, 1.0000, -1.0000, 1.0000, 1.0000, 1.0000, 1.0000, 1.0000, -1.0000, -1.0000, 1.0000, -1.0000, 1.0000]

класс персептрон: «Реализация перцептрона: правило Хебба»

def __init__(self, data, output, epoch, bias, learning_rate = 0.01):
    self.data = data
    self.output = output
    self.epoch = epoch
    self.bias = bias
    self.learning_rate = learning_rate
    self.n_samples = len(data)
    self.n_atributtes = len(data[0])
    self.weights = self.GenWeights()

def train(self):
    for epoch in range(self.epoch):
        erro = False
        for row in range(self.n_samples):
            result = self.Predict(self.data[row])

            if result is not self.output[row]:
                self.bias = self.UpdateBias(result, self.output[row])
                for weights in range(self.n_atributtes):
                    self.weights[weights] = self.UpdateWeights(self.weights[weights], result, self.output[row], self.data[row][weights])
                erro = True

        if not erro: break

    return

def Predict(self, datarow):
    sum = self.bias
    for ele in range(self.n_atributtes):
        sum += datarow[ele] * self.weights[ele]
    return 1.0000 if sum >= 0.0 else -1.0000

def UpdateWeights(self, weight, predict, expected, inputc):
    return weight + (((expected - predict) * self.learning_rate) * inputc)

def UpdateBias(self, predict, expected):
    return self.bias + (((expected - predict) * self.learning_rate) * -1 )

def GenWeights(self):
    weights = list()
    for atributtes in range(self.n_atributtes):
        weights.insert(atributtes, uniform(0, 1))
    return weights

def NewEntry(self, newrow):
    sum = self.bias
    for ele in range(self.n_atributtes):
        sum += newrow[ele] * self.weights[ele]
    return 1.0000 if sum >= 0.0 else -1.0000

def main ():

first_neural_network = perceptron(input_train, output_train, 1000, -1)
print("Initial Weights : {}" .format(first_neural_network.weights))
first_neural_network.train()
print("Trained Weights : {} and final bias : {} ".format(first_neural_network.weights, first_neural_network.bias))
a = 0
newlist = []
while True:
    a = float(input("Enter With the first number : "))
    newlist.append(a)
    a = float(input("Enter with the second number : "))
    newlist.append(a)
    a = float(input("Enter with the third number : "))
    newlist.append(a)
    print(newlist)
    print("result is : {0}", format(first_neural_network.NewEntry(newlist)))
    newlist.clear()


del first_neural_network
return

if name == " main ": main ()

1 Ответ

0 голосов
/ 29 августа 2018

измените вашу main функцию для получения error rate

def main():
    first_neural_network = perceptron(input_train, output_train, 1000, 1)
    print("Initial Weights : {}" .format(first_neural_network.weights))
    first_neural_network.train()
    print("Trained Weights : {} and final bias : {} ".format(
        first_neural_network.weights, first_neural_network.bias))
    # a = 0
    # newlist = []
    # while True:
    #     a = float(input("Enter With the first number : "))
    #     newlist.append(a)
    #     a = float(input("Enter with the second number : "))
    #     newlist.append(a)
    #     a = float(input("Enter with the third number : "))
    #     newlist.append(a)
    #     print(newlist)
    #     print("result is : {0}".format(
    #         first_neural_network.NewEntry(newlist)))
    #     newlist.clear()
    nb_error = 0
    for newlist, expected in zip(input_train, output_train):
        pred = first_neural_network.NewEntry(newlist)
        print('true: {:2f} pred: {:2f}'.format(expected, pred))
        nb_error += pred != expected
    print('error rate%:{:.2f}'.format(float(nb_error)/first_neural_network.n_samples))

    del first_neural_network
    return

В вашей конфигурации error rate составляет около 0,47.мелодия bias не играет жизненно важной роли в метрике.Я предполагаю, что ваши данные НЕ являются линейно раздельными, вам нужна более сложная модель для повышения точности

...