Как обучить сеть с двумя и более слоями ⇐ Python
-
Anonymous
Как обучить сеть с двумя и более слоями
Я реализую нейронную сеть с нуля, используя Python. У меня есть класс Neuron, класс слоя и класс сети.
Мне удалось обучить и использовать сеть с 1 слоем, 1 нейроном и 3 входами.
Теперь я хочу попробовать использовать 2 или более слоев, оба с произвольным количеством нейронов. Моя проблема в том, как мне теперь изменить функцию «обучение», чтобы обучить такую сеть?
В настоящее время, если уровень равен 0, он будет вводить сетевые входы в нейроны. Если уровень выше 0, он будет вводить выходные данные предыдущего слоя.
Но что мне делать дальше?
Я использовал код ниже:
импортировать numpy как np из опыта импорта numpy, случайный импорт математики из sklearn.datasets импортируйте make_blobs импортировать matplotlib.pyplot как plt np.random.seed(1) класс Нейрон: def __init__(self, веса, смещение): self.weights = веса self.bias = предвзятость Защиту сигмоида (я, х): выход = 1/(1+exp(-x)) обратный вывод def вычислить(сам, входы): self.output = self.sigmoid(np.dot(inputs, self.weights) + self.bias) вернуть собственный вывод слой класса: def __init__(self, NumberOfNeurons, NumberOfInputs): self.neurons = [] self.outputs = [] self.numberOfNeurons = число нейронов self.numberOfInputs = количество входов self.initialiseWeightsAndBiases() для меня в диапазоне (0,numberOfNeurons): self.neurons.append(Neuron(self.weights, self.biases)) def инициализироватьWeightsAndBiases(self): self.weights = 2 * random.random((self.numberOfInputs, self.numberOfNeurons)) - 1 self.biases = 2 * random.random((1, self.numberOfNeurons)) - 1 защита вперед (я, входы): self.outputs = np.array([]) для меня в self.neurons: self.outputs = np.append(self.outputs, i.compute(inputs)) класс Нейронная сеть: def __init__(self, слои): self.layers = слои Защиту впередPass (сам, входы): для i в диапазоне (0,len(слои)): если я == 0: слои.forward(входы) еще: слои.forward(слои[i-1].выходы) вернуть слои[-1].выходные данные Защиту вычислитьError (сам, предсказанные выходы, trueOutputs): ошибка = (trueOutputs — предсказанные выходные данные) * предсказанные выходные данные * (1 — предсказанные выходные данные) ошибка возврата def trainNetwork(self, TrainingDataInputs, TrainingDataOutputs, NumberOfIterations): #инициализируем лучшие веса случайными значениями для y в диапазоне (0, NumberOfIterations): предсказанныеOutputs = self.forwardPass(trainingDataInputs) ошибка = self.calculateError(predictedOutputs, TrainingDataOutputs) для i в слоях[0].нейроны: i.weights += np.dot(trainingDataInputs.T, error.T) Защиту VisualiseNetwork (сам): проходить #Layer(числонейронов, числовходов) входной слой = слой (1, 3) слои = [входной слой] сеть1 = Нейронная сеть (слои) inputTrainingData = np.array([[0, 0, 1], [1, 1, 1], [1, 0, 1], [0, 1, 1]]) выходные данные обучения = [[0, 1, 1, 0]] network1.trainNetwork(inputTrainingData, outputTrainingData, 10000) выходные данные = network1.forwardPass([[0,1,1]]) печать (выходы)
Я реализую нейронную сеть с нуля, используя Python. У меня есть класс Neuron, класс слоя и класс сети.
Мне удалось обучить и использовать сеть с 1 слоем, 1 нейроном и 3 входами.
Теперь я хочу попробовать использовать 2 или более слоев, оба с произвольным количеством нейронов. Моя проблема в том, как мне теперь изменить функцию «обучение», чтобы обучить такую сеть?
В настоящее время, если уровень равен 0, он будет вводить сетевые входы в нейроны. Если уровень выше 0, он будет вводить выходные данные предыдущего слоя.
Но что мне делать дальше?
Я использовал код ниже:
импортировать numpy как np из опыта импорта numpy, случайный импорт математики из sklearn.datasets импортируйте make_blobs импортировать matplotlib.pyplot как plt np.random.seed(1) класс Нейрон: def __init__(self, веса, смещение): self.weights = веса self.bias = предвзятость Защиту сигмоида (я, х): выход = 1/(1+exp(-x)) обратный вывод def вычислить(сам, входы): self.output = self.sigmoid(np.dot(inputs, self.weights) + self.bias) вернуть собственный вывод слой класса: def __init__(self, NumberOfNeurons, NumberOfInputs): self.neurons = [] self.outputs = [] self.numberOfNeurons = число нейронов self.numberOfInputs = количество входов self.initialiseWeightsAndBiases() для меня в диапазоне (0,numberOfNeurons): self.neurons.append(Neuron(self.weights, self.biases)) def инициализироватьWeightsAndBiases(self): self.weights = 2 * random.random((self.numberOfInputs, self.numberOfNeurons)) - 1 self.biases = 2 * random.random((1, self.numberOfNeurons)) - 1 защита вперед (я, входы): self.outputs = np.array([]) для меня в self.neurons: self.outputs = np.append(self.outputs, i.compute(inputs)) класс Нейронная сеть: def __init__(self, слои): self.layers = слои Защиту впередPass (сам, входы): для i в диапазоне (0,len(слои)): если я == 0: слои.forward(входы) еще: слои.forward(слои[i-1].выходы) вернуть слои[-1].выходные данные Защиту вычислитьError (сам, предсказанные выходы, trueOutputs): ошибка = (trueOutputs — предсказанные выходные данные) * предсказанные выходные данные * (1 — предсказанные выходные данные) ошибка возврата def trainNetwork(self, TrainingDataInputs, TrainingDataOutputs, NumberOfIterations): #инициализируем лучшие веса случайными значениями для y в диапазоне (0, NumberOfIterations): предсказанныеOutputs = self.forwardPass(trainingDataInputs) ошибка = self.calculateError(predictedOutputs, TrainingDataOutputs) для i в слоях[0].нейроны: i.weights += np.dot(trainingDataInputs.T, error.T) Защиту VisualiseNetwork (сам): проходить #Layer(числонейронов, числовходов) входной слой = слой (1, 3) слои = [входной слой] сеть1 = Нейронная сеть (слои) inputTrainingData = np.array([[0, 0, 1], [1, 1, 1], [1, 0, 1], [0, 1, 1]]) выходные данные обучения = [[0, 1, 1, 0]] network1.trainNetwork(inputTrainingData, outputTrainingData, 10000) выходные данные = network1.forwardPass([[0,1,1]]) печать (выходы)