Skip to content

Instantly share code, notes, and snippets.

@proxyanon
Created July 31, 2018 03:00
Show Gist options
  • Save proxyanon/2698fd2ac0e54fdbc619be0f441e2eb3 to your computer and use it in GitHub Desktop.
Save proxyanon/2698fd2ac0e54fdbc619be0f441e2eb3 to your computer and use it in GitHub Desktop.
Neural Network Implementation (Simple)
#-*-coding: utf8-*-
''' Neural Network Implementation '''
# @author Daniel Victor Freire Feitosa
# @copyrigths by Daniel Victor Freire Feitosa 2018
# @license GPL 3.0
from numpy import exp, dot, array, random
def sigmoid(x):
return 1 / (1 + exp(-x))
def sigmoid_derivate(x):
return x * (1 - x)
class NeuralNetwork:
def __init__(self, inputSize, hiddenSize, outputSize):
self.inputSize = inputSize # quantidade de entradas
self.hiddenSize = hiddenSize # quantidade de neurononios na camada hidden
self.outputSize = outputSize # quantidade da camda de saida
self.pesos_1 = 2 * random.random((self.inputSize, self.hiddenSize)) - 1 # pesos da camada de entrada para a hidden
self.pesos_2 = 2 * random.random((self.hiddenSize, self.outputSize)) - 1 # pesos da camada hidden para a saida
def feedfoward(self, entradas): # feedfoward = entradas * pesos [ z(I, W) = Iij * Wij ]
self.layer1 = sigmoid(dot(entradas, self.pesos_1)) # camada hidden
layer2 = sigmoid(dot(self.layer1, self.pesos_2)) # saida
return layer2
def backpropagation(self, entradas, saidas, eta): # backpropagation
layer2 = self.feedfoward(entradas) # saida
layer2_error = saidas - layer2 # erro da camada de saida para a hidden [ Error(x) = target - x ]
layer2_delta = layer2_error * sigmoid_derivate(layer2) # delta da camada de saida para a hidden [ Delta1 = Error * Derivate(x) ]
layer1_error = layer2_delta.dot(self.pesos_2.T) # erro da camada hidden para a entrada [ Error(x) = Delta1 * Wij2 ]
layer1_delta = layer1_error * sigmoid_derivate(self.layer1) # delta da camda hidden para a entrada [ Delta2 = Error * Derivate(x) ]
self.pesos_2 += self.layer1.T.dot(layer2_delta) * eta # pesos da camada de saida para a hidden ajustados
self.pesos_1 += entradas.T.dot(layer1_delta) * eta # pesos da camada hidden para a entrada ajustados
def train(self, entradas, saidas, entrada, epochs=10000, eta=1.0):
for i in xrange(epochs): # treino
self.backpropagation(entradas, saidas, eta) # faz o backprop para ajuste dos pesos
return self.feedfoward(entrada) # faz o feedfoward da entrada
''' Entradas (horas_estudadas, horas_dormidas, irrelevante=0) '''
entradas = array([
[0.2, 0.8, 0.0],
[1.0, 0.6, 0.0],
[0.4, 0.8, 0.0]
])
''' Saidas (notas_provas) '''
saidas = array([
[0.3],
[0.9],
[0.5]
])
''' Entrada (10 horas etudadas, 9 horas dormidas) '''
entrada = array([1.0, 0.9, 0.0])
''' NeuralNetwork 3 entradas, 50 neuronios na camada hidden, 1 saida '''
nn = NeuralNetwork(3, 50, 1)
print nn.train(entradas=entradas, saidas=saidas, entrada=entrada, epochs=10000, eta=1.0)
# epochs => quantidade de vezes de ajuste de pesos
# eta => taxa de aprendizado
# 0.0 => 0
# 0.1 => 1
# (assim por diante)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment