МЛ выход либо взрывается до бесконечности, либо не меняется - PullRequest
0 голосов
/ 30 октября 2018

Как указано выше, я пытался написать свою первую программу ML (?) С нуля.

Это простая программа типа "классификатор", но я не могу понять, что не так. Может ли кто-нибудь помочь, пожалуйста, взгляните на код?

import numpy as np

class Perceptron:
    def __init__(self, input_nodes, hidden_nodes, output_nodes, bias = None):
        self.input_nodes = input_nodes
        self.hidden_nodes = hidden_nodes
        self.output_nodes = output_nodes
        self.bias = bias
        self.hidden_weights = self.weight_creation(self.hidden_nodes, self.input_nodes)
        self.output_weights = self.weight_creation(self.output_nodes, self.hidden_nodes)
        self.learning_Rate = 0.1


    def weight_creation(self, layer_size, previous_layer_size):
        bias_node = 1 if self.bias else 0
        return np.random.randn(layer_size, previous_layer_size + bias_node) * np.sqrt(2 / previous_layer_size)


    @staticmethod
    def activation_function(entity):
        return np.maximum(0.0 * entity, entity)


    @staticmethod
    def step(entity):
        # Basically the derivative of the ReLU function
        return np.where(entity > 0.5, 1, 0)


    def run(self, input_one, input_two, answer):
        # preparation of input_vector
        bias_node = 1 if self.bias else 0
        input_vector = np.array((input_one, input_two))
        if self.bias:
            input_vector = np.concatenate((input_vector, [self.bias]))
        input_vector = np.array(input_vector, ndmin=2).T
        layer_one_input = np.dot(self.hidden_weights, input_vector)
        layer_one_output = self.activation_function(layer_one_input)
        # calculation of output_vector
        layer_two_basic = layer_one_output
        if self.bias:
            layer_two_basic = np.concatenate((layer_one_output, [[self.bias]]))
        layer_two_input = np.dot(self.output_weights, layer_two_basic)
        output = self.activation_function(layer_two_input)
        print(output)


        # calculation and updating of errors
        '''Initial Calculation'''
        error = output - answer
        print('\n\n Error: ')
        print(error)
        layer_two_error = np.dot(self.step(layer_two_input), error)
        '''Layer One Weight Error Updating'''
        layer_one_calculation = np.dot(layer_two_error, self.output_weights)
        layer_one_calculation = np.dot(self.step(layer_one_input), layer_one_calculation)
        if self.bias:
            layer_one_calculation = layer_one_calculation.T[:-1, :]
        layer_one_calculation = np.dot(layer_one_calculation, input_vector)
        self.hidden_weights += self.learning_Rate * layer_one_calculation
        '''Layer Two Weight Error Updating'''
        self.output_weights += self.learning_Rate * np.dot(layer_two_basic, layer_two_error).T
        print(layer_two_error)
        print(self.hidden_weights)


percy = Perceptron(2, 3, 1, bias=1)


while True:
    input_one = int(input('First Number: '))
    input_two = int(input('Second Number: '))
    answer = int(input('Answer: '))
    percy.run(input_one, input_two, answer)

Я использую функцию активации ReLU вместе с инициализацией He et al.

Я выполнил несколько объяснений относительно обновления весов, но в настоящее время проблемы, с которыми я сталкиваюсь, включают:

  1. Вес не обновляется

  2. Выход взрыва на инф

Вот источники, которые я изучал относительно обновления весов:

https://datascience.stackexchange.com/questions/19272/deep-neural-network-backpropogation-with-relu?newreg=2d400fb705ec404496984d2d3d74c431

https://www.python -course.eu / neural_networks_backpropagation.php

Любая помощь будет принята с благодарностью!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...