Все веса после тренировки становятся отрицательными - PullRequest
0 голосов
/ 01 сентября 2018

Я делаю нейронную сеть. Тренировочный результат для всех пар равен 0 или 1. Я заметил, что если я добавлю только одну тренировочную пару с целевым выходным значением «1» и 9 других пар с «0», мои веса после тренировки станут отрицательными, однако если Я увеличиваю количество целевых выходов «1» в обучающем наборе, я также вижу положительные веса.

Учебный набор, который дает все отрицательные веса: ВХОД:

[[0.46       0.4        0.98039216]
 [0.58       0.         0.98039216]
 [0.2        1.         0.39215686]
 [0.1        0.4        0.45960784]
 [0.74       0.53333333 0.19607843]
 [0.48       0.93333333 0.        ]
 [0.38       0.7        0.98039216]
 [0.02       0.53333333 1.        ]
 [0.         0.03333333 0.88235294]
 [1.         0.8        0.78431373]]

ВЫВОД:

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

ВЕСА ДО ТРЕНИРОВКИ (СЛУЧАЙНО):

[[-0.16595599]
 [ 0.44064899]
 [-0.99977125]]

ВЕС ПОСЛЕ ОБУЧЕНИЯ:

[[-1.48868116]
 [-4.8662876 ]
 [-5.42639621]]

Однако, если я изменю выходные значения еще на один «1» как таковой

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

Я получаю положительный вес и после тренировки:

[[ 1.85020129]
 [-1.9759502 ]
 [-1.03829837]]

В чем может быть причина этого? Может ли быть так, что слишком много «0» делает «1» незначительным при тренировке? Если да, то как мне изменить подход к тренировкам? Я хочу использовать этот тренинг с тренировочным набором из примерно 480 пар тренировок с выходом '0' и 20 с '1'

(я использую сигмовидную функцию:)

Полный код:

from numpy import exp, array, random, dot
from collections import defaultdict
import csv
import numpy as np

class NeuralNetwork():
    def __init__(self):

        random.seed(1)

        self.synaptic_weights = 2 * random.random((3, 1)) - 1

    def __sigmoid(self, x):
        return 1 / (1 + exp(-x))

    def __sigmoid_derivative(self, x):
        return x * (1 - x)

    def train(self, training_set_inputs, training_set_outputs, number_of_training_iterations):
        for iteration in range(number_of_training_iterations):

            output = self.think(training_set_inputs)
            error = training_set_outputs - output
            adjustment = training_set_inputs.T.dot(error * self.__sigmoid_derivative(output))

            self.synaptic_weights += adjustment


    def think(self, inputs):
        return self.__sigmoid(dot(inputs, self.synaptic_weights))


if __name__ == "__main__":

    neural_network = NeuralNetwork()

    print ("Random starting synaptic weights: ")
    print (neural_network.synaptic_weights)

    training_set_inputs = array([
     [0.46,0.4,0.98039216],
     [0.58,0.0,0.98039216],
     [0.2,1.0,0.39215686],
     [0.1,0.4,0.45960784],
     [0.74,0.53333333,0.19607843],
     [0.48,0.93333333,0.0],
     [0.38,0.7,0.98039216],
     [0.02,0.53333333,1.0],
     [0.,0.03333333,0.88235294],
     [1.0,0.8,0.78431373]])

    training_set_outputs = array([[0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0]]).T

    neural_network.train(training_set_inputs, training_set_outputs, 10000)

    print ("New synaptic weights after training: ")
    print (neural_network.synaptic_weights)

    print ("Considering new situation [0.5,0.5,0.5] -> ?: ")
    test = [0.5,0.5,0.5]
    print (neural_network.think(array(test)))

Есть идеи?

Спасибо

1 Ответ

0 голосов
/ 02 сентября 2018

Похоже, вы не учли скорость обучения, когда вычисляете обновление. Попробуйте умножить «корректировку» на что-то вроде 0,001

        error = training_set_outputs - output
        adjustment = training_set_inputs.T.dot(error * self.__sigmoid_derivative(output))

        self.synaptic_weights += adjustment
...