Я делаю нейронную сеть. Тренировочный результат для всех пар равен 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)))
Есть идеи?
Спасибо