简单神经网络优化

ε祈祈猫儿з 提交于 2019-11-25 21:24:35
#!/bin/env python3
# -*-coding:utf-8-*-
# InputNeuron.py

class InputNeuron:
    index = 1
    index_all = 1

    def __init__(self, index, index_all):
        self.index = index
        self.index_all = index_all

    def __str__(self):
        return f"[index:{round(self.index,2)},index_all:{self.index_all}]"

#!/bin/env python3
# -*-coding:utf-8-*-
# hiddenNeuron.py

from decimal import Decimal


class HiddenNeuron:
    thet = Decimal(0)
    hidden_val = -1
    index = 1
    index_all = 1

    def __init__(self, thet, index, index_all):
        self.thet = thet
        self.index = index
        self.index_all = index_all

    def __str__(self):
        return f"[thet:{self.thet}, index:{self.index}, index_all:{self.index_all}]"


#!/bin/env python3
# -*-coding:utf-8-*-
# outputNeuron.py

from kubernetes.HiddenNeuron import HiddenNeuron


class OutputNeuron(HiddenNeuron):

    def __init__(self, thet, index, index_all):
        HiddenNeuron.__init__(self, thet, index, index_all)
        
#!/bin/env python3
# -*-coding:utf-8-*-
#triNeuron.py

import math

from kubernetes.HiddenNeuron import HiddenNeuron
from kubernetes.InputNeuron import InputNeuron
from kubernetes.OutputNeuron import OutputNeuron


class TriNeuron:

    input_neurons = dict()
    hidden_neurons = dict()
    output_neurons = dict()
    alpha = 0.1
    beta = 0.95

    training_set = []
    weights = dict()

    def __init__(self, training_set, weights, input_neurons, hidden_neurons, output_neurons, learning_speed=0.1, beta=1.0001):
        self.alpha = learning_speed
        self.beta = beta
        self.training_set = training_set
        self.weights = weights
        self.input_neurons = input_neurons
        self.hidden_neurons = hidden_neurons
        self.output_neurons = output_neurons


    def training(self):

        done = False
        times = 0

        delta_weight_13_last = 0
        delta_weight_14_last = 0
        delta_weight_35_last = 0
        delta_weight_45_last = 0
        delta_weight_23_last = 0
        delta_weight_24_last = 0

        while not done:
            times = times + 1
            for set in self.training_set:
                y3 = self.sigmoid(set[0] * self.weights[1][3] + set[1] * self.weights[2][3] - self.hidden_neurons[3].thet)
                y4 = self.sigmoid(set[0] * self.weights[1][4] + set[1] * self.weights[2][4] - self.hidden_neurons[4].thet)
                y5 = self.sigmoid(y3 * self.weights[3][5] + y4 * self.weights[4][5] - self.output_neurons[5].thet)

                e = set[2] - y5

                if e ** 2 <= 0.001:
                    done = True
                    break

                error_gradient_5 = y5 * (1 - y5) * e

                if delta_weight_35_last == 0:
                    delta_weight_35_last = delta_weight_35 = self.alpha * y3 * error_gradient_5
                else:
                    delta_weight_35_last= delta_weight_35 = self.beta * delta_weight_35_last + self.alpha * y3 * error_gradient_5

                if delta_weight_45_last == 0:
                    delta_weight_45_last = delta_weight_45 = self.alpha * y4 * error_gradient_5
                else:
                    delta_weight_45_last = delta_weight_45 = self.beta * delta_weight_45_last + self.alpha * y4 * error_gradient_5

                delta_thet_5 = self.alpha * -1 * error_gradient_5

                error_gradient_3 = y3 * (1 - y3) * error_gradient_5 * self.weights[3][5]

                if 0 == delta_weight_13_last:
                    delta_weight_13_last = delta_weight_13 = self.alpha * set[0] * error_gradient_3
                else:
                    delta_weight_13_last = delta_weight_13 = self.beta * delta_weight_13_last + self.alpha * set[0] * error_gradient_3

                if 0 == delta_weight_23_last:
                    delta_weight_23_last = delta_weight_23 = self.alpha * set[1] * error_gradient_3
                else:
                    delta_weight_23_last = delta_weight_23 = self.beta * delta_weight_23_last + self.alpha * set[1] * error_gradient_3

                delta_thet_3 = self.alpha * -1 * error_gradient_3

                error_gradient_4 = y4 * (1 - y4) * error_gradient_5 * self.weights[4][5]

                if 0 == delta_weight_14_last:
                    delta_weight_14_last = delta_weight_14 = self.alpha * set[0] * error_gradient_4
                else:
                    delta_weight_14_last = delta_weight_14 = self.beta * delta_weight_14_last + self.alpha * set[0] * error_gradient_4

                if 0 == delta_weight_24_last:
                    delta_weight_24_last = delta_weight_24 = self.alpha * set[1] * error_gradient_4
                else:
                    delta_weight_24_last = delta_weight_24 = self.beta * delta_weight_24_last + self.alpha * set[1] * error_gradient_4


                delta_thet_4 = self.alpha * -1 * error_gradient_4

                self.weights[1][3] = self.weights[1][3] + delta_weight_13
                self.weights[1][4] = self.weights[1][4] + delta_weight_14
                self.weights[2][3] = self.weights[2][3] + delta_weight_23
                self.weights[2][4] = self.weights[2][4] + delta_weight_24
                self.weights[3][5] = self.weights[3][5] + delta_weight_35
                self.weights[4][5] = self.weights[4][5] + delta_weight_45

                self.hidden_neurons[3].thet = self.hidden_neurons[3].thet + delta_thet_3
                self.hidden_neurons[4].thet = self.hidden_neurons[4].thet + delta_thet_4
                self.output_neurons[5].thet = self.output_neurons[5].thet + delta_thet_5
        else:
            print()
            print("training times:" + str(times))
            print()

    def do_predict(self, sample):
        y3 = self.sigmoid(sample[0] * self.weights[1][3] + sample[1] * self.weights[2][3] - self.hidden_neurons[3].thet)
        y4 = self.sigmoid(sample[0] * self.weights[1][4] + sample[1] * self.weights[2][4] - self.hidden_neurons[4].thet)
        y5 = self.sigmoid(y3 * self.weights[3][5] + y4 * self.weights[4][5] - self.output_neurons[5].thet)
        return y5

    @staticmethod
    def sigmoid(x):
        return 1/(1+math.exp(-x))

    def __str__(self):
        return ''


if __name__ == '__main__':

    training_set = [(1, 1, 0), (0, 0, 0), (0, 1, 1), (1, 0, 1)]
    weights = {1: {3: 0.5, 4: 0.9}, 2: {3: 0.4, 4: 1.0}, 3: {5: -1.2}, 4: {5: 1.1}}

    input_neurons = dict()
    input_neurons[1] = InputNeuron(0, 1)
    input_neurons[2] = InputNeuron(1, 2)

    hidden_neurons = dict()
    hidden_neurons[3] = HiddenNeuron(0.8, 0, 3)
    hidden_neurons[4] = HiddenNeuron(-0.1, 1, 4)

    output_neurons = dict()
    output_neurons[5] = OutputNeuron(0.3, 0, 5)
    triNeuron = TriNeuron(training_set, weights, input_neurons, hidden_neurons, output_neurons)

    triNeuron.training()
    print()
    print('do predict')

    print(triNeuron.do_predict((0, 0)))
    print(triNeuron.do_predict((0, 1)))
    print(triNeuron.do_predict((1, 0)))
    print(triNeuron.do_predict((1, 1)))


易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!